Archiv verlassen und diese Seite im Standarddesign anzeigen : Linkedlist gcc-4
Hallo zusammen!
Ich habe gerade folgends Problem:
struct foo{
foo *next;
}
func(){
....
while(ptr->next)
ptr = ptr->next;
}
Mit gcc-3 compilierts ohne Probleme, mit gcc-4 bekomm ich allerdings einen Segmentation fault.
Konnte im Netz keine brauchbaren Informationen finden.
Wie kann ich das kompatiblen mit gcc-4 machen?
mfg
anda_skoa
04-11-2006, 21:55
Das sieht korrekt aus, der Fehler muß an einer anderen Stelle liegen.
Ciao,
_
locus vivendi
04-11-2006, 22:24
Ich habe gerade folgends Problem:
struct foo{
foo *next;
}
func(){
....
while(ptr->next)
ptr = ptr->next;
}
Mit gcc-3 compilierts ohne Probleme, [...]
So kompiliert das gewiss nicht. Du kannst hier am besten Hilfe bekommen, wenn du ein vollständiges Beispiel postest, welches den Fehler reproduziert.
hi!
danke für die schnellen antworten.
gdb schmiert genau an der von mir beschriebenen stelle ab.
hier mal ein paar code stellen:
struct task {
char *cmd;
char *arg;
char *opt;
int sema;
char *path;
task *next;
};
struct bag {
task *head;
};
void init_bag(bag * ibag)
{
ibag->head = NULL;
}
void insert_back(bag * ibag, char *cmd, char *arg, char *opt, int val,
char *path)
{
task *ptr, *new;
new = (task *) xmalloc(sizeof(task));
new->cmd = cmd;
new->arg = arg;
new->opt = opt;
new->sema = val;
new->path = path;
new->next = NULL;
if (!ibag->head) {
ibag->head = new;
return;
}
ptr = ibag->head;
while (ptr->next)
ptr = ptr->next;
ptr->next = new;
}
mfg
locus vivendi
05-11-2006, 11:18
Sag mal was für eine Programmiersprache soll das eigentlich sein? C++ ist es jedenfalls nicht, und C scheint es mir auch nicht zu sein.
anda_skoa
05-11-2006, 12:23
Wird vor dem Crash vielleicht irgendwo noch die Liste verändert, zB Elemente entfernt?
Das direkte Zuweisen der char* ist gesichert? Ich meine du brauchst sicher keine Kopie?
Als Tipp am Rande: ich würde die Task Struktur als reine Datenstruktur machen und die Liste in einer extra Struktur, die als einziges Datenelement eine Task Instanz hält.
Ciao,
_
Wird vor dem Crash vielleicht irgendwo noch die Liste verändert, zB Elemente entfernt?
Das direkte Zuweisen der char* ist gesichert? Ich meine du brauchst sicher keine Kopie?
Als Tipp am Rande: ich würde die Task Struktur als reine Datenstruktur machen und die Liste in einer extra Struktur, die als einziges Datenelement eine Task Instanz hält.
Ciao,
_
danke für den tipp!
das zuweisen der chars sollte eigentlich passen. ich füge nur elemente in die liste ein.
der error kommt direkt nach insert_back();
locus vivendi
05-11-2006, 14:43
der error kommt direkt nach insert_back();
Also wenn der Debugger anzeigt, das der Segfault an einer "unverdächtigen" Stelle im Code passiert, deutet das evtl. darauf hin, das schon vorher irgendwas korrompuiert wurde. Z. b. das irgendwelche Blöcke vom Heap mehrmals mit "free" zurückgegeben wurden. Wenn du noch mehr Informationen geben würdest, wäre das wirklich hilfreich.
aber wieso läuft das ding dann mit gcc-3.4.6 und mit gcc-4.0.3 nicht. da steigt ich nicht dahinter.
anda_skoa
05-11-2006, 17:52
Wenn ein Fehler im Programm ist, ist nicht garantiert, daß er sich immer gleich auswirkt.
Darum ist es auch günstig, die Implementierung der verketten Liste unabhängig von den Daten zu machen, denn dann läßt sie sich auch getrennt testen.
Im Grunde ist es aber fraglich, warum man eigens einen Basiscontainer wie eine verkette Liste implementiert, wenn es dafür zB in der glib schon fertige und getestet Container gibt.
Ciao,
_
Im Grunde ist es aber fraglich, warum man eigens einen Basiscontainer wie eine verkette Liste implementiert, wenn es dafür zB in der glib schon fertige und getestet Container gibt.
Ciao,
_
Da hast du sicher recht. Aber "nur" wegen einer Liste glib includieren ist auch nicht sinnvoll. Und andere implementierungen habe ich keine gefunden. Mal abgesehen von der Linkedliste im Linux Kernel.
Vielleicht weißt du mir ja eine. Bin dankbar für jeden Tip.
locus vivendi
05-11-2006, 22:39
Aber "nur" wegen einer Liste glib includieren ist auch nicht sinnvoll. Und andere implementierungen habe ich keine gefunden. Mal abgesehen von der Linkedliste im Linux Kernel.
Vielleicht weißt du mir ja eine. Bin dankbar für jeden Tip.
Muss es denn C sein? Die C++ Standardbibliothek enthält eine Listenkomponente bereits (die auch rech einfach zu benutzen ist).
anda_skoa
05-11-2006, 23:02
Es gibt einige Projekte, die nur Teile der glib in eine eigene Hilfbiliothek kopieren um nicht gegen glib selbst linken zu müssen.
Ist auch mehr ein grundsätzlicher Vorschlag, die Trennung von Liste und Nutzdaten ist wie gesagt schon wegen der getrennten Testbarkeit eine gute Idee.
Ciao,
_
Muss es denn C sein? Die C++ Standardbibliothek enthält eine Listenkomponente bereits (die auch rech einfach zu benutzen ist).
Es gibt einige Projekte, die nur Teile der glib in eine eigene Hilfbiliothek kopieren um nicht gegen glib selbst linken zu müssen.
Ist auch mehr ein grundsätzlicher Vorschlag, die Trennung von Liste und Nutzdaten ist wie gesagt schon wegen der getrennten Testbarkeit eine gute Idee.
Ciao,
_
Ja ich verwende immer C.
Habe mir jetzt die Linkedlist des Linux Kernel auf meine Bedürfnisse umgeschrieben und verwende diese.
War zwar etwas mehr Arbeit als Glib oder sonst was zu includieren, dafür habe ich mir einige Codezeilen und Abhängigkeiten erspart.
Naja jetzt läufts auf jeden Fall. Obwohl interessieren würde mich schon was es war!
Danke euch nochmals für die zahlreichen Antworten.
Was ist xmalloc? Das kenn ich nicht und auch nicht meine Manpages. Ein normales malloc kann im Falle das kein Speicher mehr vorhanden ist auch NULL zurück liefern. Den Fall zu behandeln wäre auch noch gut, und nicht voraus zu setzten, das malloc eh funktioniert.
Desweiteren wäre es eventuell günstig keine Variable "new" zu nennen, zumal das unter C++ ein Keyword ist (nenns vieleicht "new_task"). Theoretisch sollte GCC im C-Modus damit zwar umgehen können, aber sicher ist sicher. Auch ein eventueller späterer Umstieg auf C++ wäre damit dann einfacher möglich.
locus vivendi
10-11-2006, 18:50
Was ist xmalloc? Das kenn ich nicht und auch nicht meine Manpages. Ein normales malloc kann im Falle das kein Speicher mehr vorhanden ist auch NULL zurück liefern. Den Fall zu behandeln wäre auch noch gut, und nicht voraus zu setzten, das malloc eh funktioniert.
Ich vermute, dass xmalloc malloc wrappt und eine Fehlermeldung ausgibt und dann das Programm terminiert wenn malloc 0 zurückgibt. Es ist so eine Art Konvention in C, eine solche Funktion xmalloc zu nennen.
Desweiteren wäre es eventuell günstig keine Variable "new" zu nennen, zumal das unter C++ ein Keyword ist (nenns vieleicht "new_task"). Theoretisch sollte GCC im C-Modus damit zwar umgehen können, aber sicher ist sicher. Auch ein eventueller späterer Umstieg auf C++ wäre damit dann einfacher möglich.
Dem stimme ich zu. Ich möchte auch kurz erläutern dass dieser Variablename mit Grund dafür war, dass ich gesagt habe, dass es sich weder um C noch um C++ handelt. C++ kann es wegen "new" nicht sein. Andernfalls wird aber die "struct sowieso { [...] };" Syntax benutzt, and anschließend "sowieso" ohne Spezifikation benutzt. Und das gibt es in C nicht, dafür aber in C++. Irgendeinen wichtigen Teil des Programms (neben "xmalloc") muss mason also noch unterschlagen haben.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.