環境ubuntu 16.04 python3
1.pycall.c
#include #include struct test
;//傳遞數值
int valtest(int n)
//傳遞字串
int strtest(char* pval)
//傳遞結構體
int structtest(struct test data)
//傳遞結構體指標
int pointtest(struct test* pdata)
//傳遞陣列
int sztest(int a, int nlen)
printf("\n");
return 0;
}
2.pycall.py
# -*- coding: utf8 -*-
import ctypes
from ctypes import *
print ('*' * 20)
print ("傳遞數字")
func = ctypes.cdll.loadlibrary("./pycall.so")
func.valtest(2)
print ('*' * 20)
print ("傳遞字串")
val = bytes('qqqqqq',encoding='utf-8')
func.strtest(val)
print ('*' * 20)
print ("傳遞結構體")
class teststruct(structure):
_fields_=[('key',c_int),('val',c_char_p)]
s = teststruct()
s.key = 1
s.val = bytes('test',encoding='utf-8');
func.structtest(s)
print ('*' * 20)
print ("傳遞結構體指標")
func.pointtest(byref(s))
print ('*' * 20)
print ("傳遞陣列")
input = c_int * 10
data = input()
for i in range(10):
data[i] = i
func.sztest(data,len(data))
print ('*' * 20)
3.makefile
#compliler used
cc = gcc
ar = ar cru
#so flag
share = -shared -fpic
target = pycall
#exe pgm and lib
all: $
#make rule
$: $(cc) [email protected] $(share) $^ -o [email protected]
clean:
rm -f $.so
4.結果
c 函式呼叫引數傳遞
在c 中,引數傳遞的方式是 實虛結合 按值傳遞 pass by value 位址傳遞 pass by pointer 引用傳遞 pass by reference 按值傳遞的過程為 首先計算出實參表示式的值,接著給對應的形參變數分配乙個儲存空間,該空間的大小等於該形參型別的,然後把以求出的實參表示式...
c 平台呼叫 傳遞引數
最近做專案用到了dll,網上介紹了很多,但是真要自己實現起來確實也費了不少功夫,這裡有自己基礎不紮實的原因,也有客觀原因,比如平台呼叫中,好多細節問題如果注意不到,就會得到錯誤的答案。下面是些我寫的一些小測試程式 code 1 str為輸入引數,outstr為輸出引數 2char strtest c...
python 引數傳遞 Python 引數傳遞
python中的變數 乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條 1.如果函式內部有global語句,那麼它宣告的變數是全域性的。2.如果函式內部有對變數的賦值語句,那麼它是局域的。3.除此之外都是全域性的。注意1...