@ seahawk1986
Weil die FLTK Version in den Ubuntu Quellen normalerweise recht alt sind, habe ich die gesamte FLTK Installation direkt von den Quelltexten der Webseite gemacht. Daher die Sache mit dem Script.
Um welche Library geht es denn?
Das kann ich jetzt gar nicht so genau sagen, aber ich vermute das alles auf
/usr/local/lib/libfltk.a
hinausläuft. Die zugehörigen Quelltexte sind Fl_Tree.cxx und Fl_Tree_Item.cxx, die irgendwie in die Lib eingeflossen sind. Der ganze FLTK Kram wird statisch eingelinkt, während die normalen Libs dynamisch eingebunden werden.
Bei meinem Problem handelt es sich darum, das ein Knoten im Baum anhand des Pfadnamens gesucht werden soll. Der Pfadname lautet:
Die Menüleiste/Search/Search/Search Panel
Da liegt der Verdacht nahe, dass das mehrfache Vorkommen von "Search" das Problem auslöst, was ich aber nicht beweisen kann. Die zugehörigen Quelltexte, die ich allerdings noch nicht vollständig durchschaue sind:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | /// Find the item, given a menu style path, e.g. "/Parent/Child/item".
/// There is both a const and non-const version of this method.
/// Const version allows pure const methods to use this method
/// to do lookups without causing compiler errors.
///
/// To specify items or submenus that contain slashes ('/' or '\')
/// use an escape character to protect them, e.g.
///
/// \code
/// tree->add("/Holidays/Photos/12\\/25\\2010"); // Adds item "12/25/2010"
/// tree->add("/Pathnames/c:\\\\Program Files\\\\MyApp"); // Adds item "c:\Program Files\MyApp"
/// \endcode
///
/// \param[in] path -- the tree item's pathname to be found (e.g. "Flintstones/Fred")
/// \returns The item, or NULL if not found.
/// \see item_pathname()
///
const Fl_Tree_Item *Fl_Tree::find_item(const char *path) const {
if ( ! _root ) return(NULL);
char **arr = parse_path(path);
const Fl_Tree_Item *item = _root->find_item(arr);
free_path(arr);
return(item);
}
/// Non-const version of Fl_Tree::find_item(const char *path) const
Fl_Tree_Item *Fl_Tree::find_item(const char *path) {
// "Effective C++, 3rd Ed", p.23. Sola fide, Amen.
return(const_cast<Fl_Tree_Item*>(
static_cast<const Fl_Tree&>(*this).find_item(path)));
}
|
und
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | /// Find item by descending array of \p 'names'.
/// Includes self in search.
/// Only Fl_Tree should need this method. Use Fl_Tree::find_item() instead.
///
/// \returns const item, or 0 if not found
///
const Fl_Tree_Item *Fl_Tree_Item::find_item(char **names) const {
if ( ! *names ) return(0);
if ( label() && strcmp(label(), *names) == 0 ) { // match self?
++names; // skip self
if ( *names == 0 ) return(this); // end of names, found ourself
}
if ( children() ) { // check children..
return(find_child_item(names));
}
return(0);
}
/// Non-const version of Fl_Tree_Item::find_item(char **names) const.
Fl_Tree_Item *Fl_Tree_Item::find_item(char **names) {
// "Effective C++, 3rd Ed", p.23. Sola fide, Amen.
return(const_cast<Fl_Tree_Item*>(
static_cast<const Fl_Tree_Item &>(*this).find_item(names)));
}
|
Ich vermute das dieses "// match self" das Problem ist, kann das aber nicht erkennen, da der Debugger nicht mitspielt und ich wegen der vielen casts nicht erkennen kann, was da wirklich passieren soll.
@Dakuan: Du kannst doch einfach die -dbg-Pakete installieren und dann GDB drauf loslassen.
Die gibt es in diesem Fall nicht, oder habe ich da was nicht mit gekriegt?