求,Python的C擴充套件程式中傳遞引數為結構體,怎麼傳遞

2021-03-22 02:14:06 字數 4911 閱讀 8103

1樓:匿名使用者

基於文字文件(markdown) 設想好需要的基本需要的表、欄位、型別;

使用 rails migration 隨著功能的開發逐步建立表;

隨著細節功能的開發、需求,逐步增加欄位,刪除欄位,或者調整欄位型別;

第一個 release 的時候清理 migrations 合併成一個;

隨著後期的改動,逐步增加、修改、刪除欄位或表。

基本上我的所有專案都是這麼搞的,這和專案是否複雜無關。

所以我前面為什麼說思路需要轉變。

python向怎麼向c語言傳遞結構體

2樓:阿達貼

況如下:

打算從python發一個tcp資料包給遠端伺服器,資料的主體是一個c語言的 struct (較大,size 為1402)。由於這個struct太複雜,故不打算在python 處對其重新定義,目前的想法是用python呼叫一個c語言的模組,在這個模組中定義這個struct,並設定好資料後,將其struct傳回python中,再打包傳送伺服器。

但是不知道如何將這個struct 變數從c語言 傳入python中。嘗試用py_buildvalue函式,以為結構體變數

傳遞,但是幾次都得到執行時錯誤:

systemerror: bad format char passed to pybuildvaule。

怎樣在兩個程式間傳遞結構體引數

3樓:匿名使用者

在c語言中用指標傳遞就可以了呀。

struct test;

void func( test *arg)在c++中還可以使用引用

void func (test &obj) ;

各位老闆,python怎麼把c裡面的結構體讀進來

4樓:

1、首先根據圖紙把主、次鋼的鋼材用量計算出來,再就是維護板材的面積。板材安裝時所需的鑽尾螺絲、結構膠等大約用量計算出來。再根據材料**計算出材料成本。

2、根據圖紙的實際結構形式、高度等條件計算出安裝費用。3、材料從廠內運至施工現場的費用。4、稅金、管理費以及安裝時所產生的措施費用、工人的保險費等。

上述四項之和再加上利潤就是工程預算了。

python如何傳遞給c++一個結構體指標?前提是swig封裝的c++函式,請寫出代 100

5樓:匿名使用者

在封裝的**間傳遞指標你要確保他們執行在相同的地址空間裡,還要保證指標指向的記憶體的生存期是安全的,否則這種思路就是錯誤的。實現方法舉例如下:

1、定義了c 結構體和函式如下

typedef struct nameage

nameage , *nameagepointer;

void test(nameagepointer p) // 接收結構體指標

2、python定義結構體如下

#python中結構體定義

class pystruct():

def __init__(self, name, age):

self.name = name

self.age = age

fred = pystruct("fred", 5)

3、假設把第1步裡的test封裝成example模組,python匯入example(既然你都會swig了,這個過程就不囉嗦了)

>>>import example

>>>example.test(pointer(fred))

以上是基本思路,因為搭建開發環境和過程比較繁雜,沒有驗證過,但是應該沒有大問題

python呼叫c++,c++函式返回一個結構體變數給python,python如何接收呢?

6樓:麗江海月客棧

用 ctypes, 接收返回的物件建個類, 類似下面這種:

from ctypes import *

class standgo(structure):

_fields_ = [("x", c_int),("y", c_int)]

接收物件賦值給這個類應該就可以了

具體的看ctypes的文件了,自己試下了

python裡面的函式怎麼按引用傳遞引數

7樓:福喜

如果你用c給matlab寫過mex程式,那

麼這個問題是很容易理解的(好像每次討論python問題時我總是把matlab搬了出來…… 《在matlab中把struct當成python中的dictionary使用》《matlab和python的幾種資料型別的比較》)。

既然提到了mex,就簡單說一下:

一個matlab可能形如

function ret=add3(a,b,c)

如果在c的層面實現這個函式,就會看到另一種景象:

void mexfunction(int nlhs,mxarray * plhs,int nrhs,const mxarray * prhs)

a,b,c三個引數的地址放在一個指標陣列裡,然後把這個指標陣列的首地址作為引數prhs傳遞給函式,這說明matlab函式的引數是傳遞指標的,而不是值傳遞。

縱然是傳遞的指標,但是卻不能在函式裡改變實參的值,因為標記為「const」了。

python是開放原始碼的,我沒有看。所以下面很多東西是猜的。

python在函式的引數傳遞時用的什麼手法?實驗一下(使用activepython2.5):

首先介紹一個重要的函式:

>>> help(id)

help on built-in function id in module __builtin__:

id(...)

id(object) -> integer

return the identity of an object. this is guaranteed to be unique among

simultaneously existing objects. (hint: it's the object's memory address.)

看最後括號裡那句:hint:it's the object's address.(它是物件的地址)

有了這個函式,下面的事情就方便多了。

>>> a=0

>>> id(a)

3630228

>>> a=1

>>> id(a)

3630216

可以看出,給a賦一次值,a的address就改變了。在c的層面看,(也許真實情況不是下面的樣子,但作為一個類比應該還是可以的):

void * pa;

pa=malloc(sizeof(int));

*(int *)pa=0;

free(pa);

pa=malloc(sizeof(int));

*(int *)pa=1;

python中每次賦值會改變變數的address,分配新的記憶體空間,所以python中對於型別不像c那樣嚴格要求。

下面看看python函式引數傳遞時到底傳的什麼:

有一個函式:

>>> def changea(a):

... print id(a)

... a=100

... print id(a)

設定一個變數var1:

>>> var1=10

>>> id(var1)

3630108

>>> changea(var1)

3630108

3631012

>>> var1

10呼叫函式後,從兩次print的結果可以看出,傳遞確實是地址。但是即便如此,在函式內對形參的修改不會對實參造成任何實質的影響,因為對形參的重新賦值,只是改變了形參所指向的記憶體單元(changea裡兩次呼叫print id(a)得到不同的結果),卻沒有改變實參的指向。在c的層面看也許類似下面的情節:

void changea(void * pa)

精通c的你一眼就看出這個函式永遠也改變不了它外面的世界。

也就是說雖然傳遞的是地址,但像changea這樣的函式改變不了實參的值。

也許會感到困擾?不,我已經在matlab中習慣了。

一個最典型的例子就是matlab中刪除結構體成員的rmfield函式(參見《matlab筆記三則》),

(matlab版本7.0.1)

如果想刪除結構體patient的name成員,用

rmfield(patient, 'name');

是永遠達不到目的的(就像試圖用雙手抓住自己的領子,把自己提到空中);

迷途知返的做法是:

patient = rmfield(patient, 'name');

python 呼叫c**獲取資料,c**要求1個結構引數, 其中有專案是指向緩衝區的指標,如何實現引數賦值?

8樓:匿名使用者

class stdata(structure):

_fields_ = [('pbuf', c_char_p), ('buflen', c_int)]

n=100

buf = create_string_buffer(n)d = stdata()

d.buflen = n

d.pbuf = cast(buf, c_char_p)n = callmycfunc_getdata(byref(d))關鍵在於create_string_buffer建立可寫buffer;cast轉換為char*型別。

9樓:此生不愛

用python寫一個相應的結構體,繼承ctypes的struct類,傳入引數的時候為by_ref(ldata)

急求!這是用python畫國旗的程式,請求大神解釋一下每

import turtle 匯入模組 import time import os def draw square org x,org y,x,y 定義紅旗繪製函式 turtle.setpos org x,org y 定義畫筆初始位置 turtle.color red red 顏色 turtle.be...

求Python程式求出任意數的平均值和總和

n 5l float input 請輸入第 d個數 i 1 for i in range n print 總和 f,平均值 f sum l sum l n i 1 numsval 0 while i 5 tip 請輸 du入第 zhi str i 個數 dao專 numsval int input ...

c語言求和,C語言!求一個求和的程式。

3全部先獲取陣列長度,然後用for迴圈,從陣列中獲取值進行累加求和。include include int main int n int val int a int sun 0,i printf 請輸入陣列的長度 scanf d n printf n a int malloc n sizeof in...