Listen Hilfe



  • inhalt ist ja kein Zeiger, also:

    fprintf(fp,"%d",hz->inhalt.x);
    


  • Ja stimmt danke.
    Habe jetzt ein weiteres Problem ich möchte die gespeicherten Punkte jetzt wieder in die Liste laden wie mache ich das?



  • Mit malloc neue Elemente erstellen, die Werte mit fscanf aus der Datei holen, das Element füllen und Listenzeiger umhängen.



  • #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 sein

    Edit2: 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.asp

    Aber 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 abgabe 😞

    ELEMENT *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.c

    Ich 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?


Anmelden zum Antworten