Zahlen einlesen - finde Fehler nicht



  • while( 1 == 1)
    

    Das ist ja auch ein Quatsch! Ich mach das immer so:

    while(1!=(1!=1)) {...}
    

    😃



  • kleiner nachtrag:

    wegen dem datei schließen:

    das hier ist nur ein teilproblem einer anderen Aufgabe, dort werden alle Dateien wieder geschlossen

    ich habe es hier nur auf das nötigste reduziert, damit ich euch nicht 400 zeilen geben muss



  • Warum siehst du dir immer nur das Endergebnis an? Nutze den Debugger! Breakpoints setzen, schrittweise durchgehen, Variableninhalte überprüfen, Debug-Ausgaben notieren usw. Nur so kann man ein Programm sinnvoll debuggen.

    Falls du das Visual Studio nutzt, könnte dieser Artikel interessant für dich sein: http://magazin.c-plusplus.net/artikel/Debuggen mit VCPlusPlus6



  • verwende code::blocks und normalerweise kein c/c++
    hab wenig ahnung vom debugger dort,

    Bin aber auf etwas gestoßen:

    nt getNumber(FILE* fp)
    {
        char num[1024];
        char temp[1];
        temp[0] = fgetc(fp);
    
        if( isNum(temp[0]) == 0)
        {
            printf("Falsches Dateiformat oder beschädigte Datei\n");
            fclose(fp);
            return -1;
        }
        else
        {
            strcat(num, temp);
        }
    
        /** DEBUG **/
        printf("%s\n", num);
    
        while( 1 == 1)
        {
            temp[0] = fgetc(fp);
            if( isNum( temp[0] != 0))
            {
                strcat(num, temp);
    
                /** DEBUG **/
                printf("%s\n", num);
            }
    

    nochmal der selbe code von vorhin, nur dass ich mir stets den string ausgeben lasse:

    Ausgabe:

    ℓ_2ℓ_2
    

    weiß einer damit etwas anzufangen?

    werd gleich mal code::blocks debugger googlen



  • shisha schrieb:

    also gut:
    Ich habe

    char* num
    

    durch

    char num[1024]
    

    ersetzt, nun spuckt das Programm immer 0 aus.

    Damit sollte schonmal mein Segfault verschwinden.
    Weiters:
    Mach aus char temp[1] einfach ein char temp .
    Verzichte auf strcat , das ist für jeweils ein einziges Zeichen echt nicht nötig. (Ausserdem hat strcat gerne Nullbytes am Ende!)

    werd gleich mal code::blocks debugger googlen

    Nicht nötig. Einfach mal Debug -- Step into versuchen, da wird schnell alles klar.



  • Ach ja: das vorgeschlagene static für num war natürlich nicht nötig, mea culpa.



  • if( isNum( temp[0] != 0))
    

    Klammern verwirrt? Das gibt so wenig Sinn, weil's nie wahr wird. 😉



  • OK dank des debuggers hab ich nun die stelle wo es hängt:

    wie ichs irgendwie schon erwartet hab:

    while( 1 == 1)
        {
            temp[0] = fgetc(fp);
            if( isNum( temp[0] != 0))
            {
                strcat(num, temp);
    
                /** DEBUG **/
                printf("%s\n", num);
            }
    

    bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt 🙂

    die klammern hab ich ausgebessert



  • bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt 🙂

    man: strcat geht bis zum nächsten Nullbyte. Es kann aber keines mehr kommen, weil in temp nur ein Zeichen Platz hat. (siehe oben)
    Da ist es ohnehin schon nett von deinem Betriebsystem, dass das Ding nicht anfängt, über den Speicher zu tanzen...



  • die klammern hab ich ausgebessert

    Ein != 0 kannst du übrigens in einer Bedingung prinzipiell einfach weglassen (warum wohl?). In dem Fall wäre das auch klarer: if (isNum(x)) ...
    Analog kannst du statt if (x == 0) natürlich auch sagen if (!x) . Das wird dir in C oft begegnen.

    Nachtrag:
    Ich will mal nicht so sein; statt strcat würde ich in Zeile 26 sagen:

    num[strlen(nam)] = temp[0];
    

    Wobei es natürlich auch nicht nötig wäre, jedes mal strlen aufzurufen, weil man die momentane Länge auch einfach mitzählen könnte. Nur auch nicht vergessen, num am Ende mit einem Nullbyte zu terminieren, damit das Ende von printf & Co. erkannt werden kann. Da zeigt sich dann auch, dass temp nicht ein Array, sondern ein einzelnes Zeichen sein sollte.

    ^^Na gut, ich bin ohnehin schon pedantisch: man könnte auf temp sicher auch ganz verzichten, indem man gleich nach num schreibt.



  • Leute ich hab die Nase voll von dieser Funktion und umgehe das ganze:

    fscanf(fp, "%d", &int_x)

    sollte doch keine nachteile mit sich bringen?

    Um evt falsche Formatierung zu erkennen vergleiche ich dann das nächste eingelesene Zeichen einfach mit whitesspace und schon weiß ich was sache ist

    Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?

    neuer code:

    if( fscanf(fp, "%d", &w) == 0)
        {
            printf("Konnte w nicht ermitteln\nDatei eventuell beschädigt");
            fclose(fp);
            return -1;
        }
        if(isspace(fgetc(fp)) == 0)
        {
            printf("Illegale Sequenz\n");
            printf("Datei eventuell beschädigt\n");
            fclose(fp);
            return -1;
        }
    


  • Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?

    Nein. Aber ich hab Angst vor scanf() und mein Psychiater ist sich noch nicht sicher, ob die begründet ist.


Anmelden zum Antworten