Problem mit Strukturen



  • Hallo zusammen,

    ich soll für die Uni ein Programm schreiben, was Artikel aus einer Datei einliest und diese dann auswertet.

    Erste Aufgabe ist die Gesamtzahl aller unterschiedlichen Artikel zu ermitteln.

    Dazu haben wir folgende vorgegebenen Teile:

    Modul lagdat.c

    #include <stdio.h>
    #include "lagdat.h"
    
    static FILE *fp = NULL;
    
    int openLager(void) {
    	char bestands_datei_name[] = lagerdateiname;
    
    	if((fp=fopen(bestands_datei_name,"rb"))==NULL) {
    		printf(" - Dateifehler!\n");
    		return -1;
    	}
    	return 0;
    }
    
    int readNext(struct artikel_t * aptr) {
    	if(fp==NULL)
    		return -1;
    	if(fread(aptr,sizeof(struct artikel_t),1,fp) > 0)
    		return 0;
    	fclose(fp);
    	fp=NULL;
    	return -1;
    }
    

    Header-Datei lagdat.h

    #define MAXCHAR 40
    #define lagerdateiname "lager.dat"
    
    struct artikel_t{
    	int artnr;
       	char bezeichner[MAXCHAR];
       	float preis;
       	int anzahl;
    	int min;
        } ;
    
    extern int openLager(void);
    extern int readNext(struct artikel_t *);
    

    Lagerdatei lager.dat

    Darin stehen die ganzen Artikel drin.

    Die Artikel sind wie ihr seht als Struktur definiert, deswegen wollte ich mir einfach mal die Artikelnummer des ersten Artikels ausgeben lassen und habe dafür in meinem Modul folgenden Code benutzt:

    #include <stdio.h>
    #include "lagdat.h"
    
    void main(void)
    {
    	if(openLager()==0)
    		printf("Status:\tDatei erfolgreich geladen!\n\n");
    	else
    		printf("Status:\tFehler beim Laden der Datei!\n\n");
    
    struct artikel_t var;
    
    printf("%d", var.artnr);
    
    }
    

    Dabei haut er mir aber 3 Fehlermeldungen raus, nämlich:

    D:\Programme\VS2006\MSDev98\MyProjects\Versuch 4\Versuch4.c(16) : error C2143: Syntaxfehler : Fehlendes ';' vor 'type'
    D:\Programme\VS2006\MSDev98\MyProjects\Versuch 4\Versuch4.c(18) : error C2065: 'var' : nichtdeklarierter Bezeichner
    D:\Programme\VS2006\MSDev98\MyProjects\Versuch 4\Versuch4.c(18) : error C2224: Der linke Teil von '.artnr' muss eine Struktur/Union sein

    Die verstehe ich jetzt aber alle 3 nicht:

    zur ersten: Wo soll da ein ; fehlen?

    zur zweiten: Warum ist var nicht deklariert, ich hab ihn doch grade eben deklariert oder nicht?

    zur dritten: Warum erkennt er nicht dass der linke teil von artnr eine Struktur ist?

    Hoffe ihr könnt mir weiterhelfen, ich blick im Moment wirklich nicht durch wo mein Fehler liegt.... 😞



  • Er (der Compiler) erkennt schon eine Struktur, aber du kennst die C89 Vorschrift zur Positionierung von Variablendefinitionen nicht. D.h. der Compiler hat Recht und du nicht.

    >> Sollte wohl verschoben werden >>
    


  • Ok, könntest du mir dann bitte sagen wo ganz konkret mein Fehler liegt? Wo soll ich welche Variablendefinition positionieren?

    D.h. der Compiler hat Recht und du nicht.

    Äh ja? Natürlich hat der Compiler recht, schließlich hab ich ja irgendwo einen Fehler drin, das ist mir schon klar. Nur nicht wo genau und wie ich diesen beheben kann.



  • Du entwicklest hier in C und nicht C++. Deine Definition der Varaible muss am Kopf einen Blockes erfolgen!

    Ansonsten verwende Code-Tags. Ich habe Deine Anfrage editiert...



  • Ok vielen Dank, jetzt hat es geklappt! 🙂

    Habe aber gleich noch eine Frage, angenommen ich habe einige Variable vom Typ struct und will diese in ein Array vom gleichen Typ struct schreiben, kann ich das auch in einer Schleife automatisieren oder muss ich jeden einzelnen Wert extra zuweisen? Hier ein Beispiel:

    #include <stdio.h>
    #define MAXCHAR 40
    #define ANZ 5
    
    struct artikel_t{ //Dies ist meine Struktur
    	int artnr;
    	int anzahl;
    	int min;
    };
    
    void main(void)
    {
    
    	struct artikel_t var={1,5,7}, var2={2,6,2}, var3={1,2,3}, var4={4,5,6}, var5={8,9,10}; //Hier werden meine 5 Variablen definiert
    
    	struct artikel_t Arr[ANZ]={0,0,0}; //Hier wird das Array definiert
    
    	int i=0;
    
             //Hier lasse ich mir zur Kontrolle alle Variablen ausgeben
    	printf("%d   %d  %d\n",var.artnr, var.anzahl, var.min); 
    	printf("%d   %d  %d\n",var2.artnr, var2.anzahl, var2.min);
    	printf("%d   %d  %d\n",var3.artnr, var3.anzahl, var3.min);
    	printf("%d   %d  %d\n",var4.artnr, var4.anzahl, var4.min);
    	printf("%d   %d  %d\n\n",var5.artnr, var5.anzahl, var5.min);
    
              //Hier lasse ich mir das noch leere Array zur Kontrolle ausgeben
    	for(i=0;i<ANZ;i++)
    	{
    		printf("%d %d %d\n",Arr[i].anzahl, Arr[i].artnr, Arr[i].min);
    	}
    
    	printf("\n");
    
               //Hier weise ich die Variablen zu und das wurde ich gerne in einer Schleife automatisieren
    	Arr[0]=var;
    	Arr[1]=var2;
    	Arr[2]=var3;
    	Arr[3]=var4;
    	Arr[4]=var5;
    
                //Hier lasse ich zur Kontrolle das fertige Array ausgeben
    	for(i=0;i<ANZ;i++)
    	{
    		printf("%d %d %d\n",Arr[i].artnr, Arr[i].anzahl, Arr[i].min);
    	}
    
    }
    
    Am liebsten würde ich etwas in der Art verwenden:
    
    for(i=0;i<ANZ;i++)
    {
    	Arr[i]=vari; //Bei i=1 wäre "vari" dann gleich var1 usw.
    }
    

    Geht so etwas? Denn wenn ich sehr viele Variablen vom Typ großer Strukturen in ein großes Array speichern will muss ich ja ewig schreiben.... kann man das in einer Schleife realisieren und wenn ja wie?

    Danke schonmal für die Hilfe,

    eey



  • Warum initialisierst Du nicht den Aray direkt, anstatt unsinnigerweise einzelne Variablen zu verwenden.

    struct artikel_t Arr[ANZ]=
    {
     {1,5,7}, 
     {2,6,2}, 
     {1,2,3}, 
     {4,5,6}, 
     {8,9,10},
    };
    


  • Naja, also das hier ist quasi ein minimal-Beispiel für mich um zu verstehen wie man Variablen vom Typ struct in ein Array speichert.

    Die eigentliche Aufgabe ist es, die Variablen aus einer Textdatei einzulesen (aus meinem ersten Beitrag, das klappt jetzt) und diese dann in ein Array zu speichern - also hab ich doch erstmal nur die ganzen Variablen und muss diese irgendwie in ein Array schreiben, oder kann ich das auch direkt initialisieren?

    Geht mein Vorschlag prinzipiell oder ist es nicht möglich variablen quasi einen Index zu geben und diesen zu durchlaufen?



  • Was verstehst Du nicht?
    Du hast in diesem Fall nicht x-Variablen sondern eine Schleife mit einer.
    Direkt in der Schleife lädst Du die Daten in den Array um.

    Wie kommst Du darauf, dass Du sowas wie var1, var2, var3, var4 etc, brauchst?



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • eey schrieb:

    Geht so etwas?

    Ja.



  • Wutz schrieb:

    eey schrieb:

    Geht so etwas?

    Ja.

    Ok und wie ist die Syntax dafür? Denn so wie ich es in meinem Beispiel formuliert habe ("vari") geht es ja nicht.

    Martin Richter schrieb:

    Was verstehst Du nicht?
    Du hast in diesem Fall nicht x-Variablen sondern eine Schleife mit einer.
    Direkt in der Schleife lädst Du die Daten in den Array um.

    Wie kommst Du darauf, dass Du sowas wie var1, var2, var3, var4 etc, brauchst?

    In der Angabe (Teil 2) steht:

    "Die Funktion OrderArr() hat die Aufgabe alle jene Artikel in ein Array zu übernehmen, deren Anzahl die Mindestmenge unterschritten hat. Übergabeparameter sind der Zeiger auf das Array mit Elementen vom Typ "struct artikel_t" und der Umfang dieses Arrays. Rückgabeparameter ist die Anzahl der tatsächlich ins Array eingetragenen Datensätze. Definieren Sie das geeignet Dimensionierte Array in "main()" und realisieren Sie "OrderArr()"!

    Also, die Artikel sind doch in der Textdatei einzeln gespeichert, also muss ich die doch erstmal in ein Array reinschreiben oder?

    Teil 1 der Aufgabe war:

    "Ermitteln Sie die Gesamtzahl unterschiedlicher Artikel und den Gesamtwert aller Artikel, die sich im Lager befinden und geben Sie diese in geeigneter Form auf dem Bildschirm aus!"

    Das hab ich so gemacht:

    #include <stdio.h>
    #include "lagdat.h"
    #define MAX 100
    
    struct artikel_t var, *p_var;
    int OrderArr(struct artikel_t * , int );
    
    void main(void)
    {
    struct artikel_t Arr1[MAX];
    struct artikel_t Arr2[MAX];
    struct artikel_t *p_Arr2;
    
    int anz=0,i=0;
    float aku=0;
    
    printf("Lagerverwaltung Drogerie, Versuch 3, Programmieren E4A\n\n");
    
    	if(openLager()==0)
    		printf("Status:\tDatei erfolgreich geladen!\n\n\n");
    	else
    		printf("Status:\tFehler beim Laden der Datei!\n\n\n");
    
    p_var=&var;
    
    printf("Lfd.Nr.\tArt.Nr\tArtikel\t\t\tLagerbestand\t Preis\t\tGesamt\n");
    printf("--------------------------------------------------------------------------------\n");
    
    while(readNext( p_var)!=-1)
    {
    	anz++;
    
    	Arr1
    
    	printf("%d\t%d\t", anz,p_var->artnr);
    
    	i=0;
    	while(p_var->bezeichner[i]!='\0')
    	{
    		printf("%c",p_var->bezeichner[i]);
    		i++;
    
    	}
    
    	if(i<8)
    		printf("\t\t\t");
    	else
    		printf("\t\t");
    
    	aku = aku + p_var->anzahl*p_var->preis;
    
    	//Anzahl Rechtsbündig formatieren
    	if(p_var->anzahl<10)
    		printf("  %d\t\t",p_var->anzahl);
    	else if(p_var->anzahl<100)
    		printf(" %d\t\t",p_var->anzahl);
    	else
    		printf("%d\t\t",p_var->anzahl);
    
    	//Preis Rechtsbündig formatieren
    	if(p_var->preis<10)
    		printf("  %.2f\t\t",p_var->preis);
    	else if(p_var->preis<100)
    		printf(" %.2f\t\t",p_var->preis);
    	else
    		printf("%.2f\t\t",p_var->preis);
    
    	//Gesamtpreis Rechtsbündig formatieren
    	if(p_var->preis*p_var->anzahl<10)
    		printf("   %.2f\t",p_var->preis*p_var->anzahl);
    	else if(p_var->preis*p_var->anzahl<100)
    		printf("  %.2f\t",p_var->preis*p_var->anzahl);
    	else if(p_var->preis*p_var->anzahl<1000)
    		printf(" %.2f\t",p_var->preis*p_var->anzahl);
    	else
    		printf("%.2f\t",p_var->preis*p_var->anzahl);
    
    }
    printf("--------------------------------------------------------------------------------\n");
    printf("\t\t\t\t\t\t\tSumme:\t       %.2f\n\n", aku);
    
    p_Arr2=Arr2;
    
    OrderArr(p_Arr2, anz);
    
    }
    
    int OrderArr(struct artikel_t p_Arr2[MAX] , int anz )
    {
    
    	int i=1;
    
    	while(i<anz)
    	{
    		if(p_var->anzahl < p_var->min)
    			 printf("\t%d  %d   %d  zu wenig\n", i,p_var->anzahl, p_var->min);
    		else
    			printf("\t%d   %d   %d  genug\n", i, p_var->anzahl, p_var->min);
    
    		i++;
    	}
    }
    

    Also hab ich doch jetzt meine Artikel in der Variable var, und diese würde ich gerne innerhalb der while schleife in ein Array schreiben und dass weiß ich nicht wie es geht (außer eben einzeln, was aber eben extrem umständlich und unflexibel ist)

    Bin für jede Hilfe die länger als 3 Wörter ist dankbar 🙂



  • Keiner hier eine Idee?



  • bin jetzt net der Pro in C, aber der Code erscheint mir undurchsichtig.

    - Zeile 35: 😕
    - ab Zeile 55:

    if(p_var->anzahl<10)
            printf("  %d\t\t",p_var->anzahl);
        else if(p_var->anzahl<100)
            printf(" %d\t\t",p_var->anzahl);
        else
            printf("%d\t\t",p_var->anzahl);
    
    // vielleicht doch lieber so:
    printf("%4d\t\t",p_var->anzahl);
    

    Um die Sachen von irgendeiner Variablen in eine andere zu bekommen, empfehle ich erstmal das simple "wert-fuer-wert-kopieren"

    Arr1[0].anzahl = p_var->anzahl;
    Arr1[0].preis = p_var->preis;
    
    // und im naechsten Schleifendurchlauf
    Arr1[1].anzahl = p_var->anzahl;
    Arr1[1].preis = p_var->preis;
    


  • Wo ist in deiner OrderArr-Funktion die benutzte Variable "p_var" deklariert?
    Wo ist das geforderte return?



  • BasicMan01 schrieb:

    Wo ist in deiner OrderArr-Funktion die benutzte Variable "p_var" deklariert?
    Wo ist das geforderte return?

    Jo, war etwas chaotisch. Habs jetzt verbessert und läuft, Danke für die Hilfe.

    BasicMan01 schrieb:

    bin jetzt net der Pro in C, aber der Code erscheint mir undurchsichtig.

    - Zeile 35: 😕
    - ab Zeile 55:

    if(p_var->anzahl<10)
            printf("  %d\t\t",p_var->anzahl);
        else if(p_var->anzahl<100)
            printf(" %d\t\t",p_var->anzahl);
        else
            printf("%d\t\t",p_var->anzahl);
    
    // vielleicht doch lieber so:
    printf("%4d\t\t",p_var->anzahl);
    

    Um die Sachen von irgendeiner Variablen in eine andere zu bekommen, empfehle ich erstmal das simple "wert-fuer-wert-kopieren"

    Arr1[0].anzahl = p_var->anzahl;
    Arr1[0].preis = p_var->preis;
    
    // und im naechsten Schleifendurchlauf
    Arr1[1].anzahl = p_var->anzahl;
    Arr1[1].preis = p_var->preis;
    

    Danke auch für die Hilfe, habs jetzt so gemacht und hinbekommen. Die Zeile 35 war in der Tat unsinn :). Ab Zeile 55 ist aber mMn schon wichtig, da es die ausgabe des Preises rechtsbündig formatiert und man die einzelnen Preise sonst nicht vernünftig und übersichtlich vergleichen kann. Falls es euch interessiert hier der Quellcode:

    #include <stdio.h>
    #include "lagdat.h"
    #define MAX 100
    
    struct artikel_t var, *p_var;
    int OrderArr();
    void OrderList();
    void OrderSort();
    
    void main(void)
    {
    
    struct artikel_t Arr[MAX];
    
    int anz=0,i=0,j=0, orderanz=0;
    float aku=0;
    
    p_var=&var;
    
    printf("Lagerverwaltung Drogerie \n\n");
    
    	if(openLager()==0)
    		printf("Status:\tDatei erfolgreich geladen!\n\n\n");
    	else
    		printf("Status:\tFehler beim Laden der Datei!\n\n\n");
    
    printf("Lfd.Nr. Art.Nr  Artikel\t\t\tLagerbestand\tPreis\t\tGesamt\n");
    printf("--------------------------------------------------------------------------------");
    
    while(readNext( p_var)!=-1)
    {
    	anz++;
    
    	printf("%d\t%d\t", anz,p_var->artnr);
    
    	i=0; 
    	while(p_var->bezeichner[i]!='\0')
    	{
    		printf("%c",p_var->bezeichner[i]);
    		i++;
    
    	}
    
        if(i<8)
            printf("\t\t");
        else
            printf("\t"); 
    
    	aku = aku + p_var->anzahl*p_var->preis;
    
    	printf("\t%d",p_var->anzahl);
    
    	//Preis rechts formatieren
    	if(p_var->preis<10)
    		printf("\t\t %.2f\t",p_var->preis);
    	else if(p_var->preis<100)
    		printf("\t\t%.2f\t",p_var->preis);
    
    	//Gesamtpreis rechts formatieren
    	if(p_var->preis*p_var->anzahl<10)
    		printf("\t   %.2f",p_var->preis*p_var->anzahl);
    	else if(p_var->preis*p_var->anzahl<100)
    		printf("\t  %.2f",p_var->preis*p_var->anzahl);
    	else if(p_var->preis*p_var->anzahl<1000)
    		printf("\t %.2f",p_var->preis*p_var->anzahl);
    	else 
    		printf("\t%.2f",p_var->preis*p_var->anzahl);
    
    	printf("\n");
    
    }
    printf("--------------------------------------------------------------------------------\n");
    printf("\t\t\t\t\t\t\tSumme:\t       %.2f\n\n", aku);
    
    orderanz = OrderArr(&Arr, MAX);
    
    OrderList(&Arr, orderanz);
    OrderSort(&Arr, orderanz);
    
    }
    
    int OrderArr(struct artikel_t Arr[] , int anz )
    {
    	struct artikel_t orderList;
    	int data=0, datacheck=0, k=0;
    
    	datacheck=openLager();
    	data = readNext (&orderList);
    
    	while(data!=-1)
    	{
    		if(orderList.anzahl < orderList.min)
    		{
    			Arr[k] = orderList;
    			k++;
    
    		}
    		data = readNext(&orderList);
    
    	}
    
    	return k;
    }
    
    void OrderList(struct artikel_t Arr[] , int orderanz)
    { 
    	int i=0, j=0;
    	float aku=0;
    
    	printf("Bestellliste:\n\n");
    	printf("Lfd.Nr. Art.Nr  Artikel\t\t\tBestellmenge\tPreis\t\tGesamt\n");
    	printf("--------------------------------------------------------------------------------");
    
    	for(i=0;i<orderanz;i++)
    	{
    		aku = aku + Arr[i].anzahl*Arr[i].preis;
    		printf("%d\t",i+1);
    		printf("%d\t",Arr[i].artnr);
    
    		while(Arr[i].bezeichner[j]!='\0')
    		{
    			printf("%c",Arr[i].bezeichner[j]);
    			j++;
    		}
    
    		if(j<8)
    		  printf("\t\t\t");
    		else
    		   printf("\t\t");
    
    		j=0;
    
    		printf("%d\t\t",4*Arr[i].min-Arr[i].anzahl);
    
    		//Preis rechts formatieren
    		if(p_var->preis<10)
    			printf(" %.2f\t\t",Arr[i].preis);
    		else if(p_var->preis<100)
    			printf("%.2f\t\t",Arr[i].preis);
    
    		//Gesamtpreis rechts formatieren
    		if(Arr[i].anzahl*Arr[i].preis<10)
    			printf("   %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else if(Arr[i].anzahl*Arr[i].preis<100)
    			printf("  %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else if(Arr[i].anzahl*Arr[i].preis<1000)
    			printf(" %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else 
    			printf("%.2f\n",Arr[i].anzahl*Arr[i].preis);
    
    	}
    	printf("--------------------------------------------------------------------------------\n");
    	printf("\t\t\t\t\t\t\tSumme:\t       %.2f\n\n", aku);
    }
    
    void OrderSort(struct artikel_t Arr[] , int orderanz)
    { 
    	int i=0, j=0;
    	float aku=0;
    	struct artikel_t hilf;
    
    	for(i=orderanz-1; i>0; i--)
        {
    		for (j=0; j<i; j++)
            {
                if (Arr[j].artnr>Arr[j+1].artnr)
                { 
                    hilf = Arr[j];
                    Arr[j] = Arr[j+1];
                    Arr[j+1] = hilf;
                }
            }
    	}
    	j=0;
    
    	printf("Bestellliste(nach Art.Nr):\n\n");
    	printf("Lfd.Nr. Art.Nr  Artikel\t\t\tBestellmenge\tPreis\t\tGesamt\n");
    	printf("--------------------------------------------------------------------------------");
    
    	for(i=0;i<orderanz;i++)
    	{
    		aku = aku + Arr[i].anzahl*Arr[i].preis;
    		printf("%d\t",i+1);
    		printf("%d\t",Arr[i].artnr);
    
    		while(Arr[i].bezeichner[j]!='\0')
    		{
    			printf("%c",Arr[i].bezeichner[j]);
    			j++;
    		}
    
    		if(j<8)
    		  printf("\t\t\t");
    		else
    		   printf("\t\t");
    
    		j=0;
    
    		printf("%d\t\t",4*Arr[i].min-Arr[i].anzahl);
    
    		//Preis rechts formatieren
    		if(p_var->preis<10)
    			printf(" %.2f\t\t",Arr[i].preis);
    		else if(p_var->preis<100)
    			printf("%.2f\t\t",Arr[i].preis);
    
    		//Gesamtpreis rechts formatieren
    		if(Arr[i].anzahl*Arr[i].preis<10)
    			printf("   %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else if(Arr[i].anzahl*Arr[i].preis<100)
    			printf("  %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else if(Arr[i].anzahl*Arr[i].preis<1000)
    			printf(" %.2f\n",Arr[i].anzahl*Arr[i].preis);
    		else 
    			printf("%.2f\n",Arr[i].anzahl*Arr[i].preis);
    
    	}
    	printf("--------------------------------------------------------------------------------\n");
    	printf("\t\t\t\t\t\t\tSumme:\t       %.2f\n\n\n", aku);
    }
    

    Danke nochmal an alle die mir geholfen haben 🙂

    Mal noch eine kleine Frage am Rande: Mein Programm läuft jetzt zwar, allerdings würde ich gerne den Code der Funktion OrderList reduzieren, weil die ja bis auf das Sortieren des Arrays das gleiche macht wie OrderList. Ich hab einfach folgendes ausprobiert:

    void OrderSort(struct artikel_t Arr[] , int orderanz)
    {
        int i=0, j=0;
        float aku=0;
        struct artikel_t hilf;
    
        for(i=orderanz-1; i>0; i--)
        {
            for (j=0; j<i; j++)
            {
                if (Arr[j].artnr>Arr[j+1].artnr)
                {
                    hilf = Arr[j];
                    Arr[j] = Arr[j+1];
                    Arr[j+1] = hilf;
                }
            }
        }
        j=0;
    
        OrderList();
    }
    

    Das hat aber nicht funktioniert. Der Compiler meldett zwar keinen Fehler, aber die Ausgabe spuckt nur noch Buchstabensuppe aus. Warum funktioniert das nicht, eigentlich müsste sich die Funktion doch problemlos aufrufen lassen, oder?


Log in to reply