Fehler: ...struct typneudefinition... hä?



  • Fehler:

    Fehler 2 error C2143: Syntaxfehler: Es fehlt '{' vor '' Zeile 6
    Fehler 1 error C2143: Syntaxfehler: Es fehlt ')' vor '
    ' Zeile 6
    Fehler 16 error C2106: '=': Linker Operand muss ein L-Wert sein Zeile 38
    Fehler 3 error C2059: Syntaxfehler: ')' Zeile 6
    Fehler 4 error C2054: Nach 'p' muss '(' folgen Zeile 7

    Zeilen sind unten angegeben:

    main.c

    #include "prodinfo.h"
    #include "prodlist.h"
    #include <stdio.h>
    
    void loescheListe (ProdList **p)  //Zeile 6
    {                                 //Zeile 7
    	ProdList *p = liste;
    	while (liste)
    	{
    		free(liste->info);
    		p = liste->next;
    		free(liste);
    		liste = p;
    	}
    }
    
    int main (void)
    {
    	int i, produkte;
    
    	ProdListe *anfang = NULL, *neu = NULL, *aktuell = NULL;
        ProdInfo *prod, *p = NULL;
    
    	printf("Wieviele Produkte sollen eingelesen werden?\n");
        scanf("%d", &produkte);
    
    	for (i = 1; i <= produkte; i++)
        {       
            if (!(neu = malloc(sizeof(ProdListe))))
    		{	printf("Fehler, kein Speicher vorhanden\n");
    			loescheListe(&anfang);
    			exit(1);
    		}
    
    		if (i == 1)
    			anfang = neu;
    
    		aktuell = neu;
    
    		prod = einlesenProdukt;
    
    		einfuegenListe(&neu, prod);
    
    		aktuell = aktuell -> next = NULL;
    
        }
    
    	aktuell = anfang;
    
    	do
    	{
    		prod = naechstesProdukt (&aktuell);
    		ausgebenProdukt (prod);
    
    	} while (prod);
    
    		loescheListe(&anfang);
    
    	return 0;
    }
    

    prodlist.h

    #include "prodinfo.h"
    
    typedef 
    	struct prodliste {
    		ProdInfo * info;
    		struct prodliste * next;
    
    	} 
    ProdListe;
    
        void initListe (ProdListe ** liste);
    	/* Angegebene Liste wird initialisiert mit NULL */
    
    	void einfuegenListe (ProdListe ** liste, ProdInfo * produkt);
    	/* Angegebenes Produkt wird in die gegebene Liste eingefuegt */
    
        ProdInfo *naechstesProdukt (ProdListe ** liste);
    	/* Das naechste Produkt in der Liste wird zurueckgegeben,
    	   die Liste wird fortgeschaltet, so dass sie jetzt auf die 
    	   Restliste ohne das zurückgegebene Element zeigt
    	*/
    

    prodlist.c

    #include "prodlist.h"
    
    #include <stdlib.h>
    
    void initListe (ProdListe ** liste)
    {
    	*liste = NULL;
    
    }
    
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
    {
    	(*liste) -> info = produkt;
    }
    
    ProdInfo *naechstesProdukt (ProdListe ** liste)
    {	
    	 ProdInfo * p = NULL;
    
    	 p = (*liste) -> info;
    
    	 *liste = (*liste) -> next;
    
    	 return p;
    }
    

    prodinfo.h

    #ifndef PRODINFO__H
    #define PRODINFO__H
    
    typedef struct prodinfo { char name [20];
    					  double preis;
    	} ProdInfo;
    
    void ausgebenProdukt (ProdInfo * prod);
    /* Ausgeben der Produktinformation am Bildschirm */
    
    ProdInfo * einlesenProdukt (void);
    /* Einlesen der Produktinformation, 
       Beschaffen von Speicher für die Info
       und Rueckgabe eines Zeigers auf die Info */
    
    #endif
    

    prodinfo.c

    #include <stdio.h>
    #include "prodinfo.h"
    
    void ausgebenProdukt (ProdInfo * prod)
    /* Ausgeben der Produktinformation am Bildschirm */
    {	
    	static int i = 1;
    
    	while (prod)
    	{
    		printf("%d. Produkt:  Produktname ist %s , der Preis beträgt %d .\n", i++, prod->name, prod->preis);
    	}
    }
    
    ProdInfo * einlesenProdukt (void)
    /* Einlesen der Produktinformation, 
       Beschaffen von Speicher für die Info
       und Rueckgabe eines Zeigers auf die Info */
    {
    	ProdInfo * p;
    	char *zeichen;
    	char *zahlen;
    
    	if (!(p = malloc(sizeof(ProdInfo))))
    	{
    		printf("Fehler, kein freier Speicher!\n");
    		exit(1);
    	}
    	printf("Bitte geben Sie den Produktnamen ein: \n");
    	printf("(1) Zeichen :  ");
    	scanf("%s", zeichen);
    	printf("(2) Zahlen :  ");
    	scanf("%s", zahlen);
    
    	strcat(zeichen, "   ");
    	strcat(zeichen, zahlen);
    
    	p -> name  = zeichen;  //Zeile 38
    
    	p -> preis = 1;
    	// zufallsgenerator der die preise zufällig ermittelt, kommt noch
    	return p;
    }
    


    1. main.c, Zeile 8: Du verdeckst den übergebenen Parameter p.
    2. main.c, Zeile 8: "liste" ist ein unbekannter Bezeichner.
    3. prodlist.h, Zeile 1: Include-Guard fehlt
    4. prodinfo.c, Zeile 31: Du liest eine Zeichenkette in "zeichen" ein, zeichen ist jedoch ein uninitialisierter Zeiger. Scanf allokiert keinen Speicher für dich. Das musst du selbst machen.
    5. prodinfo.c, Zeile 38: Du weißt eine Variable vom Typ char[20] den Typ char* zu, das kann nicht gut gehen. Benutze die Funktion strncpy um die Zeichenkette zu kopieren.

    Fehler die man so beim rüberschauen sieht.



  • Danke, hab eben noch nicht so viel erfahrung mit c, sodass ich da teilweise mehrmals drüberlese und einfach kein Fehler find.. 😞 deswegen danke für die Hilfe die ich dringend brauch..

    2), 4) und 5) hab ich verstanden und verbessert..

    zu 3) brauch ich den Include Guard? ich inkludiere nur in main und der zugehörogen inplementierungsdatei.. ich mein ist sicherer, aber geht in dem Fall auch ohne oder nicht??

    zu 1) habe die Funktion verändert, aber es erscheinen immernoch diesselben Fehler, was ist hier falsch?? 😕

    void loescheListe (ProdList *p)
    {
    	ProdList *hilf;
    
    	while (p)
    	{
    		hilf = p->next;
    		free(p->info);
    		free(p);
    		p = hilf;
    	}
    }
    


  • void loescheListe (ProdList *p)
    {
    	ProdList *hilf;
    
    	while (p)
    	{
    		hilf = p->next;
    		free(p->info);
    		free(p);
    		p = hilf;
    	}
    }
    

    erst free(p) machen und dann nochmal p->next holen wollen darf nicht sein.



  • volkard schrieb:

    void loescheListe (ProdList *p)
    {
    	ProdList *hilf;
    
    	while (p)
    	{
    		hilf = p->next;
    		free(p->info);
    		free(p);
    		p = hilf;
    	}
    }
    

    erst free(p) machen und dann nochmal p->next holen wollen darf nicht sein.

    Macht er auch gar nicht.



  • Janjan schrieb:

    volkard schrieb:

    void loescheListe (ProdList *p)
    {
    	ProdList *hilf;
    
    	while (p)
    	{
    		hilf = p->next;
    		free(p->info);
    		free(p);
    		p = hilf;
    	}
    }
    

    erst free(p) machen und dann nochmal p->next holen wollen darf nicht sein.

    Macht er auch gar nicht.

    Stimmt. Ich nehme alles zurück.



  • ohje ohje, der Fehler liegt nur darin, dass ich in loescheListe "Prodlist" anstatt "Prodliste" schreibe.. okay, jetzt hab ich nur noch irgendwo ne Dauerschleife, aber das krieg ich hoffentlich alleine hin, wenigstens keine Fehler mehr

    Aber was sind das für bescheuerte Fehlermeldungen, anstatt dass es heißt Prodlist nicht definiert o.Ä..



  • spaxx999 schrieb:

    Aber was sind das für bescheuerte Fehlermeldungen, anstatt dass es heißt Prodlist nicht definiert o.Ä..

    Das können wir nur schwer beurteilen, wenn du sie uns nicht verrätst.
    🙂



  • mngbd schrieb:

    spaxx999 schrieb:

    Aber was sind das für bescheuerte Fehlermeldungen, anstatt dass es heißt Prodlist nicht definiert o.Ä..

    Das können wir nur schwer beurteilen, wenn du sie uns nicht verrätst.
    🙂

    stehen 2mal auf der ersten Seite, aber wurden jetzt behoben.. Such nur noch nach der Dauerschleife, es kommt nichtmal zur Abrage des Produktnamens durch "einlesenProdukt" ...



  • spaxx999 schrieb:

    stehen 2mal auf der ersten Seite, aber wurden jetzt behoben.. Such nur noch nach der Dauerschleife, es kommt nichtmal zur Abrage des Produktnamens durch "einlesenProdukt" ...

    Hast recht, ich hab was übersehen.

    spaxx999 schrieb:

    Such nur noch nach der Dauerschleife, es kommt nichtmal zur Abrage des Produktnamens durch "einlesenProdukt" ...

    Mach mal ein minimales Beispiel in einem Source-File draus oder lad irgendwo einen Tarball mit den Files hoch. Die Files aus dem HTML-Text zu holen und die Änderungen händisch nachzuvollziehen ist mir echt zu anstrengend.
    🙂


Anmelden zum Antworten