problem mit ausgabe bei schiffe versenken



  • hi ich hab hier ein problem, krieg kein fehle beim compilen aber es wird nix ausgegeben.

    schaut mal:

    include <config.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define FIELD_HEIGHT 10
    #define FIELD_WIDTH 10
    
    //map.h
    int translate_x(char c);
    int translate_y(char c);
    void init();
    //map.c
    
    int sp()
    {
        /*system("cls"); nur für windows*/
        printf("S C H I F F E  V E R S E N K E N <Dean - err0r>\n\n\n\n");
        printf("\tEinzelspielermodus\n\n\n");
    
        char sname[100];
    
        printf("Bitte geben Sie einen Spielernamen ein\n");
        scanf("%99s",&sname[0]);
        /*names ausgabe: printf("Ihre Eingabe: %s\n",sname);*/
    
    //########################## SPIELFELD ##############################
    int q, h, o;
    int i = 0; // nummer
    char j = 'A'; //buchstabe
    int t = 1;
    char x,y;
    char text[80+1];
       int u,g;
       int myarray[10][10]= {0};
    
    //#################################################
    static char char_x[FIELD_WIDTH];
    static char char_y[FIELD_HEIGHT];
    
    void init()
    { //fülle die beiden arrays
      int i;
      char c='a';
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        char_x[i]=c++;
      }
      c='0';
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        char_x[i]=c++;
      }
    }
    
    int translate_x(char c)
    {
      int i;
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        if(char_x[i]==c) return i;
      }
      return -1; //fehler
    }
    
    int translate_y(char c)
    {
      int i;
      for(i=0; i<FIELD_HEIGHT; ++i)
      {
        if(char_y[i]==c) return i;
      }
      return -1; //fehler
    }
    //#################################################   
    
       for(u=0; u < 2; u++)
          {
             for(g=0; g < 2; g++)
                {
            	printf("Koordinaten fuer die Schiffe [0..9] Bitte mit Komma trennen > ");
    		fgets(text,80,stdin),
    		sscanf(text,"%c%c",&x,&y);
    		myarray[translate_x(x)][translate_y(y)]=1;
                }
          }
       //printf("\nKoordinaten[%d][%d]...\n\n",2,2);
    
       printf("\t");
        for (q=1; q<11; q++)
       {    
       printf ("%d ", q);
       }
       printf("\n\n");
       printf("\t--------------------\n");
    
       for(u=0; u < 10; u++)
          {
              printf("%c\t",65+u);
             for(g=0; g < 10; g++)
                {
               printf("|");
            printf("%d",myarray[u][g]);
                }
      printf("\n\t--------------------\n");
    //         printf("\n\n");
          }
          }
    

    thx

    err0r



  • wo und wann wird nichts ausgegeben???

    Bischen genauer wäre toll 😃



  • hi.

    weiter unten siehst du ja denn satz wodrin steht:"..bitte koordinaten eingeben.." da geb ich dann a3 z.b ein [normal wäre 3,3 usw. aber jetzt z.b a3 da ich das umänder dank shade's hilfe ;)]. ja und alles muss ja dann auch wieder ausgegebn werden am ende, unten die 2 schleifen..aber das wird net richtig gemacht, bzw schon aber nicht das was ich eingelesen hab. 😕

    mfg
    err0r



  • Was wird denn ausgegeben ?

    Poste doch mal die Ausgabe

    In den Ausgabeschleifen sollte auf jeden Fall
    FIELD_HEIGHT
    FIELD_WIDTH
    benutzt werden.



  • hi, so wird das ausgegeben!
    Aber wenn ich 3,3 eingebe muss an der stelle [3][3] keine NULL stehe, bzw ich machs jetzt immer mit c3 könnte ich auch eingeben!
    was stimmt da net?

    so kommts raus, aber falsch, da nix drin steht.

    1 2 3 4 5 6 7 8 9 10
    ---------------------------
    A |0|0|0|0|0|0|0|0|0|
    --------------------------
    B |0|0|0|0|0|0|0|0|0|
    --------------------------
    C |0|0|0|0|0|0|0|0|0|
    --------------------------
    E |0|0|0|0|0|0|0|0|0|
    --------------------------
    F |0|0|0|0|0|0|0|0|0|
    --------------------------
    G |0|0|0|0|0|0|0|0|0|
    --------------------------
    H |0|0|0|0|0|0|0|0|0|
    --------------------------
    I |0|0|0|0|0|0|0|0|0|
    --------------------------
    J |0|0|0|0|0|0|0|0|0|
    --------------------------
    K |0|0|0|0|0|0|0|0|0|
    --------------------------

    err0r



  • Es geht nicht über kompakten Code, außer man will debuggen

    for(u=0; u < 2; u++)
          {
           int loc_x,loc_y;
             for(g=0; g < 2; g++)
                {
                printf("Koordinaten fuer die Schiffe [0..9] Bitte mit Komma trennen > ");
            fgets(text,80,stdin),
            sscanf(text,"%c%c",&x,&y);
           loc_x=translate_x(x);                // Einfach mal gucken was passiert
           loc_y=translate_y(y);                // 
           printf("\n%i,%i",loc_x,loc_y);       // 
            myarray[loc_x][loc_y)]=1;
    //        myarray[translate_x(x)][translate_y(y)]=1;
                }
          }
    

    Wird das richtige element adressiert?

    Du darfst nur noch c3 eingeben die Schreibweise 3,3 wird nicht mehr unterstützt in deinem Code



  • hi ok ich probiers.

    */home/dean/Edateien/C/c/schiffe/schiffel/src/sp.c:108: error: syntax error before ')' toke

    aber hae? in zeile 108 ist kein ) und in der zeile davor ist alles korrekt, spinnt der oder wie? *verwirrtsei*

    err0r



  • Nach dem fgets steht ein Komme und kein Semikolon

    fgets(text,80,stdin), //<---------------
            sscanf(text,"%c%c",&x,&y);
    


  • ja sicher, aber:::
    "home/dean/Edateien/C/c/schiffe/schiffel/src/sp.c:108: error: syntax error before ')' token" also nix mit fgets ^^ hm wo soll den in der zeile vor dem myarray... rein fehler sein? sorry aber ich SEH einfach keinen, hab ich gestern abend nicht und jetzt auch nicht...das mit fgets das war doch richtig.

    PAD schrieb:

    Es geht nicht über kompakten Code, außer man will debuggen

    for(u=0; u < 2; u++)
          {
           int loc_x,loc_y;
             for(g=0; g < 2; g++)
                {
                printf("Koordinaten fuer die Schiffe [0..9] Bitte mit Komma trennen > ");
            fgets(text,80,stdin),
            sscanf(text,"%c%c",&x,&y);
           loc_x=translate_x(x);                // Einfach mal gucken was passiert
           loc_y=translate_y(y);                // 
           printf("\n%i,%i",loc_x,loc_y);       // 
            myarray[loc_x][loc_y)]=1;
    //        myarray[translate_x(x)][translate_y(y)]=1;
                }
          }
    

    Wird das richtige element adressiert?

    Du darfst nur noch c3 eingeben die Schreibweise 3,3 wird nicht mehr unterstützt in deinem Code

    err0r



  • Hi!

    Es wird auch statt ';' mit ',' compiliert und ausgeführt, allerdings ist die Auswertungsreihenfolge undefiniert:

    fgets(text,80,stdin),
    sscanf(text,"%c%c",&x,&y);
    

    Es ist nicht garantiert das fgets ausgeführt wird. Folgendes:

    f1(v[i], i++); // 2 Argumente
    f1( (v[i], i++) ); // 1 Argument
    

    Beim ersten ist die Reihenfolge der Argumentausdrücke undefiniert. Das zweite Aufruf hat ein Argument und ist äquivalent zu i++.
    Beim ersten kann also erst v[i] ausgewertet werden, wenn i vorher 1 war heißt es also v[1] und wenn dies nicht der Fall ist, sondern i++ zuerst ausgewertet wird un i zuvor 1 war kann es sein das v[i] als v[2] übergeben wird. Deswegen solltest du einzelne Ausdrücke strikt trennen.

    Welche Zeile ist 108? Und was steht davor und dahinter?

    Code-Hacker



  • hallo.

    zeile 107: printf("\n%i,%i",loc_x,loc_y);
    zeile 108: myarray[loc_x][loc_y)]=1;

    hätteste aber auch aus dem obern herauslesen können...hm ka was da net stimmt, ich find da is alles richtig. 😞

    "der fehler:
    /home/dean/Edateien/C/c/schiffe/schiffel/src/sp.c:108: error: syntax error before ')' token"

    euer err0r 😞



  • 3rr0r schrieb:

    zeile 107: printf("\n%i,%i",loc_x,loc_y);
    zeile 108: myarray[loc_x][loc_y**)**]=1;

    Du findest da echt keinen Fehler bzw eine falsche ')' ?

    Ich schon...



  • oh *g*

    son mist, da ist ja das ding *schäm*

    sorry 😃

    thx!
    ciao err0r



  • @Hepi Danke es sind tatsächlich zwei Fehler das Komma nach dem fgets sollte ein ; sein und die
    ) beim y gehört auch weg.

    Und wenn ein Fehler in zeile 108 sein sollte wäre es toll wenn man die entsprechende Stelle ersten markiert und zweitens die zugehörige fehlemeldung mitteilt. Suchspiele müssen ja nicht sein.



  • hi. okay jetzt gehts. nur trotzdem wird das nicht richtig ausgegeben.
    ich kann zwar a3 usw. eingeben, nur gehen tuts nicht:

    hier mal den ganzen code:

    #include <config.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define FIELD_HEIGHT 10
    #define FIELD_WIDTH 10
    
    //map.h
    int translate_x(char c);
    int translate_y(char c);
    void init();
    //map.c
    
    int sp()
    {
        /*system("cls"); nur für windows*/
        printf("S C H I F F E  V E R S E N K E N <Dean - err0r>\n\n\n\n");
        printf("\tEinzelspielermodus\n\n\n");
    
        char sname[100];
    
        printf("Bitte geben Sie einen Spielernamen ein\n");
        scanf("%99s",&sname[0]);
        /*names ausgabe: printf("Ihre Eingabe: %s\n",sname);*/
    
    //########################## SPIELFELD ##############################
    int q, h, o;
    int i = 0; // nummer
    char j = 'A'; //buchstabe
    int t = 1;
    char x,y;
    char text[80+1];
       int u,g;
       int myarray[10][10]= {0};
    
    //#################################################
    static char char_x[FIELD_WIDTH];
    static char char_y[FIELD_HEIGHT];
    
    void init()
    { //fülle die beiden arrays
      int i;
      char c='a';
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        char_x[i]=c++;
      }
      c='0';
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        char_x[i]=c++;
      }
    }
    
    int translate_x(char c)
    {
      int i;
      for(i=0; i<FIELD_WIDTH; ++i)
      {
        if(char_x[i]==c) return i;
      }
      return -1; //fehler
    }
    
    int translate_y(char c)
    {
      int i;
      for(i=0; i<FIELD_HEIGHT; ++i)
      {
        if(char_y[i]==c) return i;
      }
      return -1; //fehler
    }
    //#################################################   
    
       for(u=0; u < 2; u++)
          {
           int loc_x,loc_y;
             for(g=0; g < 2; g++)
                {
                printf("Koordinaten fuer die Schiffe [0..9] Bitte mit Komma trennen > "); 
            fgets(text,80,stdin);
            sscanf(text,"%c%c",&x,&y);
           loc_x=translate_x(x);                // Einfach mal gucken was passiert
           loc_y=translate_y(y);                //
           printf("\n%i,%i",loc_x,loc_y);       //
            myarray[loc_x][loc_y]=1;
    //      myarray[translate_x(x)][translate_y(y)]=1;
                }
          }
    
       //printf("\nKoordinaten[%d][%d]...\n\n",2,2);
    
       printf("\t");
        for (q=1; q<11; q++)
       {    
       printf ("%d ", q);
       }
       printf("\n\n");
       printf("\t--------------------\n");
    
       for(u=0; u < 10; u++)
          {
              printf("%c\t",65+u);
             for(g=0; g < 10; g++)
                {
               printf("|");
            printf("%d",myarray[u][g]);
                }
      printf("\n\t--------------------\n");
    //         printf("\n\n");
          }
          }
    

    hmm...wenn ich die eingabe über den translate code packe gehts auch nicht. was stimmt da nich?

    err0r



  • Fang mal an zu denken, was wird wohl der Sinn dieser zusätzliohen printf statements sein??

    Die Informationionen zu liefern ob die Daten richtig verarbeitet werden.

    Was soll eine Frage warum geht das nicht? Denken muß man selber. Die Fehler in deinem Code solltest du selber finden, ist einer der sinnvollsten wege zu lernen.

    Eine Frage der Art:

    Nach dem einarbeitend er zusätzliche Statements bekomme ich folgende Ausgabe, trotzdem werden die Werte nicht richtig eingetragen woren kann das liegen

    ist viel sinnvoller als der n-te post des gesamten quellcodes mit der frage warum ght das nicht.

    Also erst denken, dann eine sinnvolle frage zusammstellen die nötigen Daten dazupacken und dann fragen.



  • Zu deiner Information

    Aus deinen CODE-schnippslen erkennt man sofort folgendes

    1 Probleme bei der Eingabe des Spielernamens das linefeed bleibt im eingangsbuffer, somit
    kannst du das erste Koordinatenpar nicht eingeben
    2 Fehler in der init Funktion
    3 wird die Init funktion überhaupt irgendwo gerufen
    4 Probleme wenn du die Koordinaten in Großbuchstaben eingibst
    5 Grantenmäßiger Verhau wenn die Koordinaten nicht im Bereich 0..9 a..j sind
    6 Keine fehlerhandling obwohl beide translatefunktione dir fehler melden
    7 Wenn schon ein Hilfetext, dann wenigstens ein richtiger.

    Mit was für einem Compiler arbeitest du?
    Kennst su den Begriff debuggen?


Anmelden zum Antworten