Liste von einem strukturierten Datentyp an eine Funktion übergeben



  • Beziehungweise die probleme gehen so weiter

    #define CRT_SECURE_NO_WARNINGS
    #define MAX_ANZAHL 30 
    #include<stdio.h>
    #include<stdlib.h>
    
    struct eintrag {		//Struktur definieren
    	char name[20];
    	char vorname[16];
    	char nummer[16];
    };
    
    //Funktion Ausgabe der gesamten Liste
    void ausgabe(struct eintrag *zeigeraufListe, int anzahl) {
    	printf("Nr. Name                Vorname       Nummer          \n");
    	printf("------------------------------------------------------\n");
    
    	for (int i = 0; i < anzahl, i++) {
    		printf("%-4i%-20s%-14s%-s\n", i + 1, liste[i].name, liste[i].vorname, liste[i].nummer);
    	}
    	printf("\n");
    	return 0;
    }
    //Variable liste vom Typ eintrag
    static struct eintrag liste[MAX_ANZAHL];
    
    int main() {
    	
    	int anzahl = 0;
    	int auswahl;
    
    	
    
    	do {
    		//Menütext
    		printf("Menue:\n", "1 - neuer Eintrag\n", "2 - Liste ausgeben\n", "3 - Eintrag loeschen\n", "4 - Programm beenden\n", "Auswahl:");
    		scanf_s("%d\n", &auswahl);
    		if (auswahl < 1 && auswahl > 5) {
    			printf("Fehlerhafte Eingabe!\n");
    			continue;
    		}
    		switch (auswahl) {
    		case 1: printf("Sie haben 'neuer Eintrag' gewaehlt\n");
    		case 2: printf("Sie haben 'Liste ausgeben' gewaehlt\n"); anzahl++; ausgabe(&liste, anzahl);
    		case 3: printf("Sie haben 'Eintrag löschen' gewaehlt\n");
    		case 4: printf("Sie haben 'Programm beenden' gewaehlt\n");
    		}
    
    	} while (auswahl != 4);
    
    
    }
    


  • @Th69 wie mache ich es richtig ? Wie die falsche Variable ?



  • Du verwendest liste, hast aber zeigeraufListe als Parameter deklariert.

    Nenne den Parameter am besten auch liste.

    PS: Es fehlen noch break-Anweisungen bei dem switch-Konstrukt.
    Und warum benutzt du anzahl++ vor der Ausgabe?



  • @furk Bitte kompiliere immer mit eingeschalteten Warnungen!

    $ gcc -Wall /tmp/forum.c -Wextra 
    /tmp/forum.c: In function ‘ausgabe’:
    /tmp/forum.c:17:28: warning: left-hand operand of comma expression has no effect [-Wunused-value]
       17 |  for (int i = 0; i < anzahl, i++) {
          |                            ^
    /tmp/forum.c:17:33: error: expected ‘;’ before ‘)’ token
       17 |  for (int i = 0; i < anzahl, i++) {
          |                                 ^
          |                                 ;
    

    Du hast Komma und Semikolon verwechselt.

    /tmp/forum.c:18:40: error: ‘liste’ undeclared (first use in this function)
       18 |   printf("%-4i%-20s%-14s%-s\n", i + 1, liste[i].name, liste[i].vorname, liste[i].nummer);
          |                                        ^~~~~
    /tmp/forum.c:18:40: note: each undeclared identifier is reported only once for each function it appears in
    

    Wie schon gesagt, zeigeraufListe und liste sind 2 Namen, du meinst aber dasselbe.

    /tmp/forum.c:21:9: warning: ‘return’ with a value, in function returning void [-Wreturn-type]
       21 |  return 0;
          |         ^
    /tmp/forum.c:13:6: note: declared here
       13 | void ausgabe(struct eintrag *zeigeraufListe, int anzahl) {
          |      ^~~~~~~
    

    Die Funktion ist void! Kein return!

    /tmp/forum.c: In function ‘main’:
    /tmp/forum.c:35:10: warning: too many arguments for format [-Wformat-extra-args]
       35 |   printf("Menue:\n", "1 - neuer Eintrag\n", "2 - Liste ausgeben\n", "3 - Eintrag loeschen\n", "4 - Programm beenden\n", "Auswahl:");
          |          ^~~~~~~~~~
    

    Auch das passt so nicht. printf nimmt einen Formatstring als Parameter und dann Argumente, die im Formatstring benannt sind. Du brauchst hier überhaupt keinen Formatstring, weil du nur einfach einen Text ausgeben willst (-> puts statt printf). Oder du schreibst alles in den Formatstring, hast dann aber keine weiteren Argumente.

    Und so weiter (da kommen noch mehr Warnungen).

    SCHALTE WARNUNGEN IMMER AN! Der Compiler hilft dir gerne, wenn du ihn fragst!



  • @wob Vielen Dank. Heißt das dann ich nehme statt "*zeigeraufListe" einfach nur "liste" oder doch wieder als Zeiger "*liste"



  • @furk Am besten Du nennst es garnicht irgendwas mit Liste weil es keine Liste ist.



  • @furk sagte in Liste von einem strukturierten Datentyp an eine Funktion übergeben:

    @wob Vielen Dank. Heißt das dann ich nehme statt "*zeigeraufListe" einfach nur "liste" oder doch wieder als Zeiger "*liste"

    "Zeiger auf Liste" ist sehr generisch und sagt mir gar nichts. Abgesehen davon, dass man unter einer Liste normalerweise auch eine (einfach oder doppelt) verkettete Liste versteht, siehe https://de.wikipedia.org/wiki/Liste_(Datenstruktur). Du hast aber einen zusammenhängenden Speicherbereich (->Array - auch wenn das Dinge mit malloc erzeugen kann und es dann streng genommen kein Array ist). Aber besser ist, wenn du es einfach danach benennst, was es enthält. In diesem Fall also zum Beispiel eintraege (im Plural, weil mehrere Einträge). Aber auch hier gilt: man kann bestimmt noch einen besseren Namen finden.



  • @Swordfish
    Naja...
    Es ist keine verkettete Liste, aber ich finde den Begriff Liste oft gar nicht so schlecht, selbst wenn es sich um ein Array handelt.

    Ich will oft einen Namen der sagt "das ist eine 'Liste' von X Objekten" -- wobei 'Liste' hier nur heisst: es gibt 0-N Elemente, und die Reihenfolge der Elemente ist "explizit" (im Gegensatz zu unspezifiziert wie in einem Hash-Set oder sortiert in einem sortierten Set). Und da bietet sich der Begriff "Liste" halt einfach an. Wie soll man es sonst nennen? Natürlich kann man "Sequenz" sagen. Aber das ist erstmal länger und dann auch IMO unnötiger Fach-Slang.

    Also ich nenne eine Funktion lieber FilterFileList als FilterFileSequence oder FilterFileArray. Oder wenn ich mehrere Server habe an die ich Daten schicken möchte, je nachdem welcher verfügbar ist, und ich will die in einer bestimmten Reihenfolge probieren, dann ist das Ding für mich auch keine Server-Sequence/-Array sondern eine Server-List. Und dann nenne ich die Klasse/die Variable auch so.



  • @hustbaer sagte in Liste von einem strukturierten Datentyp an eine Funktion übergeben:

    lieber FilterFileList als FilterFileSequence oder FilterFileArray

    Warum nicht FilterFiles? Gerade solche Funktionen können oft generisch sein und einfach auf einem Iteratorpaar (oder einer Range) arbeiten - unabhängig von der konkreten Datenstruktur darunter, solange man nur iterieren kann.



  • @wob
    Ja, kommt immer drauf an. Eine unserer Anwendungen, ein Updater, hat explizit mit File-Listen gearbeitet. Also wirklich Text-Files wo alle zu kopierenden Files drin standen plus diverse Regeln für jedes File. Da macht File-List schon viel Sinn. Nur FilterFiles wäre komisch.

    Aber ja, meistens könnte man FilterFiles oder FilterFileEntries machen.



  • @hustbaer Ja, bei Dir in Deinem Beispiel. Beim OP macht es 0 Sinn.



  • @hustbaer sagte in Liste von einem strukturierten Datentyp an eine Funktion übergeben:

    Und da bietet sich der Begriff "Liste" halt einfach an. Wie soll man es sonst nennen? Natürlich kann man "Sequenz" sagen.

    Man könnte Folge nehmen, Reihe hat ja wieder eine andere Bedeutung.



  • @Swordfish Wieso macht das beim OP Null Sinn? Konzeptionell ist es eine Liste. Es hat 0 bis N Elemente/Einträge vom gleichen Typ, die stehen in einer bestimmten Reihenfolge. Liste.

    Klar, man kann statt dessen auch sagen "eintraege, anzahl".

    Ich verstehe nur den Einspruch "das ist keine Liste" nicht. Weil es halt eine ist. Keine verkettete, aber das hat ja auch niemand behauptet.

    ps: Ich argumentiere hier nicht dafür dass es besser wäre es Liste zu nenne. Ich bin nur mit dem Argument/der Behauptung "es ist keine Liste" nicht einverstanden. Weil es in meinen Augen eben doch eine ist.


Anmelden zum Antworten