寫了乙個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 = newdouble[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 ...