Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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

achso, ja das ist noch besser, werde es gleich testen...

fertisch,

funzt super, danke

danke

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.