Liste von einem strukturierten Datentyp an eine Funktion übergeben
-
Die liste vom Typ eintrag muss ich an die Funktion ausgabe übergeben, damit die Elemente der Liste für jeden Eintrag asugegeben werden.
Unten seht ihr meine Fehlermeldungen.
Danke für eure Hilfe.#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]; }; int main() { //Variable liste vom Typ eintrag static struct eintrag liste[MAX_ANZAHL]; int anzahl = 0; int auswahl; //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; } 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); }
Es fehlt ein ";" vor "{". 20
Es fehlt ein ";" vor ")" 24Das Programm stoppt direkt bei Start.
-
C unterstützt keine lokalen Funktionen, d.h. du mußt
ausgabe
außerhalb dermain
platzieren.
-
@furk sagte in Liste von einem strukturierten Datentyp an eine Funktion übergeben:
Das Programm stoppt direkt bei Start.
Nein, es wird erst gar nicht übersetzt.
Du kannst in C keine Funktion innerhalb einer anderen Funktion definieren.
-
@Th69 danke, dann entsteht aber das Problem, dass die funktion ausgabe außerhalb von main liste nicht mehr findet, da diese innerhalb von main definiert wurde
-
Dann übergebe diese auch als Parameter an die Funktion.
Edit: Sehe gerade, daß du das ja schon machst, aber du verwendest die falsche Variable in der Funktion!
-
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 aberzeigeraufListe
als Parameter deklariert.Nenne den Parameter am besten auch
liste
.PS: Es fehlen noch
break
-Anweisungen bei demswitch
-Konstrukt.
Und warum benutzt duanzahl++
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
undliste
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
stattprintf
). 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
alsFilterFileSequence
oderFilterFileArray
. 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. NurFilterFiles
wäre komisch.Aber ja, meistens könnte man
FilterFiles
oderFilterFileEntries
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.