看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV, Eigen 問題(Question): 由於某些關係,需要把C++的程式轉成純C語言 所以需要把原本一些類別轉為結構 遇到new的時候不太會處理,在new的那一行已經卡了3天了orz 錯誤結果(Wrong Output): 執行過程中發生堆積損毀 程式碼(Code):(請善用置底文網頁, 記得排版) //以下struct原本均為class struct SupportPattern { Eigen::VectorXd x[100]; FloatRect yv[100]; int y; int refTop; int yvTop; }; struct LaRank { . . . //原本struct SupportPattern* m_sps[20]; struct SupportPattern* m_sps; . . . }; /*在初始化函數裡有做分配記憶體的動作 **... **rank是LaRank的結構 **rank->m_sps = ** (struct SupportPattern*)malloc(20 * sizeof(struct SupportPattern)); **... */ 發生錯誤的函數 void Update(struct LaRank* rank) { 原先有一個SupportPattern *sp = new SupportPattern的動作 sp->y = y; sp->yvTop = 0; sp->refTop = 0; 最後將sp指定給rank->m_sps[i] = sp; 後來改成結構後直接指定,ex: rank->m_sps[i].y = y; rank->m_sps[i].yvTop = 0; rank->m_sps[i].refTop = 0; . . . } 執行後就發生問題堆積損毀的情形 我在想是不是指定記憶體大小那邊就有問題? 因為rank->m_sps[1]似乎就取不到東西 或是new其實無法這樣改? 如有敘述不清請見諒,我會再補充,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.218.165.98 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1464698322.A.E78.html
wtchen: ....我看不太懂說, 為啥純C裡會有new? 不是應該用malloc? 05/31 22:33
wtchen: 抱歉我看漏了 05/31 22:37
CaptainH: 真有必要把C++改C?很難喔! 05/31 23:38
CaptainH: 用extern "C" 包裝一下接口比較好 05/31 23:39
descent: 可以用 c++ compile to obj, 再 link obj 05/31 23:49
EdisonX: 原本是 struct SupportPattern* m_sps[20] ; 和你後面配 06/01 02:49
EdisonX: 置的 20 * sizeof(struct SupportPattern) 有所不同 , 若 06/01 02:50
EdisonX: 你是想將 OpenCV 改成純 C 的話... 保重! 06/01 02:53
bibo9901: 我真好奇為何你struct 裡 Eigen:: 那行可以通過編譯 06/01 02:54
bibo9901: 或許你還是用C++ compiler (?) 這樣的話你到底想做什麼06/01 02:55
EdisonX: @bibo9901 , 我猜他沒把副檔名改成 .c ? (vc 編譯器)06/01 02:55
EdisonX: 你原本的做法應該是要先配置好 20 個 pointer , 再用每個06/01 02:56
EdisonX: pointer 往下配置出實際 SupportPattern.06/01 02:56
bibo9901: 對啊 ..連code原本的意思都沒弄清楚06/01 02:56
EdisonX: struct SupportPattern ** m_sps;06/01 02:59
EdisonX: rand->m_sps=(T**)malloc(20*sizeof(SupportPattern*));06/01 02:59
EdisonX: for(i = 0; i < 20 ; ++i)06/01 03:00
EdisonX: rand->m_sps[i]=(T*)malloc(sizeof(SupportPattern);06/01 03:00
EdisonX: 大概是這樣吧,上面的 T 自己換成 struct name.06/01 03:00
我的確是還是使用C++編譯器,因為要改的程式頗大(對我來說 不敢一口氣將所有的東西改完,所以一點一點改 我會試試看大家提供的方法,感謝大家 然後我是要把OpenCV與Eigen寫成C沒錯... ※ 編輯: startbomb51 (61.218.165.98), 06/01/2016 09:04:38
bibo9901: XDD RIP06/01 14:03
bibo9901: 期待你用C做出 expressio template06/01 14:05
damody: 選對的工具 別創新工具 除非是做興趣的06/01 16:03
按照E大的方法已經可以執行了 只不過我的情形要再利用memset做初始化 或是用calloc代替 感謝大家的幫忙 ※ 編輯: startbomb51 (111.82.90.200), 06/03/2016 09:17:43