筆記1:
c dll的call convention 是cdecl ,弄了乙個callback,供外部呼叫。
c#方面 在debug模式下,委託不加unmanagedfunctionpointer是正常的,在release模式下不加unmanagedfunctionpointer不行,加上unmanagedfunctionpointer才正常。
錯誤的寫法:
internal delegate void internal_can_receivecallback_t(intptr device, can_rxpacket_t rx);
internal delegate void internal_can_txerrorcallback_t(intptr device, can_txpacket_t tx);
internal delegate void internal_can_controlunitstatusupdatecallback_t(intptr device, can_controlunitstatus_t status);
正確的寫法:
[unmanagedfunctionpointer(callingconvention.cdecl)]
internal delegate void internal_can_receivecallback_t(intptr device, can_rxpacket_t rx);
[unmanagedfunctionpointer(callingconvention.cdecl)]
internal delegate void internal_can_txerrorcallback_t(intptr device, can_txpacket_t tx);
[unmanagedfunctionpointer(callingconvention.cdecl)]
internal delegate void internal_can_controlunitstatusupdatecallback_t(intptr device, can_controlunitstatus_t status);
總結:
以後呼叫一切的c/c++ dll 任何函式 任何委託 全部顯式寫出 callingconvention
筆記2:
有如下函式:
[dllimport("my.dll",callingconvention= callingconvention.cdecl,entrypoint = "setcallback")]
private static extern void setcallback(mycallback_t callback);
相當於c#寫callback供 c dll呼叫, 那麼在c#方面一定要搞乙個委託的例項字段 將c#方法付給這個例項,再將例項傳給c dll
錯誤寫法:
c#:
public void foo()
setcallback(foo);
正確的寫法:
public void foo()
private mycallback_t internalmycallback;
internalmycallback=foo;
setcallback(internalmycallback);
ACM走過的坑和一些細節
1.一道簡單計算幾何,區域性變數與全域性變數同名,然後忘記在函式內宣告區域性變數,然後編譯通過了。2.省賽選拔時,一道二分 bfs走迷宮的題,漏了起點和終點重合的情況,要注意一開始入隊的狀態是否是結束狀態。3.線段樹的一道題,len陣列記錄根節點所代表線段覆蓋的長度,有小數,改來改去,根本沒注意到l...
C 使用protobuffer的一些坑
原文 最後總結一句,使用protobuf,在c 中給string賦值c字串的時候一定要指定長度,因為事實上賦值的內容可能是乙個bytes陣列,而不是乙個標準的 0 結尾的字串。賦值範例如下 char pdata 1024 serialized data int length getdatalengt...
關於C 引用的一些坑
這幾天在找專案的bug發現前輩的引用寫法有些問題,導致資料不同步。所以寫一篇文章記錄一下 c 裡面有很好用的各種容器,list dictionary等等,但是我們普通用法就是以一些值型別或者 string 來作為key,但是專案一旦大了,key可能就是乙個複雜的引用型別。csharp using s...