[問題] 推積損毀問題

看板C_and_CPP作者 (~森林之熊~)時間9年前 (2016/05/31 20:38), 9年前編輯推噓7(7015)
留言22則, 6人參與, 最新討論串1/1
開發平台(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

05/31 22:33, , 1F
....我看不太懂說, 為啥純C裡會有new? 不是應該用malloc?
05/31 22:33, 1F

05/31 22:37, , 2F
抱歉我看漏了
05/31 22:37, 2F

05/31 23:38, , 3F
真有必要把C++改C?很難喔!
05/31 23:38, 3F

05/31 23:39, , 4F
用extern "C" 包裝一下接口比較好
05/31 23:39, 4F

05/31 23:49, , 5F
可以用 c++ compile to obj, 再 link obj
05/31 23:49, 5F

06/01 02:49, , 6F
原本是 struct SupportPattern* m_sps[20] ; 和你後面配
06/01 02:49, 6F

06/01 02:50, , 7F
置的 20 * sizeof(struct SupportPattern) 有所不同 , 若
06/01 02:50, 7F

06/01 02:53, , 8F
你是想將 OpenCV 改成純 C 的話... 保重!
06/01 02:53, 8F

06/01 02:54, , 9F
我真好奇為何你struct 裡 Eigen:: 那行可以通過編譯
06/01 02:54, 9F

06/01 02:55, , 10F
或許你還是用C++ compiler (?) 這樣的話你到底想做什麼
06/01 02:55, 10F

06/01 02:55, , 11F
@bibo9901 , 我猜他沒把副檔名改成 .c ? (vc 編譯器)
06/01 02:55, 11F

06/01 02:56, , 12F
你原本的做法應該是要先配置好 20 個 pointer , 再用每個
06/01 02:56, 12F

06/01 02:56, , 13F
pointer 往下配置出實際 SupportPattern.
06/01 02:56, 13F

06/01 02:56, , 14F
對啊 ..連code原本的意思都沒弄清楚
06/01 02:56, 14F

06/01 02:59, , 15F
struct SupportPattern ** m_sps;
06/01 02:59, 15F

06/01 02:59, , 16F
rand->m_sps=(T**)malloc(20*sizeof(SupportPattern*));
06/01 02:59, 16F

06/01 03:00, , 17F
for(i = 0; i < 20 ; ++i)
06/01 03:00, 17F

06/01 03:00, , 18F
rand->m_sps[i]=(T*)malloc(sizeof(SupportPattern);
06/01 03:00, 18F

06/01 03:00, , 19F
大概是這樣吧,上面的 T 自己換成 struct name.
06/01 03:00, 19F
我的確是還是使用C++編譯器,因為要改的程式頗大(對我來說 不敢一口氣將所有的東西改完,所以一點一點改 我會試試看大家提供的方法,感謝大家 然後我是要把OpenCV與Eigen寫成C沒錯... ※ 編輯: startbomb51 (61.218.165.98), 06/01/2016 09:04:38

06/01 14:03, , 20F
XDD RIP
06/01 14:03, 20F

06/01 14:05, , 21F
期待你用C做出 expressio template
06/01 14:05, 21F

06/01 16:03, , 22F
選對的工具 別創新工具 除非是做興趣的
06/01 16:03, 22F
按照E大的方法已經可以執行了 只不過我的情形要再利用memset做初始化 或是用calloc代替 感謝大家的幫忙 ※ 編輯: startbomb51 (111.82.90.200), 06/03/2016 09:17:43
文章代碼(AID): #1NJONIvu (C_and_CPP)