python 呼叫C 常用引數傳遞

2021-08-14 12:19:50 字數 1674 閱讀 4847

環境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...