Funktion: Student + Matrikelnr eingeben in Struktur... Hilfe



  • ich würds ja void_student eingabe() nennen... . Vllt wird aus dem dann was 🤡

    Ok, ernsthaft,

    eingabe.name = malloc(sizeof(eingabe));
    

    überleg dir ma wieviel Speicher du da bekommst und was das mit der Länge des Namens zu tun hat.

    Edit: Huch Cooky und DirkB hats schon bemängelt, sry. Ich kann heut nich lesen.
    Aber dann halt meinetwegen für sizeof(char)



  • Danke für euren schnellen Antworten!
    Klasse!

    Also das Prog läuft jetzt, hab das scanf verändert und die malloc anweisung.

    Ja wir benutzen Mocrosoft Visual Studio (ich weiß ist blöd aber wir müssen ihn halt benutzen).



  • Der Compiler ist ja nicht das Problem 😉

    Nur, wenn eure Lehrenden nur Mircosoft-C statt Standard-C akzeptieren, dann kann das für den einen oder anderen Fragesteller schwierig werden 🤡

    MfG f.-th.



  • C-Schueler 2012 schrieb:

    Also das Prog läuft jetzt, hab das scanf verändert und die malloc anweisung

    Zeig noch mal her.

    C-Schueler 2012 schrieb:

    Ja wir benutzen Mocrosoft Visual Studio (ich weiß ist blöd aber wir müssen ihn halt benutzen).

    Warum ist das blöd?
    Ist nur wichtig zu wissen welchen Compiler du hast, um dir besser Helfen zu können.



  • Ich trau mich ja gar nicht den neuen Code zu posten, ist bestimmt alles andere als professionell, aber hey der Compiler erzeugt keine Fehlermeldung und nur die Warnung dass scanf unsicher sein könnte (aber das ist ja Compiler abhängig, oder?)

    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    
    struct Student {
    		int matnr;
    		char *name;
    	};
    typedef struct Student StudiTyp;
    StudiTyp eingabe;
    
    void student_eingeben (){
    	printf ("Bitte geben Sie eine Matnr ein:\n");
    	scanf ("%i", &eingabe.matnr);
    	printf ("Bitte geben Sie einen Namen ein\n");
    	eingabe.name = (char*)malloc(sizeof(char));
    	scanf ("%s", eingabe.name);
    	printf ("%i\n", eingabe.matnr);
    	printf ("%s", eingabe.name);
    	return;
    }
    void student_eingeben ();
    int main (){
    	student_eingeben ();
    	_getch ();
    return 0;
    }
    

    Bevor ihr jetzt anfangt das verbesserte Prog zu "zerfleischen" :D,
    ich sitz grad an nem anderen Problem, prinzipiell das Gleiche, nur das die Struktur etwas anders aussieht:

    struct Punkt{
    		int x,y;
    		char name[20];
    	}koord;
    

    Jetzt soll ich eine main-Fkt schreiben, welche jeweils den "Punkt" x und y + dessen Namen abfragt und diese dann in ein Feld **koord*punkte[10]**abspeichert.

    Ich sags ehrlich da hängts irgendwie bei mir ... ich dachte immer das ein Feld entweder so: punkte[10], oder *punkte (mit anschließender speicherallokierung) deklariert wird ... deswegen verwundert mich diese Form: koord*punkte[10].

    Strukturen sind komisch ... 😉



  • Ist immer noch falsch.

    Das malloc(sizeof(char)); soll den Speicher für den Namen besorgen.
    Ein char kann ein Zeichen aufnehmen. Und das wäre schon mal das Stringendezeichen '\0'.
    Für deinen Namen (C-Schueler 2012) brauchst du 15+1 Byte Platz.
    Also Variable mit genug Platz nehmen, Namen eingeben, Länge bestimmen, Speicher besorgen und dann kopieren.

    Und Zeile 22 ist an der Stelle überflüssig.



  • also besser so:
    malloc(20*sizeof(char));
    ?
    Das wär jetzt halt für 19 Zeichen + \0.



  • char inbuffer[200]; // Puffer für den Namen
    ...
        printf ("Bitte geben Sie einen Namen ein\n");
        scanf ("%199s", inbuffer); 
    //  scanf ("%199[^\n]", inbuffer); // besser, liest auch Leerzeichen mit ein
        eingabe.name = malloc(strlen(inbuffer)+1;); // Benötigten Platz besorgen ...
        strcpy(eingabe.name,inbuffer);              //... und kopieren
    


  • Ok, aber meine Version müsste ja theoretisch auch klappen (wenn man genau ein Wort mit höchstens 19 Zeichen eingibt.

    Aber um nochmal auf mein zweites Problem zurückzukommen.

    struct Punkt{
            int x,y;
            char name[20];
        }koord;
    

    wie befülle ich denn, das Feld koord*punkte[10],
    mit den x,y Werten und dem dazugehörigen Namen?

    Mir ist dieses Feld etwas supekt, da Zeiger und [Indexangabe].



  • C-Schüler2012 schrieb:

    das Feld koord*punkte[10],

    Suspekt ist höchstens dein "Feld" "koord*punkte[10]".
    Ich bezweifle, dass du überhaupt weißt, was das bedeuten soll.
    Ebenso bezweifle ich die Kompetenz eures Lehrers, der euch zu globalen Variablen nötigt. Das ist Dilettantismus pur.



  • "Mein Feld" wird so vorgegeben.
    Außerdem brauche ich keine Einschätzung über meinen Prof,
    sondern eine Erklärung was es mit diesem Feld auf sich hat.

    Wenn ich wüsste was koord*punkte[10] bedeutet hätte ich nicht gefragt.
    Leute gibts ....



  • Der Mist mit den den globalen Variablen war das erste was mir negativ aufgefallen war.
    Wenn schon sowas verlangt wird, kann man vom Aufgabensteller alles mögliche erwarten.
    Unverständis und Schreibfehler eingeschlossen.

    Bis jetzt kennen wir nur den einen kurzen Ausschnitt der Aufgabe. Damit kann man leider nicht soviel anfangen.



  • Ja, dass mein Prof nicht der Beste kann ich aber leider nicht ändern 😃 .
    Also die Aufgabe lautet so:

    struct Punkt {
    		int x,y;
    		char name[20];
    	}koord;
    

    10 solcher Koordinatenpunkte sollen mit der Tastatur eingegeben und in ein Array **koord*punkte[10]**gespeichert werden. Schreib ein Programm dazu.

    Hier mal meine Idee (Funktioniert aber nicht)

    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    int main (){
    
    	struct Punkt {
    		int x,y;
    		char name[20];
    	}koord;
    
    	struct koord*punkte[10];
    
    	for (int i=0; i < 10; i++){
    		printf ("Bitte geben Sie X ein:\n");
    		scanf ("%i", koord.x);
    		printf ("Bitte geben Sie Y ein:\n");
    		scanf ("%i", koord.y);
    		printf ("Bitte geben Sie einen Namen ein:\n");
    		scanf ("%s", koord.name);
    		punkte = (char*)malloc(sizeof(koord));
    		punkte[i] = koord;
    		}
    	for (int i = 0; i <10; i++){
    		printf ("X:%i\tY:%i\tName:%s\n", punkte[i].x, punkte[i].y, punkte[i].name);
    	}
    	_getch ();
    return 0;
    

    Das Problem liegt in Zeile 21 /22 denk ich. Was mach ich falsch?



  • Das liegt nicht nur an Zeile 21/22

    ...\main.c||In function 'main':|
    ...\main.c|15|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|
    ...\main.c|17|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|
    ...\main.c|20|error: incompatible types when assigning to type 'struct koord *[10]' from type 'char *'|
    ...\main.c|21|error: incompatible types when assigning to type 'struct koord *' from type 'struct Punkt'|
    ...\main.c|24|error: request for member 'x' in something not a structure or union|
    ...\main.c|24|error: request for member 'y' in something not a structure or union|
    ...\main.c|24|error: request for member 'name' in something not a structure or union|
    ||=== Build finished: 6 errors, 2 warnings ===|
    

    Das struct koord*punkte[10]; bedeutet "declare punkte as array 10 of pointer to struct koord"

    Mach doch (erstmal) punkte als Array von struct Punkt



  • Hab mal ein wenig weiter dran gebastelt: jetzt spuckt mein Compiler nurnoch eine Fehlermeldung in Zeile 11 aus:

    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    int main (){
    
    	struct Punkt {
    		int x,y;
    		char name[20];
    	}koord, *punkte;
    
    	struct koord*punkte[10];
    
    	for (int i=0; i < 10; i++){
    		//punkte = (struct koord*)malloc(sizeof(koord));
    		printf ("Bitte geben Sie X ein:\n");
    		scanf ("%i", koord.x);
    		printf ("Bitte geben Sie Y ein:\n");
    		scanf ("%i", koord.y);
    		printf ("Bitte geben Sie einen Namen ein:\n");
    		scanf ("%s", koord.name);
    
    		punkte[i] = koord;
    		i++;
    		}
    	for (int i = 0; i <10; i++){
    		printf ("X:%i\tY:%i\tName:%s\n", punkte[i].x, punkte[i].y, punkte[i].name);
    	}
    	_getch ();
    return 0;
    }
    


  • Versuchst du die Fehlermeldung auch zu verstehen?

    Es scheint als dokterst du solange daran rum bis kein Fehler mehr kommt, ohne darüber nachzudenken.

    ...\main.c||In function 'main':|
    ...\main.c|11|error: conflicting types for 'punkte'|
    ...\main.c|9|note: previous declaration of 'punkte' was here|
    ...\main.c|16|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|
    ...\main.c|18|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|
    ...\main.c|22|error: incompatible types when assigning to type 'struct koord *' from type 'struct Punkt'|
    ...\main.c|26|error: request for member 'x' in something not a structure or union|
    ...\main.c|26|error: request for member 'y' in something not a structure or union|
    ...\main.c|26|error: request for member 'name' in something not a structure or union|
    ||=== Build finished: 5 errors, 2 warnings ===|
    

    Oder auf Deutsch: Du hast ein Variable Namens punkte schon definiert.

    Und auch die Warnungen sind böse Fehler, die dafür sorgen, dass dein Programm nicht funktionieren wird.



  • Ich sags ehrlich ich steht einfach aufm Schlauch
    prinzipiell will ich einfach nur, dass die ganzen Werte in ein Array (welches aus den Strukturelementen besteht) gespeichert wird.
    Sprich dass in meinem Fall
    z.B.an der Stelle
    punkte[2] --> 3(X-wert), 2 (Y-Wert), Punktname1 steht.
    etc.

    Ich peil einfach nicht wie ich das mache.

    Dass das Array punkte schon definiert ist, hab ich mir schon gedacht, jedoch wenn ich das erste *punkte (hinter dem }koord) wegnehme, zeigt mein Compiler sofort einen Fehler an.

    Deine Warnungen zeigt er bei mir nicht an (und ich hab Warnungen an).

    ...\main.c|16|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|
    ...\main.c|18|warning: format '%i' expects type 'int *', but argument 2 has type 'int'|

    Das hier versteht ich z.B. auch nicht so ganz .... hab jetzt mal das %i durch %d ersetzt.


  • Mod

    Eines meiner Lieblingszitate:

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.

    Passt mal wieder perfekt.

    Bevor du weiter rumdoktorst:
    Setz mal all dein Wissen ein, bzw. versuche selber zu recherchieren, wenn du es nicht weißt, und erkläre, was folgede Codes genau tun und, falls es Unterschiede gibt, welche genau dies sind. Oder wenn du wirklich nicht weiter weißt, dann frag nochmal nach:
    a:

    struct Punkt {
        int x,y;
        char name[20];
    };
    

    b:

    int i;
    

    c:

    struct Punkt {
        int x,y;
        char name[20];
    } koord;
    

    d:

    struct Punkt {
        int x,y;
        char name[20];
    };
    
    struct Punkt koord;
    

    f:

    typedef int foo;
    
    foo i;
    

    g:

    typedef struct {
        int x,y;
        char name[20];
    } Punkt;
    
    Punkt koord;
    

    h:

    int *i;
    

    i:

    int j[5]
    

    ;
    k:

    int i,*j;
    

    l:

    int *i, j;
    

    m:

    int* i,j;
    

    n:

    int *i, j[5];
    

    o:

    int i, *j[5];
    

    p:

    int (*i)[5];
    

    q:

    struct {
        int x,y;
        char name[20];
    } koord;
    

    r:

    struct Punkt{
        int x,y;
        char name[20];
    } koord;
    

    s:

    struct Punkt{
        int x,y;
        char name[20];
    } koord;
    
    struct Punkt punkt;
    

    t:

    struct Punkt{
        int x,y;
        char name[20];
    } koord;
    
    struct Punkt punkte[5];
    

    u:

    struct Punkt{
        int x,y;
        char name[20];
    } koord, punkte[5];
    

    v:

    struct {
        int x,y;
        char name[20];
    } koord, punkte[5];
    


  • Aaalso:

    a)
    Es wird eine Struktur mit dem Namen Punkt deklariert.
    Die Struktur hat 2 int Datentypen und ein char Feld mit der Länge 20.

    b)
    i wird als Integer deklariert.

    c)/d)
    wie a), nur dass zusätzlich noch eine Strukturvariable defniert wird.

    f)
    = int i
    g)
    eine neue Variable von Typ Punkt wird eingeführt
    h)
    deklaration auf einen Zeiger, der auf einen Integer zeigt
    i)
    Feld mit 5 Integers

    boah das sind mir zu viele für heute ...
    aber ein kleiner Zwischenbericht wär nett 😃


  • Mod

    C-Schüler 2012 schrieb:

    a)
    Es wird eine Struktur mit dem Namen Punkt deklariert.
    Die Struktur hat 2 int Datentypen und ein char Feld mit der Länge 20.

    Falsch. Es wird eine Struktur mit dem Namen struct Punkt eingeführt.

    b)
    i wird als Integer deklariert.

    Ja.

    c)/d)
    wie a), nur dass zusätzlich noch eine Strukturvariable defniert wird.

    Korrekt.

    f)
    = int i

    Ja.

    g)
    eine neue Variable von Typ Punkt wird eingeführt

    Nicht ganz. Es wird ein Typ Punkt eingeführt. Dieser ist ein anderer Name für die Struktur, die oben noch struct Punkt hieß. Dann wird eine Variable namens koord von diesem Typ deklariert.

    h)
    deklaration auf einen Zeiger, der auf einen Integer zeigt

    Ja.

    i)
    Feld mit 5 Integers

    Ja.


Anmelden zum Antworten