20120628-2100-4036-3442 : <node.cpp:84> --------------- ThinTree --------------- 20120628-2100-4036-3442 : <node.cpp:85> Node level 0 : Root nbNext = 1 20120628-2100-4036-3442 : <node.cpp:97> Node level 1 : line(126,64) block(237,46) nbNext 1 toAvoid 1 ptr = 0x1011aa980 20120628-2100-4036-3442 : <node.cpp:97> Node level 2 : line(125,48) block(237,46) nbNext 1 toAvoid 1 ptr = 0x1011aa9d0 20120628-2100-4036-3442 : <node.cpp:97> Node level 3 : line(199,76) block(237,46) nbNext 0 toAvoid 1 ptr = 0x1011aaa70 20120628-2100-4036-3442 : <node.cpp:90> ---------------------------------------- 20120628-2100-4036-3442 : <cmdCreateLines.cpp:403> Last aimed block : (237,46) 20120628-2100-4036-3442 : <cmdCreateLines.cpp:435> Node to delete : line (199,76) block (237,46) 20120628-2100-4036-3442 : <node.cpp:257> line(126,64) block (237,46) 20120628-2100-4036-3442 : <node.cpp:257> line(125,48) block (237,46) 20120628-2100-4036-3442 : <node.cpp:257> line(199,76) block (237,46) Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: 13 at address: 0x0000000000000000 0x000000010009c71b in std::_List_iterator<myNamespace::Node*>::operator++ (this=0x7fff5fbf5ee0) at stl_list.h:142 142 _M_node = _M_node->_M_next; (gdb) bt #0 0x000000010009c71b in std::_List_iterator<myNamespace::Node*>::operator++ (this=0x7fff5fbf5ee0) at stl_list.h:142 #1 0x00000001000b0f24 in std::list<myNamespace::Node*, std::allocator<myNamespace::Node*> >::remove (this=0x1011aaa30, __value=@0x7fff5fbf72c0) at list.tcc:182 #2 0x00000001000acdc0 in myNamespace::Node::deleteNode (this=0x1011aa950, currentNode=0x1011aaa70, myLine=0x1011aa6f0, myBlock=0x1011aa0b0, verif=@0x7fff5fbfae07) at node.cpp:262 #3 0x00000001000ad596 in myNamespace::Node::deleteNode (this=0x1011aa950, currentNode=0x1011aa9d0, myLine=0x1011aa6f0, myBlock=0x1011aa0b0, verif=@0x7fff5fbfae07) at node.cpp:280 #4 0x00000001000ad596 in myNamespace::Node::deleteNode (this=0x1011aa950, currentNode=0x1011aa980, myLine=0x1011aa6f0, myBlock=0x1011aa0b0, verif=@0x7fff5fbfae07) at node.cpp:280 #5 0x00000001000ad596 in myNamespace::Node::deleteNode (this=0x1011aa950, currentNode=0x1011aa950, myLine=0x1011aa6f0, myBlock=0x1011aa0b0, verif=@0x7fff5fbfae07) at node.cpp:280 #6 0x00000001000adf09 in myNamespace::Node::deleteNode (this=0x1011aa950, myLine=0x1011aa6f0, myBlock=0x1011aa0b0) at node.cpp:248 #7 0x0000000100097b49 in myNamespace::CmdCreateLines::linkBlocksWithLines (this=0x7fff5fbfd998) at cmdCreateLines.cpp:442 #8 0x000000010009b5be in myNamespace::CmdCreateLines::execute (this=0x7fff5fbfd998, lines=@0x7fff5fbfdb30) at cmdCreateLines.cpp:104 #9 0x0000000100016c14 in myNamespace::ReceiptSection::createLinesFromContours (this=0x10115e360) at receiptSection.cpp:292 #10 0x00000001000182fa in myNamespace::ReceiptSection::analyse (this=0x10115e360) at receiptSection.cpp:129 #11 0x0000000100006a07 in myNamespace::Receipt::buildStructure (this=0x10115b320) at receipt.cpp:138 #12 0x0000000100006de0 in myNamespace::Receipt::analyse (this=0x10115b320) at receipt.cpp:116 #13 0x00000001000b2ae1 in main (argc=-1, argv=0x7fff5fbff698) at main.cpp:83 #14 0x0000000100000d64 in start ()
void Node::deleteNode(std::vector<cv::Rect*>* myLine, cv::Rect *myBlock) { bool verif = false; deleteNode(this, myLine, myBlock, verif); }
- Dès le moment ou tu as un "return", pas besoin de "else" juste après.
- Si une méthode n'utilise pas les membres de ta classe, et n'a pas vocation à être vu de l'extérieur, alors ça devrait être une fonction visible uniquement dans ton fichier de code de la classe dans un namespace anonyme. Si elle a vocation à être visible, une méthode statique est à envisager.
- Évite l'emploi de "NULL", c'est parfois trompeur. Il préférable d'utiliser "0" ou mieux encore "nullptr" si tu as accès au C++0x. (Voir ici pour l'explication du problème: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJe vois pas trop quoi changer. Pour moi le else est là [...]
void Node::deleteNode(Node *currentNode, std::vector<cv::Rect*>* myLine, cv::Rect *myBlock, bool& verif) { //... if (currentNode->_line myLine && currentNode->_block myBlock) { //... verif = true; return; } for (std::list<Node*>::iterator nextIt=currentNode->_next.begin(); nextIt!=currentNode->_next.end(); ++nextIt) { deleteNode(*nextIt, myLine, myBlock, verif); if (verif) return; }
Tu parles des 2 fonctions delete? L'une est appelée depuis l'extérieur, l'autre est private car elle n'a pas à être visible.
namespace { void deleteNode(Node *currentNode, std::vector<cv::Rect*>* myLine, cv::Rect *myBlock, bool& verif) { //... } } // namespace
L'utilisation d'un liste est par contre indispensable pour l'ensemble de mon algo. J'ai essayé au départ d'utiliser un tableau mais je ne m'y retrouvais pas.