ph-online Geschrieben 12. Mai 2002 Geschrieben 12. Mai 2002 Hallo @all ich habe ein Problem mit einem C-Programm. Ich möchte Daten, die ich einlese in einen Stapel speichern und ich finde meinen Fehler nicht. Es funktionierte alles wunderbar, als ich in der Struktur tStapelElem nur einen Integer und einen Zeiger auf sich selbst hatte. Jetzt habe ich 2 Zeiger in dieser Struktur und das Programm stürzt an der entsprechenden Stelle immer ab. mein Quellcode: //die strukturen struct tKarte { int zahl[4]; int drehung; int typ; }; struct tStapelElem { struct tKarte* pKarte; struct tStapelElem* pweiter; }; //die funktionen int einlesen(const char* File, struct tStapelElem* head) { FILE* input_File; if ((input_File = fopen(File, "r")) != NULL) { int i; struct tKarte buffer; //zwischenspeicher for(i=0; i < GROESSE; i++) { fscanf(input_File, "%d %d %d %d %d", &buffer.typ, &buffer.zahl[0], &buffer.zahl[1], &buffer.zahl[2], &buffer.zahl[3]); //Stapel füllen stapel_einfuegen(&(*head), &buffer); } fclose(input_File); return 1; } else { msg("Datei kann nicht geöffnet oder nicht gefunden werden"); return 0; } } //Stapelverarbeitung void stapel_einfuegen(struct tStapelElem *head, struct tKarte *buffer){ struct tStapelElem *pElem, *aktuell; aktuell = head; while (aktuell->pweiter->pweiter != NULL){ aktuell = aktuell->pweiter; } pElem = (struct tStapelElem*)malloc(sizeof(struct tStapelElem)); if(pElem != NULL){ int i; pElem->pweiter = aktuell->pweiter; aktuell->pweiter = pElem; for(i=0; i<4; i++) { //in den folgenden Zeilen muss der Fehler liegen pElem->pKarte->zahl[i] = buffer->zahl[i]; } pElem->pKarte->typ = buffer->typ; } } Vielen Dank für Eure hilfe, MfG, Patrick Zitieren
Klotzkopp Geschrieben 12. Mai 2002 Geschrieben 12. Mai 2002 Du holst keinen Speicher für pElem->pKarte. Ich sehe auch keinen Grund, warum das ein Zeiger sein muss.&(*head) ist Unsinn (wenn auch kein Fehler). Zitieren
ph-online Geschrieben 12. Mai 2002 Autor Geschrieben 12. Mai 2002 Hallo, danke erstmal für die schnelle antwort... zum 2. Punkt hast recht, jetzt wo du es sagst, logisch... *grins* zum 1. Punkt wie muss ich denn dazu noch speicher allocieren? Wenn ich mit einen Speicher vom struct tStapelElem allociere muss das doch reichen, der legt doch dann speicher in der entsprechenden Größe an. mit pweiter kann ich ja auch ohne probleme arbeiten. MfG, Patrick Zitieren
Klotzkopp Geschrieben 12. Mai 2002 Geschrieben 12. Mai 2002 Original geschrieben von ph-online Wenn ich mit einen Speicher vom struct tStapelElem allociere muss das doch reichen, der legt doch dann speicher in der entsprechenden Größe an.Der Standardkonstruktur allokiert Speicher für jedes Element der Struktur. Es wird also Speicher für den Zeiger pKarte geholt. Keinesfalls wird automatisch Speicher für ein Objekt geholt, auf das pKarte dann zeigt. mit pweiter kann ich ja auch ohne probleme arbeiten.Die Verbindungszeiger einer verketteten Liste verweisen auf bereits angelegte Objekte, für die Du zuvor bereits Speicher allokiert hast. Mach einfach aus dem Zeiger pKarte ein ganz normales Element, dann brauchst Du Dich darum nicht mehr zu kümmern. Zitieren
ph-online Geschrieben 12. Mai 2002 Autor Geschrieben 12. Mai 2002 meinst du dann: struct tStapelElem { int typ; int zahl[4]; usw... struct tStapelElem* pweiter; } ??? ich denke mal schon, danke für die Hilfe. So funktioniert es natürlich. So hatte ich es auch zuerst, aber ich dachte wenn ich es anders mache, dann ist die Struktur tKarte nicht nochmal in der Struktur tStapelElem angelegt. Naja egal, werde dann mal weiter machen. mfg, patrick Zitieren
Klotzkopp Geschrieben 12. Mai 2002 Geschrieben 12. Mai 2002 Ich meinte einfach nur: struct tStapelElem { struct tKarte Karte; struct tStapelElem* pweiter; }; [/CODE] Zitieren
ph-online Geschrieben 12. Mai 2002 Autor Geschrieben 12. Mai 2002 achso, ja das ist noch besser, werde es gleich testen... fertisch, funzt super, danke danke Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.