From c230691f2c8f2d3be15da55657915e4c29288b5f Mon Sep 17 00:00:00 2001 From: David Hendriks <davidhendriks93@gmail.com> Date: Tue, 5 Nov 2019 21:31:40 +0000 Subject: [PATCH] Cleaned up code of ctypes_and_api. will serve as the example for the implementation in the python-binaryc --- .../__pycache__/functions.cpython-36.pyc | Bin 653 -> 653 bytes ctypes_and_api/demolib.c | 33 ++++++----------- ctypes_and_api/demolib.h | 6 +--- ctypes_and_api/demomodule.c | 34 ++++-------------- ctypes_and_api/libmean.so.1 | Bin 7984 -> 7960 bytes ctypes_and_api/main.py | 30 +++++++++++----- ctypes_and_api/mean.c | 25 +++++++------ ctypes_and_api/mean.h | 5 ++- ctypes_and_api/readme.org | 19 +++++----- 9 files changed, 63 insertions(+), 89 deletions(-) diff --git a/ctypes_and_api/__pycache__/functions.cpython-36.pyc b/ctypes_and_api/__pycache__/functions.cpython-36.pyc index 5427d3f43ca347265356eea27b4a32d18b28153d..39e4e0bd6bcb1d9f2feb55439462d01ca74f9f3e 100644 GIT binary patch delta 69 zcmeBW?PcXO=H=yjdgfrP$41Uuj8eB)a#IuYZgC{Xm*r=s#24IRElbQPP1R(&HTf^2 ZH75%jGZ&W-Uy<-+M<z)|;mOfVMgT}N6|evR delta 69 zcmeBW?PcXO=H=yLIdU-8b|dF4MyV*4+|<OpTO7&pW%-#Y@ddY7%Mx=+Q#F~QCjVu$ Z=44`H=He3KD-xXS$Rx=qI60ch2mt9~6Se>V diff --git a/ctypes_and_api/demolib.c b/ctypes_and_api/demolib.c index 0d4af8c..1466aeb 100644 --- a/ctypes_and_api/demolib.c +++ b/ctypes_and_api/demolib.c @@ -1,36 +1,23 @@ #include <stdio.h> -#include <string.h> #include <stdlib.h> #include "demolib.h" - typedef double (*fn_def)(double, double); -int add_number_using_pointer(int (*pf)(int, int), int number_1, int number_2) { - int result; - result = pf(number_1, number_2); - return result; -} - -double calc_mean_using_pointer(long int str_1, double number_1, double number_2) +double run_function_via_pointer(long int str_1, double number_1, double number_2) { - printf("test for running function with mem addr %ld with arguments %f %f\n", str_1, number_1, number_2); - + // Function that recieves a long int containing the memory adress of a function, and two values + // the long int will be interpreted as a pointer, and the two values will be passed to this function + // will work as long as the function of which the memory adress is given accepts two doubles and returns a double + // convert into pointer fn_def fnptr = (fn_def)str_1; - printf("size of function pointer %zu\n",sizeof(fnptr)); - printf("%p size: %zu\n", fnptr, sizeof(fnptr)); - - double result; - result = fnptr(number_1, number_2); + // print some stuff + // printf("test for running function with mem addr %ld with arguments %f %f\n", str_1, number_1, number_2); + // printf("size of function pointer %zu\n",sizeof(fnptr)); + // printf("%p size: %zu\n", fnptr, sizeof(fnptr)); + double result = fnptr(number_1, number_2); return result; -} - -double test_func(char* str_1, double number_1, double number_2) { - // double result; - // result = pf(number_1, number_2); - printf("test for running function with mem addr %s with arguments %f %f\n", str_1, number_1, number_2); - return 6.5; } \ No newline at end of file diff --git a/ctypes_and_api/demolib.h b/ctypes_and_api/demolib.h index 8059060..454ab2d 100644 --- a/ctypes_and_api/demolib.h +++ b/ctypes_and_api/demolib.h @@ -1,5 +1 @@ -// Example header file - -// char construct_string(int number); -double calc_mean_using_pointer(long int str_1, double number_1, double number_2); -double test_func(char* str_1, double number_1, double number_2); \ No newline at end of file +double run_function_via_pointer(long int str_1, double number_1, double number_2); \ No newline at end of file diff --git a/ctypes_and_api/demomodule.c b/ctypes_and_api/demomodule.c index 90914d6..91dcaa8 100644 --- a/ctypes_and_api/demomodule.c +++ b/ctypes_and_api/demomodule.c @@ -2,48 +2,26 @@ #include <Python.h> #include "demolib.h" - -// https://stackoverflow.com/questions/51505391/how-to-parse-void-to-pyobject - -static PyObject *DemoLib_CalcMeanWithPointerTest(PyObject *self, PyObject *args) { - char *str_1; - double number_1; - double number_2; - if (!PyArg_ParseTuple(args, "sdd", &str_1, &number_1, &number_2)) { - return NULL; - } - - double result; - result = test_func(str_1, number_1, number_2); - return Py_BuildValue("d", result); -} - - -static PyObject *DemoLib_CalcMeanWithPointer(PyObject *self, PyObject *args) { +// Declare the function wrapping the python call and the c function +static PyObject *DemoLib_RunFunctionViaPointer(PyObject *self, PyObject *args) { long int str_1; double number_1; double number_2; if (!PyArg_ParseTuple(args, "ldd", &str_1, &number_1, &number_2)) { return NULL; } + // printf("%p contents %ld\n", &str_1, str_1); double result; - printf("%p contents %ld\n", &str_1, str_1); - result = calc_mean_using_pointer(str_1, number_1, number_2); + result = run_function_via_pointer(str_1, number_1, number_2); return Py_BuildValue("d", result); } // module's function table static PyMethodDef DemoLib_FunctionsTable[] = { { - "calc_mean_with_pointer", // name exposed to Python - DemoLib_CalcMeanWithPointer, // C wrapper function - METH_VARARGS, // received variable args (but really just 1) - "Calculate the mean of two values via a pointer function" // documentation - }, - { - "calc_mean_with_pointer_test", // name exposed to Python - DemoLib_CalcMeanWithPointerTest, // C wrapper function + "run_function_via_pointer", // name exposed to Python + DemoLib_RunFunctionViaPointer, // C wrapper function METH_VARARGS, // received variable args (but really just 1) "Calculate the mean of two values via a pointer function" // documentation }, diff --git a/ctypes_and_api/libmean.so.1 b/ctypes_and_api/libmean.so.1 index df6280d836c719bec47c764d75c8a0222edbf955..30b3abef76357932505c706ed356212859736b52 100755 GIT binary patch delta 2089 zcmbVNeN0<b6u-A0&{rvauOEADDfTf%LH=lovPL5WHmVQfLYsh5G?WVKMqEpQ*0^NJ zm_!{CBHKxfAN(`_k@%4?(PYNOL0A-GOeDszKf4%{lFV%2Kg6$k?(2O8aVEyw+<Wf% z`n_}SIrns-?X9+1k2GN>+GsBk;yK?K?zmzpaXKYL(F7FN3Y=oK#v)a;jZQs=l3Y1| zQI-^Lq;MnU{94?xT3NE#rSJ&tulqN^+w6-tZo}s^@Z{H0>*nl7zuZdwzOg-XYar@t z>;HghjW}6YdU&f#in+bBy@|;LoHm??BR|}H?91@V7e8J&{mzHy?t*&_o#rGe9FU++ zm@uf#lgNqW0BH~v-0hAOZXKkGe8%u_be9Nu6K)vfSPnU+HSv?_+SgGo68Rr!32xuV z(VpdKq9zwe2ogq__P{A)Mot||q)BFMIGs%*85znAX32Oi1+}IJq1)s=%3LY_P9bIf zY~*~ycxD56x5Son#8XP5{JS2W7F{mFB~yUrVcjI#3U)>FW~N54nfr!5wkkw@WhrYY zey2`ev#fA%LW(V)psHB^DX#WFJMI{Ng6TK&MI7}nBcGhr9n_iDizw(-XUuOSRUh6_ zr+&(M)oJr#_{Q8|Nig9|OCS7ZRt(e%wH5V^63R#}s7|(S2)OHI9#!ge>o#(QR{Tam z#pNsWCcIE_-<i<1U5XTNIhx<Li;=uK9VsO34Xf%@<T?{v#}GC!oXf0O3*Y`(EHWuN zJRM;Uwi+y>ZF~PRgV|xKowXJANp<q(e}O(TSH>RO#eRli|1Z3eGTc48a9XIla0Fws z@VpF=!NkeI+{r|CIDK4U6{L(LmHMQTNDm>g5^`jZo>$dAlf4#LZ-3W9vC@6;+#kha z6eF8Q`V!I$7#qv+&qx=LK3arBmIo*nv*rF&0~+aNhC1TM`5ew)QLdGLN45B>;fSrm z@KjYL8Z!N9oGl2ZJ*Tq%iL!nU^+R{k!wt!~C<;3!5QS)$UhN{Udfrd87lR1+Zc8J? z+aPNdZ1nKg>@BfGgjjWedSJA=o4yar)!lU-?!gU7##A!Z4>}Lc_5h7S4A&5h+Fzpz zP*J8y@QPPavL(8W6(ovOrWuX15D(NzGV1Cix6z8a7;+hnt0EI{7P%g{gt}@nfK;Zd z8YdEhhn7Kf956Z%LvqOYEy>|Fx=0>69B<GGSa-<YB_1(95~;(D0dGJA>I~x9nw_#& zzc1Z}brwn_v`IK0r<d8~!WHL3h`;5O4Xc%4b-jo|opm+AHJ7Wa6Yuv<%~0j?{Vg<# za@Hh6`&w=<Y`J7_f_v?6l}T83$#|%kTNdUt8*H14qwY=`ipP(qM$+-|Y+@`MkF#c3 zZk+LB=^+x2KR-TRQWN$z;Ht54u}O|l$WSw6JbBD+%o`L!Jewhy@`i;d=c2IY4NH2a zbvh4{FDU5s;DIh*SkUVU{e59ul;6BYA!cww-lqr|F3o^Y6NV+9NWX_zO;FHluLq`T z!qNaQFrA)&^_rk{&;O^@e@GyD)j^jZq5L6O@QZ@p;ytkD4-4i0VGwG=wmfg~c{^s9 Zg|s+Oo1yeQSid_g9F$A>-@>~H`~~d5(7ylx delta 2208 zcmZ`*eP~lx6u&ng?Mv4t?<K7-X`+3Rb*B19Q&ty0Ru`Swo~*?wl&PD(WNl-Dnx^fG zv!GV3+pMKbJs^%b=-3|$V-V>dvt!V1imZ%{mTgej29+_$h6CHNk-;=O_kGk-^uoQr zdp_@Z=bn3#D_ingE_j8!ooFMf0|{Sjh;03j(<u`Pku(OywG1cc)JQ~0+n6X>bbjdK zN21_0l)Q$L_u`b|<_yn|5H`^R!6!K^vJ-I>VVu^r+S?Cty9>`pHng{GIsI3|C)4Ni zXPMNBlZ9o5cW!b6joP*~FrEWv70zw3AMbts>!sr-uFl{6K^1?7r!Cv<2^6>?K|OHF zA`grr#gi2z#7nq)G{$ht6On|M@lPV(O)AL)b`FlXwi1#;Wc;5D{%V7N4Uzd-?!RBx zuO;UVgI$IJuL&F^4hgGB<Ir!-HfMX&88t~XP_o@fboDA~w{oN_ks%$4!yVdA$@Qf( z2Tl1U+q2MY^X{OSq03qj`T@DxG^WQwZW`yA*J#`kIc3Ddo7ZgUMd5v0op079X*5$Z zu1TZkV8$j^6_!Y!f?sU=I&&2gk>8$FEv0FB@HTf#Q)WwP{TURM>d)fps*B=|(JYJP z_qh^|`rSw;FE9oh@<>Y$GTP-4dm2&RSd@o;Q+@KVy#hY4hqxxj99h2>zOhS|83+7n zuWz{PkO;{&%7ZP}*sh&fRLa9GUm;a!!7~anE_dwXu(|A+0cpV{#EQ7I-CuC=vHS9H zteA9#zLtk#1;!{~2%ljjH(9+GzI|9KF)kYHi7|t!b(oI@*MTpmZn1+fFbf_d58Xkt zQD%md6fUFLh5fq5;JvUsbOL<~vAG4;fY3I}9L~za?Q?i`K|i~FnlYzK(@EKNauQ=H zvbYd+J~~&Kb9NVnO=e6}EYI@bJ#J~vS)Jq#CseEvi4~6YR$5I-^+_p_=|mVHMqx>6 zw=PfSG97BVJ0pdTrV~<!)Y0A9)v!sb&sLy!9KBtAxx=c|o6BSteJ<K)&X;&pQ(clN zL?21r1zV%kZ{6HX;Jfm&)yE!`O0OdC3gR)uGb~+*-y`M`|9%Mnl&_@{1i3Xwyr{$> z(;NZZyn*u%<ZG{KtCN4n@?uq)rM0pg6`A}vPCq)+o~J3_uZcDJRg|wpc^r|La?9(L z<#1Q<d_2wBcbM-ZYP=Kk6|gtPMx_oUZuD5zhuDah>*&*gaIn`|M|tRX?xeS2%DFQr z8y1ElIcL*V&2OB9jjlSHg1xx5Lci->$Wo4af$}1~3_gAWx$}IDwTz??MS4!7I3hz( zV4Wl=)L1LXDcFV7s76(iJe(Fp$O|j1PLhQiDB<u+YpgtpA~H&F*I3<zM-+i~udr5= zS=j1+kLF><E&A>oF&iI6g1E6@4x&Ikjres<9?@rJ%+z76j}iehknp@ri!8J7g{K+6 zWZolMI1VbRk7Br|tJnD+*HK@=j7zM4(|s^sEw(90Kd!^RgnVYdyulta_{%%^;G*9T zVONdl7}xZ$5s&rMY^QCHZ@!9h@JM$?=~ENEs-h63E7M67<;}i6o%N*V3=`IdF{c=# zu*W-x*WY9DK&vm{Xf>|96?%LTN6Mg5aKjf7%yKYs68`lyI?SSxp{X|FFpDk@J+%=C z`FXfm8+MEumoy6VwUNaifAdekr?AoA2-i{fm_ICJjp{S;3XJ<3E0+9nFZiExM2(V+ zLQ^2(So{Tno<IarfiTPlc({(U7zlgKUyNCoe*Yn(3?LW~$6i~RpmYMpS4HRxFu!We E|N7SNGynhq diff --git a/ctypes_and_api/main.py b/ctypes_and_api/main.py index b3af562..4a13c6b 100644 --- a/ctypes_and_api/main.py +++ b/ctypes_and_api/main.py @@ -1,22 +1,34 @@ import ctypes import os import subprocess - -from functions import loadLibraryFunction, buildLibrary - -import demo +import demo # load library with the C-interfacing +from functions import loadLibraryFunction, buildLibrary +# Build shared library buildLibrary() -# Loading library +# Loading shared library libmean = ctypes.CDLL("libmean.so.1") # loads the shared library # Get memory adress of function. mimicking a pointer -mem = ctypes.cast(libmean.mean, ctypes.c_void_p).value -print("mem adress of mean function {}, type: {}".format(mem, type(mem))) +mem_mean_function = ctypes.cast(libmean.mean, ctypes.c_void_p).value +print("mem adress of mean function {}, type: {}".format(mem_mean_function, type(mem_mean_function))) + +mem_product_function = ctypes.cast(libmean.product, ctypes.c_void_p).value +print("mem adress of product function {}, type: {}".format(mem_product_function, type(mem_product_function))) + +mem_sum_function = ctypes.cast(libmean.sum, ctypes.c_void_p).value +print("mem adress of sum function {}, type: {}".format(mem_sum_function, type(mem_sum_function))) + +print('\n\n') + +result_mean = demo.run_function_via_pointer(mem_mean_function, 10, 2.0) +print("Result of mean: {}\n".format(result_mean)) +result_product = demo.run_function_via_pointer(mem_product_function, 10, 2.0) +print("Result of product: {}\n".format(result_product)) -dong = demo.calc_mean_with_pointer(mem, 1.0, 2.0) -print(dong) \ No newline at end of file +result_sum = demo.run_function_via_pointer(mem_sum_function, 10, 2.0) +print("Result of sum: {}\n".format(result_sum)) diff --git a/ctypes_and_api/mean.c b/ctypes_and_api/mean.c index c8c1d17..0810fe8 100644 --- a/ctypes_and_api/mean.c +++ b/ctypes_and_api/mean.c @@ -3,18 +3,23 @@ #include <stdlib.h> #include <math.h> -double mean(double a, double b) { - printf("calculating mean with %f and %f", a, b); - return (a+b)/2; +double mean(double a, double b) +{ + printf("calculating mean of %f and %f\n", a, b); + double mean = (a+b)/2.0; + return mean; } -void print_pointer_to_mean() { - printf("pointer to mean function (via c code): %p\n", &mean); +double product(double a, double b) +{ + printf("Calculating product of %f and %f\n", a, b); + double product = a * b; + return product; } -double calc_mean_using_pointer(double (*pf)(double, double), double number_1, double number_2) { - double result; - result = pf(number_1, number_2); - printf("result running mean function with pointer to the function: %f", result); - return result; +double sum(double a, double b) +{ + printf("Calculating sum of %f and %f\n", a, b); + double sum = a + b; + return sum; } \ No newline at end of file diff --git a/ctypes_and_api/mean.h b/ctypes_and_api/mean.h index 035946d..c79b117 100644 --- a/ctypes_and_api/mean.h +++ b/ctypes_and_api/mean.h @@ -1,4 +1,3 @@ -// Returns the mean of passed parameters double mean(double, double); -void print_pointer_to_get_value(); -double calc_mean_using_pointer(double (*pf)(double, double), double number_1, double number_2); +double product(double, double); +double sum(double, double); \ No newline at end of file diff --git a/ctypes_and_api/readme.org b/ctypes_and_api/readme.org index e3a32fc..160f434 100644 --- a/ctypes_and_api/readme.org +++ b/ctypes_and_api/readme.org @@ -17,14 +17,11 @@ then run python main.py * Some leads: - -# https://solarianprogrammer.com/2019/07/18/python-using-c-cpp-libraries-ctypes/ -# https://gist.github.com/elyezer/7099291 - -# https://www.geeksforgeeks.org/turning-a-function-pointer-to-callable/ -# https://stackoverflow.com/questions/9420673/is-it-possible-to-compile-c-code-using-python -# https://documentation.help/Python-3.2.1/ctypes.html - -# https://stackoverflow.com/questions/49635105/ctypes-get-the-actual-address-of-a-c-function -# https://blog.regehr.org/archives/1621 -# https://www.oreilly.com/library/view/understanding-and-using/9781449344535/ch01.html \ No newline at end of file +- https://solarianprogrammer.com/2019/07/18/python-using-c-cpp-libraries-ctypes/ +- https://gist.github.com/elyezer/7099291 +- https://www.geeksforgeeks.org/turning-a-function-pointer-to-callable/ +- https://stackoverflow.com/questions/9420673/is-it-possible-to-compile-c-code-using-python +- https://documentation.help/Python-3.2.1/ctypes.html +- https://stackoverflow.com/questions/49635105/ctypes-get-the-actual-address-of-a-c-function +- https://blog.regehr.org/archives/1621 +- https://www.oreilly.com/library/view/understanding-and-using/9781449344535/ch01.html \ No newline at end of file -- GitLab