Re: [問題] Clang 奇怪的問題,跟compare functor有關

看板C_and_CPP (C/C++)作者 (殺拉頂)時間11年前 (2014/11/07 10:34), 11年前編輯推噓6(6028)
留言34則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《saladim (殺拉頂)》之銘言: http://ideone.com/ET2sJs 以上是我的測試碼 好吧 這個結果更奇怪 連自己寫的comparator都失敗了 請各位先進幫忙指點一下 我本身主要是用clang++寫這個功能 這個網站應該是用gcc......... 謝謝 P.S. 請原諒用摘錄的方式 因為我是用virtualbox跑freebsd 現在才發現 要把檔案弄出virtualBox有點難 這種設定問題搞了我好久 @_@ : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : FreeBSD 10x : Clang++ 3.5 : 參數 -Wall (試過 -g, -O1 -O2, 基本上問題都存在或甚至更離譜) : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 使用 stl_tree.h裡面的 red black tree : 問題(Question): : 最近做了一些實驗 主要是想看看能不能使用stl_tree.h裡面的那個rbtree. : 不過遇到了一個很奇怪的問題 : 主要是當我使用std::less<int> 當作key的比較functor時, 最後結果用inorder : traversal 或是用rbtree的begin() and end()去循序印出的結果是錯誤的, : 用gdb進去看發現傳到 std::less<int>::operator()(const int&, const int&) : 的值並非正確的值(-1077945256)....... : = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = : 節錄程式碼: 我是直接繼承 _Rb_Tree來使用它內部的function, 方便存取內部資料 : MyClass : { : public: : struct Key : { : int operator()(const MyClass& class) { return class.getHead();} : }; : public: : int getHead() { return head;} : private: : ....... : int head; : ....... : }; : template<typename K,typename V, typename KofV, typenam Comp, : typename Alloc=std::allocator<V> > : MyTree:public std::_Rb_tree<K,V,KofV,Comp,Alloc> : { : public: : std::pair<std::_Rb_tree<K,V,KofV,Comp,Alloc>::iterator,bool > : insert_unique(const value_type& value){this->_M_insert_unique(value);}; : } : typedef MyTree< int, MyClass, MyClass::Key, std::less<int> > Tree; : 使用插入: : Tree tree; : tree.insert(MyClass(....)); : = = = = = = = = = = = = = = = = = = = = = = = = = = = = = : 之後我使用inorder traversal 跟 tree.begin() to tree.end() iteration,印出的 : 順序是錯誤的. 可是!!!!!!!! 如果我把比較函數換成另外一個: : struct MyComp : { : bool operator()(int a, int b) { return a < b; } : } : 順序就對了, 注意, 紅色標示處一定要是 int, 若是換成const int& 一樣出錯!!! : 另外 std::less<int> 跟 MyComp單獨使用不管參數型態為何都是正常的...... : 請問有誰遇過這種狀況嗎? 見鬼的奇怪....誰能幫忙試一下g++版本 : 最近FreeBSD gcc port都編譯失敗.....壞一陣子了...... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.82.79 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1415327669.A.403.html ※ 編輯: saladim (118.166.82.79), 11/07/2014 10:35:27

11/07 10:36, , 1F
檔案弄出 virtualbox,其實 ssh / sftp 就行?
11/07 10:36, 1F

11/07 10:37, , 2F
我其他地方沒有機器 然後要設定從host連到guest都失敗 XD
11/07 10:37, 2F

11/07 10:38, , 3F
或許晚點再跟大大順便請教一下host to guest要怎麼設定
11/07 10:38, 3F

11/07 12:04, , 4F
你的MyCmp怎麼一直在跟0比?
11/07 12:04, 4F

11/07 12:09, , 5F
不曉得阿 @_@ 這應該就問題所在 我在自己的機器上不會
11/07 12:09, 5F

11/07 12:10, , 6F
就如之前所PO的 在我的機器上 std::less會有錯 但是自己
11/07 12:10, 6F

11/07 12:10, , 7F
的MyCmp不會錯(使用Clang++3.5) 但是ideone這個兩個都錯
11/07 12:10, 7F

11/07 12:11, , 8F
另外 若是不使用額外的那個Node struct,直接用int, 就正
11/07 12:11, 8F

11/07 12:11, , 9F
常惹 請幫幫忙阿~可能是哪裡寫錯或是觀念錯吧
11/07 12:11, 9F

11/07 12:14, , 10F
28行 using後面少了typename
11/07 12:14, 10F

11/07 12:25, , 11F
看一下RB tree是怎麼呼叫你的compare function的吧
11/07 12:25, 11F

11/07 12:25, , 12F
我用g++跟clang++看 你第二個參數送的值都是爛的
11/07 12:25, 12F

11/07 12:27, , 13F
是的 我用clang 然後去debug也是看到值是爛的 他裡面的
11/07 12:27, 13F

11/07 12:30, , 14F
還有 不該直接繼承_Rb_tree_吧 應該用組合去包
11/07 12:30, 14F

11/07 12:32, , 15F
好像是利用template type生成一個object之後用那個obj比
11/07 12:32, 15F

11/07 12:33, , 16F
繼承是因為很多function是protected....當然組合比較好
11/07 12:33, 16F

11/07 12:34, , 17F
不過herb stutter也提過沒辦法的話繼承也可以 不過被繼承
11/07 12:34, 17F

11/07 12:34, , 18F
那個東西要滿足一定條件 ORZ anyway,這邊是測試用的...
11/07 12:34, 18F

11/07 12:41, , 19F
補充一下 我有trace到拿id_那行到傳入std::less之前
11/07 12:41, 19F

11/07 12:41, , 20F
到進入less之前, 拿到的value都是對的.....
11/07 12:41, 20F

11/07 13:01, , 21F
Node::Key寫錯了 要return referenct
11/07 13:01, 21F

11/07 13:01, , 22F
e
11/07 13:01, 22F

11/07 13:01, , 23F
const int& operator()(const Node& node) {return nod
11/07 13:01, 23F

11/07 13:01, , 24F
e.id_;} 這樣就對了
11/07 13:01, 24F

11/07 21:04, , 25F
不能直接return "value"就好嗎? Cmp那邊再用value接起來?
11/07 21:04, 25F

11/07 23:38, , 26F
我不知道 但是set的_Idenity和map的_Select1st都是
11/07 23:38, 26F

11/07 23:38, , 27F
return reference 而且改了後就對了 原因還是要看
11/07 23:38, 27F

11/07 23:38, , 28F
_Rb_tree的實作吧
11/07 23:38, 28F

11/08 17:10, , 29F
好吧 看來是無解了 理論上 const int& 可以接 return回
11/08 17:10, 29F

11/08 17:11, , 30F
來的int value啦...
11/08 17:11, 30F

11/08 17:57, , 31F
但是 const int & 跟 int 不等價
11/08 17:57, 31F

11/08 17:57, , 32F
尤其前者所指向的值可能會被其他地方改變.
11/08 17:57, 32F

11/09 11:53, , 33F
我是確定插入後都沒在動過value,得去研究一下stl_tree原
11/09 11:53, 33F

11/09 11:53, , 34F
始碼
11/09 11:53, 34F
文章代碼(AID): #1KN2-rG3 (C_and_CPP)
文章代碼(AID): #1KN2-rG3 (C_and_CPP)