Werte mit Zeiger einlesen und ausgeben Fehler



  • Huhu Leutz,

    da ich gerade ANSI C lerne , bin ich dabei mit Zeiger ein eigenes kleines Bsp zu machen um die besser zu verstehen.
    Ich will die Werte einlesen über die Funktion eingabe() und später auswerten.

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 30
    
    static int zahl = 0;
    
    struct werte{
        char cname[MAX];
        char klasse[MAX];
        int  staerke;
        int  geschick;
        int  intell;
        int  ausdauer;
        int  luck;
        int  life;
    
    } werten[2];
    
    void eingabe(struct werte werten[])
    {
    
      printf("\nCharaktername:");
     do {scanf("%c",&werten[zahl].cname);} while( getchar() !='\n');
     printf("\nKlasse:");
     do {scanf("%c",&werten[zahl].klasse);} while( getchar() !='\n');
     printf("\nStaerke:");
     do {scanf("%d",&werten[zahl].staerke);} while( getchar() !='\n');
     printf("\nGeschick:");
     do {scanf("%d",&werten[zahl].geschick);} while( getchar() !='\n');
     printf("\nIntelligenz:");
     do {scanf("%d",&werten[zahl].intell);} while( getchar() !='\n');
      printf("\nAusdauer:");
     do {scanf("%d",&werten[zahl].ausdauer);} while( getchar() !='\n');
     printf("\nGlück:");
     do {scanf("\n%d",&werten[zahl].luck);} while( getchar() !='\n');
      fprintf(stdout,"\nBitte nur noch das Leben eingeben!");
     do {scanf("\n%d",werten[zahl].life);} while( getchar() !='\n');
    
    zahl++;
    
    }
    
    void ausgabe(struct werte *auswertung)
    {
    
     fprintf(stdout,"Spieler\n%c:",auswertung->cname);
     fprintf(stdout,"Klasse:%c\n",auswertung->klasse);
     fprintf(stdout,":Staerke:%c\n",auswertung->staerke);
     fprintf(stdout,"Geschick:%c\n",auswertung->geschick);
     fprintf(stdout,"Intelligenz:%c\n",auswertung->intell);
     fprintf(stdout,"Ausdauer:%c\n",auswertung->ausdauer);
     fprintf(stdout,"Glueck:%c\n",auswertung->luck);
     fprintf(stdout,"Lebenspunkte:%d\n",auswertung->life);
    
    }
    
    int main(void)
    
    {
    
     struct werte *eingabe1, *eingabe2;
    
     eingabe1 = eingabe();
     eingabe2 = eingabe();
    
     ausgabe(eingabe1);
     ausgabe(eingabe2);
    
    return EXIT_SUCCESS;
    }
    

    Die GCC Fehlermeldung ist

    C:\Users\******\Documents\C\game_test.c||In function `main':|
    C:\Users\******\Documents\C\game_test.c|71|error: void value not ignored as it ought to be|
    C:\Users\******\Documents\C\game_test.c|72|error: void value not ignored as it ought to be|
    ||=== Build finished: 2 errors, 0 warnings ===|

    Danke schonmal für die Hilfe 🙂

    greetz

    Demonking

    Edit: Man man... xD wenn man lernt kommen einen einfach dumme Fehler ...
    Kann geclosed werden lag ja an

    eingabe1 = eingabe();
     eingabe2 = eingabe();
    

    soll ja in

    eingabe1 = eingabe;
     eingabe2 = eingabe;
    

    geändert werden.



  • wtf?



  • do {scanf("%c",&werten[zahl].cname);} while( getchar() !='\n');
    

    😕

    zahl++;
    

    😕

    eingabe1 = eingabe;
     eingabe2 = eingabe;
    

    😕

    fprintf(stdout,"Spieler\n%c:",auswertung->cname);
    

    😕

    phew, bau dir da mal ne version wenn ich dazu komm, das kannst so nicht verwenden oder doch??

    lg lolo



  • noobLolo schrieb:

    phew, bau dir da mal ne version wenn ich dazu komm, das kannst so nicht verwenden oder doch??

    Ich würde eher warten, bis er zumindest die richtigen Fehlermeldungen vom Compiler kopiert.
    🙄



  • Habe nun den Code ausgebessert.
    Hätte am liebst net Wand vor den Kopf genommen und nach vorne und hinten gewippt. 😛

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 30
    
    static int zahl = 0;
    
    struct werte{
        char cname[MAX];
        char klasse[MAX];
        int  staerke;
        int  geschick;
        int  intell;
        int  ausdauer;
        int  luck;
        int  life;
    
    } werten[2];
    
    void eingabe(int nr, struct werte input[])
    {
    
      printf("\nCharaktername:");
     fgets(input[nr].cname, MAX, stdin);
     printf("\nKlasse:");
     fgets(input[nr].klasse, MAX, stdin);
     printf("\nStaerke:");
     do{scanf("%4d",input[nr].staerke);
       }while(getchar()!= '\n');
    
     printf("\nGeschick:");
     do{scanf("%4d",input[nr].geschick);
       }while(getchar()!= '\n');
    
     printf("\nIntelligenz:");
     do{scanf("%4d",&input[nr].intell);
       }while(getchar()!= '\n');
    
      printf("\nAusdauer:");
     do{scanf("%4d",&input[nr].ausdauer);
       }while(getchar()!= '\n');
    
     printf("\nGlück:");
     do{scanf("%4d",&input[nr].luck);
       }while(getchar()!= '\n');
    
      fprintf(stdout,"\nBitte nur noch das Leben eingeben!");
     do{scanf("%4d",input[nr].life);
       }while(getchar()!= '\n');
    
    }
    
    void ausgabe(struct werte auswertung[], int nr)
    {
    
     fprintf(stdout,"Spieler\n%c:",auswertung[nr].cname);
     fprintf(stdout,"Klasse:%c\n",auswertung[nr].klasse);
     fprintf(stdout,":Staerke:%c\n",auswertung[nr].staerke);
     fprintf(stdout,"Geschick:%c\n",auswertung[nr].geschick);
     fprintf(stdout,"Intelligenz:%c\n",auswertung[nr].intell);
     fprintf(stdout,"Ausdauer:%c\n",auswertung[nr].ausdauer);
     fprintf(stdout,"Glueck:%c\n",auswertung[nr].luck);
     fprintf(stdout,"Lebenspunkte:%d\n",auswertung[nr].life);
    
    }
    
    int main(void)
    
    {
    int x,auswahl;
    
    do
    
    {
    
        printf("-1- Werte Eingeben\n");
        printf("-2- Werte Ausgeben\n");
        printf("-3- Kaempfen\n");
        printf("-4- Ende\n");
        printf("\nIhre Auswahl : ");
        scanf("%d",&auswahl);
        getchar();
    
        switch(auswahl)
        {
         case 1 : eingabe(zahl++,werten);
    
                    do {
                    scanf("%d",&x);
                    } while(getchar()!= '\n');
    
         case 2 : ausgabe(werten,x);
    
        }
    
    }while(auswahl < 3);
    
    return EXIT_SUCCESS;
    }
    

    So anfängliche Fehler aber nun ja.
    Bei diesem Script nun wird bis maximal Stärke abgefragt danach bricht das Programm einfach ab :s



  • ich denke du brauchst einfach mal ne erklärung zu scanf() sonst wird das nie was...

    also der erste parameter für scanf() ist doch eine zeichenkette wo immer prozent gefolgt von zahlen und abschließend einem buchstaben, die restlichen parameter müssen schon dazu passen was du ihm in dem ersten angibst, also

    //zahlen einlesen erwartet einen zeiger auf ein int
    int x;
    //         .---so bekommst den zeiger
    //         v
    scanf("%d",&x);
    //ausgabe dann ohne zeiger
    printf("%d",x);
    
    //strings einlesen erwartet einen zeiger auf ein char array also (char*)
    char str[1024];
    //         .---ohne & da str schon ein zeiger ist
    //         v
    scanf("%s",str);
    //ausgabe benötigt einen zeiger
    printf("%s",x);
    

    damit solltest dich erstmal ausgiebig beschäftigen, dann stürtzt das auch nicht immer beim einlesen und ausgeben ab...

    dein eingabe puffer leeren, was bei dir so ausschaut

    do{scanf("%4d",input[nr].staerke);
       }while(getchar()!= '\n');
    

    machst am besten so

    void clearStdin(){
        //clear buffer, Eingabepuffer leeren.
        int c = 0;
        while ( c = getchar() != '\n' && c != EOF );
    }
    
    ...{
    
    scanf("%4d",&input[nr].staerke);
    clearStdin();
    scanf("%4d",&input[nr].geschick);
    clearStdin();
    ...
    }
    

    lg lolo



  • ups z.15

    printf("%s",str);
    statt
    printf("%s",x);
    

    ja ich war noch nicht ganz wach 👎



  • @Nooblolo : Danke dir für die gute Erklärung 🙂
    und es klappt nun auch, werde mir wohl nun immer ne Funktion zum
    Puffer leeren erstellen und deine Erklärung beherzigen 😉


Anmelden zum Antworten