Listen Hilfe
-
#define DATEI "punkte.dat"
typedef struct{ int x; int y; }Punkt;
typedef struct element{ Punkt inhalt; struct element *next; }ELEMENT;
ELEMENT *laden(){ ELEMENT *ergebnis=NULL; FILE *fp=fopen(DATEI,"r"); fscanf("%d",ergebnis->inhalt.x); fscanf("%d",ergebnis->inhalt.y); ergebnis=ergebnis->next; fclose(fp); return ergebnis; }
int main(ELEMENT *liste) { ELEMENT *liste; liste=laden(); return 0; }
Ich denke mir das in etwa so.
Stimmt es? Da fehlt noch eine Schleife in der ich überprüfen muss ob die Datei zu ende ist wie mache ich das?
-
So wird das nicht gehen, da fehlt noch einiges!
Du reservierst keinen Speicher für deine Listenelemente und fscanf funktioniert auch etwas anders.
Das Dateiende wird durch das Zeichen 'EOF' gekennzeichnet.
-
Und wie genau funktioniert fscanf kannst du mir ein Beispiel geben?
Edit: Das struct ELEMENT ist wo anders schon allociert die Speicherzuweisung sollte
hier eigentlich nicht das Problem seinEdit2: Und wie macht ich das genau mit dem EOF?
while(fp!=EOF){}
Geht nicht, was mache ich falsch
-
blizzarac schrieb:
Und wie genau funktioniert fscanf kannst du mir ein Beispiel geben?
fscanf erwartet Pointer auf die übergebenen Variablen nicht deren Werte.
fscanf("%d",&ergebnis->inhalt.x);
-
Beispiel hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fscanf.2c_.fwscanf.aspAber vor allem über die dynamische Speicherverwaltung solltest du nochmal nachdenken!
Bsp für verkettete Liste z.B. hier:
http://www.physik.uni-regensburg.de/studium/edverg/ckurs/script/script.html
-
Wie machen ich das mit der EOF Prüfung?
-
Wer lesen kann (und will) ist klar im Vorteil:
http://www.physik.uni-regensburg.de/studium/edverg/ckurs/script/script.html
Abschnitt "File I/O (Auswahl)".
-
GuybrushThreepwood, fuer dich: http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=index.html
blizzarac:
schon beim speichern musst du etwas anders machen:void speichern(ELEMENT *liste) { FILE *fp; ELEMENT *hz = liste; fp = fopen(DATEI, "w"); while(hz != NULL){ fprintf(fp, "%d %d\n", hz->inhalt.x, hz->inhalt.y); hz = hz->next; } fclose(fp); }
und dann beim laden so:
ELEMENT *laden(){ ELEMENT *ergebnis = NULL, *hier = NULL; FILE *fp = fopen(DATEI, "r"); while (!feof(fp) && !error(fp)) { hier = malloc(sizeof(ELEMENT)); // neues element erzeugen hier->next = ergebnis; // neues element an den anfang der liste stellen fscanf("%d %d\n", &hier->inhalt.x, &hier->inhalt.y); // neues element mit daten fuellen ergebnis = hier; // ergebnis anpassen } fclose(fp); return ergebnis; }
-
@c.rackwitz: thx, schöne Übersicht. Aber ich hab mich schon so an die lokal installierte MSDN gewöhnt...
-
Danke für die Antworten bin ein ganzes Stück weitergekommen
Habe jetzt allerdings ein weiters Problem,es sieht wie folgt aus.typedef struct{ int x; int y; }Punkt;
typedef struct element{ Punkt inhalt; struct element *next; }ELEMENT;
ELEMENT *punkt_entfernen(ELEMENT *liste){ ELEMENT *hz=liste; ELEMENT *hz2; Punkt *punkt; printf("Welchen Punkt wollen Sie Löschen\n"); printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(liste==NULL)return hz; else{ if(hz->inhalt==punkt){//<----Fehler Ungültiger Operanden hz2=liste->next; return hz2;} else{ hz2=liste->next; while(hz2!=NULL && hz2!=punkt){//<--Fehler Es fehlt eine //Typkonvertierung hz2=hz2->next; hz=hz->next;} } } if(hz2==NULL){ printf("Punkt nicht vorhanden\n"); return liste;} else{ hz->next=hz2->next; free(hz2); } return hz; }
-
punkt ist ein Punkt*
hz->inhalt ist ein Punkt
hz2 ist ein ELEMENT*
-
Das heißt man kann diese Typen nicht miteinander Vergleichen!ok
Ich muss diese Vergleiche aber durchführen, kann ich die Typen umwandeln
damit sie kompatibel sind oder gibt es eine andere lösung?
-
if(hz->inhalt == *punkt){// hab ich zum *punkt gemacht, damit ich den inhalt von punkt bekomme while(hz2!=NULL && hz2->inhalt != *punkt){// zugriff auf ->inhalt, wieder *punkt
ausserdem kannst du structs nicht so einfach vergleichen. du brauchst eine vergleichsfunktion (aehnlich wie bei strings, die kann man auch nicht mit einem == vergleichen).
-
punkt_anfügen funktioniert nicht richtig statt den eingegebenen werten werden
Nuller angefügt. Kann mir das nicht erklären und Montag ist abgabeELEMENT *erzeugen(Punkt p){ ELEMENT *ergebnis=(ELEMENT *)malloc(sizeof(ELEMENT)); ergebnis->inhalt=p; ergebnis->next=NULL; return ergebnis; }
ELEMENT *hinten_dran(ELEMENT *liste, Punkt punkt){ ELEMENT *ergebnis=liste; ELEMENT *hilfszeiger=liste; if (liste==NULL) return erzeugen(punkt); else{ while(hilfszeiger->next!=NULL) hilfszeiger=hilfszeiger->next; hilfszeiger->next=erzeugen(punkt); } return ergebnis; }
ELEMENT *punkt_anfuegen(ELEMENT *liste){ ELEMENT *hz=liste; hz=malloc(sizeof(ELEMENT)); Punkt *punkt=malloc(sizeof(ELEMENT)); printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(punkt_ok(*punkt)==true) { if(liste==NULL)erzeugen(*punkt); else { hinten_dran(hz,*punkt); printf("%d",hz->inhalt.x);//<-test=0 printf("%d",hz->inhalt.y);//<-test=0 } } else { printf("Die Koordinaten liegen nicht im Definitionsbereich\n"); return hz; } return hz; }
-
ELEMENT *punkt_anfuegen(ELEMENT *liste){ ELEMENT *hz=liste; // initialisierung ist unfug hz=malloc(sizeof(ELEMENT)); Punkt *punkt=malloc(sizeof(ELEMENT)); // falsch printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(punkt_ok(*punkt)==true) // ==true ist ueberfluessig { if(liste==NULL)erzeugen(*punkt); // warum? hast doch schin ein neues ELEMENT *hz und einen neuen Punkt *punkt else { hinten_dran(hz,*punkt); printf("%d",hz->inhalt.x);//<-test=0 printf("%d",hz->inhalt.y);//<-test=0 } } else { printf("Die Koordinaten liegen nicht im Definitionsbereich\n"); return hz; } return hz; }
weisst du was du machst? wo kommt der code her, mit dem du arbeitest?
-
Ich dachte jedenfalls das ich das weiß
Punkt_ok ist eine bool funktion die vorgegeben war also stimmt das true..Der Code ist hier zu finden
http://www.blizzarac.de/aufgabe36fragment.cIch muss schon zugeben das ich mit der Aufgabe etwas überfordert bin
habe aber keine wahl
-
ELEMENT *hz=liste;
vorgegeben
Punkt *punkt=malloc(sizeof(ELEMENT));
Wieso ist das Falsch? ohne stürzt das programm ab..
if(punkt_ok(*punkt)==true)
punkt_ok ist eine bool funktion also stimmts so
if(liste==NULL)erzeugen(*punkt);
hier wird eine neue liste mit dem eingegebenen punkt erzeugt hz hat ja keinen inhalt und wir sollen die erzeugen funktion nutzen (vorgegeben)
Was genau ist mein Fehler?
-
ELEMENT *hz=liste;
vorgegeben, wird aber in der naechsten zeile gleich anders belegt
Punkt *punkt=malloc(sizeof(ELEMENT));
falsch weil ELEMENT != Punkt
if(punkt_ok(*punkt)==true)
aber das ==true kannst du weglassen und das machst du bitte auch.
if(liste==NULL)erzeugen(*punkt);
das ergebnis von erzeugen() wird nicht mal benutzt...
dein fehler: du scheinst pointer, dynamischen speicher und verkettete listen noch nicht zu begreifen.
sprich deinen lehrer mal an. der kann dir das beibringen, weil er auf dich besser eingehen kann als ich z.b. hier im forum.
-
Naja da scheinst du wohl recht zu haben, werde mich drum kümmern müssen.
Ich muss das Programm jedoch bis Montag fertig schreiben es mach einen drittel der Fachnote aus also muss ichs irgentwie so hinbekommen.Ok die umbelegung von hz ist weg.
Punkt *punkt=malloc(sizeof(Punkt));
das hab ich geändert
==true weggelassen.
if(liste==NULL)hz=erzeugen(*punkt); und das so geändert das hz jetzt mit dem erzeugten Punkt anfängt.
ELEMENT *punkt_anfuegen(ELEMENT *liste){ ELEMENT *hz=liste; Punkt *punkt=malloc(sizeof(Punkt)); printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(punkt_ok(*punkt)) { if(liste==NULL)hz=erzeugen(*punkt); else { hinten_dran(hz,*punkt); printf("%d",hz->inhalt.x); printf("%d\n",hz->inhalt.y); } } else { printf("Die Koordinaten liegen nicht im Definitionsbereich\n"); return hz; } return hz; }
Funktioniert trotzdem nicht
-
der aufruf von hinten_dran() muss anders aussehen.