C 呼叫C dll時,結構體引用傳參的方法

2022-01-12 09:37:51 字數 2088 閱讀 5727

寫了乙個c++的loglog logit 四引數等演算法的介面dll,給c#呼叫,但是發現傳參有問題

如extern "c" _declspec(dllexport)  bool testfunc(enummethod emethod, unsigned int uipoints, const double *para, const double *parb, structtest &stest)

前面的傳參非常好解決

列舉本地自定義乙個,兩個double指標直接ref傳參

double rlu = new

double[6

]; rlu[

0] = 8759

; rlu[

1] = 39686

; rlu[

2] = 108791

; rlu[

3] = 473403

; rlu[

4] = 1679609

; rlu[

5] = 4103842

;

double cv = new

double[6

]; cv[

0] = 0

; cv[

1] = 3

; cv[

2] = 10

; cv[

3] = 50

; cv[

4] = 200

; cv[

5] = 600;

calculationparm cparms = new calculationparm();

bool rt = calculation(arithmeticmethod.arithmetic_method_log_log,

6, ref cv[0], ref rlu[0], cparms);

直接傳參,結果結果並沒有根據實際情況變更.

根據相關資料,

在c/c++中,struct型別中的成員的一旦宣告,則例項中成員在記憶體中的布局(layout)順序就定下來了,即與成員宣告的順序相同,並且在預設情況下總是按照結構中占用空間最大的成員進行對齊(align);

然而在.net託管環境中,clr提供了更自由的方式來控制struct中layout:我們可以在定義struct時,在struct上運用structlayoutattribute特性來控制成員的記憶體布局。預設情況下,struct例項中的字段在棧上的布局(layout)順序與宣告中的順序相同,即在struct上運用[structlayoutattribute(layoutkind.sequential)]特性,這樣做的原因是結構常用於和非託管**互動的情形。如果我們正在建立乙個與非託管**沒有任何互操作的struct型別,我們很可能希望改變c#編譯器的這種預設規則,因此layoutkind除了sequential成員之外,還有兩個成員auto和explicit,給structlayoutattribute傳入layoutkind.auto可以讓clr按照自己選擇的最優方式來排列例項中的字段;傳入layoutkind.explicit可以使欄位按照我們的在字段上設定的fieldoffset來更靈活的設定字段排序方式,但這種方式也挺危險的,如果設定錯誤後果將會比較嚴重。

因此,把結構體顯示的宣告為  [structlayout(layoutkind.sequential)]即可.

預設(layoutkind.sequential)情況下,clr對struct的layout的處理方法與c/c++中預設的處理方式相同,即按照結構中占用空間最大的成員進行對齊(align); 

使用layoutkind.explicit的情況下,clr不對結構體進行任何記憶體對齊(align),而且我們要小心就是fieldoffset; 

使用layoutkind.auto的情況下,clr會對結構體中的字段順序進行調整,使例項占有盡可能少的記憶體,並進行

4byte的記憶體對齊(align)。

但似乎在vs2005中,預設並不是sequential而是auto

python呼叫C DLL 傳參技巧

結構體傳參 準備工作 c 檔案 cpp 注意在函式宣告上加上extern c 的修飾 include extern c int double int x float floatadd float a,float b void helloworld char str void ints int arr...

傳引用呼叫形參

原創作品,轉賬請註明出處。呼叫乙個函式是,它的實參會替換函式中的形參。也就是說實參會填充形參的位置。有幾種機制都可以實現這一過程 一是傳值呼叫機制,二是用於替換形參的傳引用呼叫機制,下面主要針對傳應用呼叫機制進行簡單的闡述。1.區別 傳值呼叫機制是將實參中的值傳遞給函式的形參,並不會將實參這個變數傳...

C 呼叫C dll 結構體引數傳遞問題

1 最近做專案遇到,c 呼叫c dll裡的函式需要傳遞結構體引數,發現這個並不是簡單的在c 裡定義相應的結構體就可以的,下面以乙個例子來說明解決的辦法,c 中的函式和結構體如下 uint msec set igr gen cfg int port,igr gen t igr gen typedef ...