From c3b92c920dd1060e9ab00678d0c7c88cc6dbbbb0 Mon Sep 17 00:00:00 2001
From: David Hendriks <davidhendriks93@gmail.com>
Date: Thu, 31 Oct 2019 10:19:01 +0000
Subject: [PATCH] updated ctypes attempt. next step is trying to figure out how
 to pass a pointer through something via something

---
 ctypes/compile.sh                  |   2 ++
 ctypes/libmean.so.1                | Bin 0 -> 7528 bytes
 ctypes/main.py                     |  28 +++++++++++++++++
 ctypes/mean.c                      |   5 +++
 ctypes/mean.h                      |   3 ++
 python-c-api_solution/demomodule.c |  47 +++++++++++++++++++++++++++--
 6 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 ctypes/compile.sh
 create mode 100755 ctypes/libmean.so.1
 create mode 100644 ctypes/main.py
 create mode 100644 ctypes/mean.c
 create mode 100644 ctypes/mean.h

diff --git a/ctypes/compile.sh b/ctypes/compile.sh
new file mode 100644
index 0000000..736d146
--- /dev/null
+++ b/ctypes/compile.sh
@@ -0,0 +1,2 @@
+# Compile a shared library
+gcc -shared -o libmean.so.1 mean.c
\ No newline at end of file
diff --git a/ctypes/libmean.so.1 b/ctypes/libmean.so.1
new file mode 100755
index 0000000000000000000000000000000000000000..1ede0ce64eb59a8cf19dfffde096fbdf7fe4c32d
GIT binary patch
literal 7528
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

literal 0
HcmV?d00001

diff --git a/ctypes/main.py b/ctypes/main.py
new file mode 100644
index 0000000..d5549a5
--- /dev/null
+++ b/ctypes/main.py
@@ -0,0 +1,28 @@
+# 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
+
+import ctypes
+import os
+import subprocess 
+  
+def buildLibrary(): 
+  
+    # store the return code of the c program(return 0) 
+    # and display the output 
+    s = subprocess.check_call("bash compile.sh", shell=True) 
+    print("return code:\n{}".format(s)) 
+
+buildLibrary()
+
+
+libmean = ctypes.CDLL("libmean.so.1") # loads the shared library
+libmean.mean.restype = ctypes.c_double # define mean function return type
+print(libmean.mean)
+print(libmean.mean(ctypes.c_double(10), ctypes.c_double(3))) # call mean function needs cast arg types
+libmean.mean.argtypes = [ctypes.c_double, ctypes.c_double] # define arguments types
+print(libmean.mean(10, 3)) # call mean function does not need cast arg types
+print(type(libmean.mean(10, 5)))
\ No newline at end of file
diff --git a/ctypes/mean.c b/ctypes/mean.c
new file mode 100644
index 0000000..12d80b0
--- /dev/null
+++ b/ctypes/mean.c
@@ -0,0 +1,5 @@
+#include "mean.h"
+
+double mean(double a, double b) {
+  return (a+b)/2;
+}
\ No newline at end of file
diff --git a/ctypes/mean.h b/ctypes/mean.h
new file mode 100644
index 0000000..a52ef61
--- /dev/null
+++ b/ctypes/mean.h
@@ -0,0 +1,3 @@
+
+// Returns the mean of passed parameters
+double mean(double, double);
\ No newline at end of file
diff --git a/python-c-api_solution/demomodule.c b/python-c-api_solution/demomodule.c
index 1657aca..d323623 100644
--- a/python-c-api_solution/demomodule.c
+++ b/python-c-api_solution/demomodule.c
@@ -32,6 +32,30 @@ static PyObject *DemoLib_MakeStr(PyObject *self, PyObject *args) {
     return Py_BuildValue("s", result);
 }
 
+
+static PyObject *DemoLib_AddNumberWithPointer(PyObject *self, PyObject *args) {
+    int *number_1;
+    int *number_2;
+    if (!PyArg_ParseTuple(args, "ii", &number_1, &number_2)) {
+        return NULL;
+    }
+    
+    int result;
+    int (*pf) (int, int);
+    pf = &add_number;
+    result = add_number_using_pointer(pf, number_1, number_2);
+    return Py_BuildValue("i", result);
+}
+
+
+
+
+
+
+
+
+
+
 // module's function table
 static PyMethodDef DemoLib_FunctionsTable[] = {
     {
@@ -39,16 +63,35 @@ static PyMethodDef DemoLib_FunctionsTable[] = {
         DemoLib_AddNumber, // C wrapper function
         METH_VARARGS, // received variable args (but really just 1)
         "adds two numbers" // documentation
-    }, {
+    }, 
+
+
+    {
+        "add_number_with_pointer", // name exposed to Python
+        DemoLib_AddNumberWithPointer, // C wrapper function
+        METH_VARARGS, // received variable args (but really just 1)
+        "adds two numbers via a pointer function" // documentation
+    }, 
+
+
+    {
         "make_str", // name exposed to Python
         DemoLib_MakeStr, // C wrapper function
         METH_VARARGS, // received variable args (but really just 1)
         "adds two strings" // documentation
-    }, {
+    }, 
+
+
+    {
         NULL, NULL, 0, NULL
     }
 };
 
+
+
+
+
+
 // modules definition
 static struct PyModuleDef DemoLib_Module = {
     PyModuleDef_HEAD_INIT,
-- 
GitLab