Program Benotung

  • Hallo zusammen. Ich habe mal jetzt ein Program fertig, in C, und ich wuerde gerne eure Kommentare dazu hoeren. Also verbesserungs Vorschlaege, Hinweise auf eventuelle Fehler bzw. sachen die vieleicht auch besser geloest werden koennen etc.

    Bei der Fehlerbehandlung habe ich dieses mal Makros nicht benutzt weil ich mich da erstmal ein bissle einlesen muss weil ich manche sachen noch nicht so recht checke, auch von den Sysprog Folien net.

    Waere sehr dankbar wenn sich jemand die Zeit nehmen wuerde und sich das durchschaut. Ich danke auch schon im voraus da ich hier eure Freizeit in anspruch nehme :o

    Ich werde das Angaben PDF auch hochstellen, aber habe erstmal nur Teil A gemacht.

    Waere auch an aelteren Uebungs Angaben von Sysprog interessiert damit ich mich noch besser vorbereiten kann, habe naemlich nur diese eine Angabe.

    EDIT: rechner und stack.h sind jetzt dabei
    EDIT 2: zip datei ist mit aenderung bei non option argumente hochgeladen

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

    2 Mal editiert, zuletzt von lowkey (19. August 2008 um 21:12)

  • Kommentare:

    • rechner.h und stack.h wären auch ganz interessant.
    • Schau, daß das Programm mit gcc -Wall -Wextra -O2 -ansi -pedantic sauber kompiliert. (Bei älteren Versionen vom gcc muß man noch -W statt -Wextra schreiben.)
    • Ist strtok bei Sysprog nicht mehr verboten?
    • Was du mit Fehlerbehandlung mit Makros meinst, weiß ich nicht, aber sind Makros bei Sysprog nicht so gut wie verboten?
    • Deine Zeilen sind zu lang, zum Teil weil man noch etwas modularisieren könnte: In der Funktion input hast du ein switch in einem if in einem for in einem else in einem for in einem while. Und das Innere von der Funktion hat nicht wirklich was mit dem Einlesen von Input zu tun.

    Edit: Ich sehe gerade, in Angabe B wird strtok sogar vorgeschlagen. Brrr. Die Sysprog-Menschen sind witzig. Aber auf eine ungute Weise.

    *plantsch*

  • Naja, das habe ich alles in Input reingetan weil es nicht nur den Input liest sondern auch gleich verarbeitet. Das koennte ich eventuell dann in eine weitere Funktion unterbringen da hast du recht.

    Wegen dem kompelieren. Ich habe es so kompeliert wie es in den Sysprog Folien steht, das muss nicht heisen das es gut ist :shinner:

    Werde das mal mit den optionen die du gepostet hast probieren. Mal schauen was raus kommt.

    Wegen Makros, die sind laut meines Wissens erlaubt, werden auch in den Folien beschrieben und auch fuer Fehlermeldungen benutzt, aber da ich mit Makros nicht viel am Hut hab bis jetzt hab ich es ausgelassen.

    Das mit dem strtok kann von deiner Seite aus stimmen aber ich finde gerade die Richtlinien nicht mehr. Koenntest du eventuell dann ein Vorschlag machen wie man es ohne strtok loesen koennte?

    EDIT: hab es gerade mit den von dir angegebenen Optionen kompeliert und bis auf ein einfaches unsigned signed compare war alles in Ordnung :D
    Zeile 47, index musste als unsigned int deklariert werden falls es wen interesiert

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

    2 Mal editiert, zuletzt von lowkey (19. August 2008 um 18:46)

  • Koenntest du eventuell dann ein Vorschlag machen wie man es ohne strtok loesen koennte?


    Ich hätt sowas geschustert:


    Das tut nichts obskures mit strtok, ist meiner Meinung nach klarer, und verwendet sogar strtof so, wie es gedacht ist :) (Diese Variante akzeptiert auch die Zahl 0 als Input.) Da sich der Code bei den Fällen '+' bis 'c' wiederholt, würde ich die wohl als nächsten Schritt zusammenfassen und in einer anderen Funktion extra weiterverarbeiten. Ahja, und dieser Aufruf von fgets im Gegensatz zu deinem fehlerfrei (glaub ich).

    Edit: Diese Variante prüft zuerst auf Operatoren, obwohl wegen Fällen wie "-42.0", die offenbar als negative Zahl zu interpretieren sind, zuerst die Zahl geparst werden sollte. Aber das umzustellen ist ja keine große Sache.

    *plantsch*

    Einmal editiert, zuletzt von Plantschkuh! (19. August 2008 um 19:58)

  • Danke fuer die schnelle Antwort.

    Was war in meinem fgets denn fehlerhaft?

    das mit dem Input haette ich nie so gemacht weil ich gar nicht erst drauf gekommen waere das ich es so machen kann, naja noob halt haha :shinner:

    wegen dem umstellen damit negative zahlen kein problem sind sollte man das strtof vor dem switch haben und den switch im else oder?

    aber ich verstehe dein code und das ist mir wichtig :p da ich jetzt weis wie ich es ohne strtok loesen kann. Gibt es sonst noch irgendwelche Fehler die dir aufallen?

    Code
    if(optind == argc)
        {
            printf("Switching to Console Input.\n");
            fp = stdin;
            input(numbers, aFlag, iFlag, fp);
        }

    hab ich noch eingefuehrt ueber der for schleife wo es die non option argumente durchgeht damit " ./calc < a.txt" auch funktionert denn das
    hat es vorher nicht, nur so als update.

    Nochmals danke fuer deine Hilfe, mit sachen Pointer bin ich noch nicht sattel fest und das merke ich aber hoffentlich gehts bald besser :p

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

  • Das tut weh: stack.c:77: warning: cast from pointer to integer of different size

    Es ist nicht alles 32bittig.

    Dieser Pointer/Integer-Vergleich ist schon mal sehr unschön, aber wenn schon, dann brauchst du intptr_t für den cast.

    EDIT: Noch was: Wo steht in der Angabe, dass die Zeilen maximal 19 Zeichen lang sind?

    Einmal editiert, zuletzt von Ringding (20. August 2008 um 13:40)

  • bin mir nicht sicher wie du die stack.c fehlermeldung bekommst, denn die habe ich nicht bekommen.

    Das mit den Zeichen per Zeile habe ich einfach mal so gesetzt. Es ist mir schon klar das es ein bisschen groesser sein sollte aber zum Testen reichen 20 Zeichen, wie du auch in der Angabe sehen kannst ist die Test Datei nicht sehr gross.

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

  • Hast du den zweiten Punkt in Posting #2 beachtet?

    P.S. Schreib' vielleicht mal ein Makefile.

  • Ja ich habe punkt 2 in post 2 beachtet...... sehe post 3 EDIT

    habe es gerade nochmals kompeliert, hatte das -lm vergessen, kompeliert trotzdem. Du, Paulchen, hast noch das -D_GNU_SOURCE drangehaengt wovon plantschkuh! nicht geredet hat. Auch wenn ich es mit als option nehme bekomme ich keine fehlermeldungen.

    Ich kompeliere unter Terminal, Mac OS X. Schreibe es auch brav so rein wie du aber es kommen keine warnings oder fehlermeldungen, daswegen hatte ich ja auch gefragt WIE er sie bekommt.

    Entweder es wird bei mir irgendwelche Optionen ignoriert oder es ist etwas anderes, was mich aber trotzdem interesiert.

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

  • Du, Paulchen, hast noch das -D_GNU_SOURCE drangehaengt wovon plantschkuh! nicht geredet hat.

    Das hab ich drangehängt, weil sonst ein Stapel weiterer Fehlermeldungen kommt:

    Code
    calc.c:38: warning: implicit declaration of function 'strtof'
    ...
    calc.c:118: warning: implicit declaration of function 'fabsf'
    ...
    calc.c:146: error: 'opterr' undeclared (first use in this function)
    calc.c:146: error: (Each undeclared identifier is reported only once
    calc.c:146: error: for each function it appears in.)
    calc.c:154: warning: implicit declaration of function 'getopt'
    calc.c:196: error: 'optind' undeclared (first use in this function)

    Ich kompeliere unter Terminal, Mac OS X. Schreibe es auch brav so rein wie du aber es kommen keine warnings oder fehlermeldungen, daswegen hatte ich ja auch gefragt WIE er sie bekommt.

    Ich kompiliere mit GCC 4.2 auf einem x86_64-Linux (das ist, was Ringding gemeint hat). Mit GCC 3.x krieg ich übrigens die Warnung in calc.c:52 nicht.

  • Also ich habe gcc 4.0.1, hab das -m64 drangehaengt und den stack fehler auch bekommen. Aber sonst nichts, werde mal versuchen die gcc version von Leopard auf den neusten stand zu bringen und dann nochmal kompelieren. Kaum zu glauben das die version so viel ausmacht.

    Danke fuer alle Hinweise. Werde aber erst Samstag oder Sonntag rueckmeldung geben koennen.

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

  • Ich habe auch gcc 4.0.1 (Tiger).

    Code
    macbook-3:~/,storage/download/temp/mini/Mini Calculator sr$ gcc -m64 *.c -lm
    stack.c: In function 'stackpop':
    stack.c:77: warning: cast from pointer to integer of different size
    Zitat


    Kaum zu glauben das die version so viel ausmacht.


    In letzter Zeit (ab 4.0) sind sehr viele Warnungen dazugekommen. Aber in diesem Fall macht die Version anscheinend nichts aus.

  • Den Fehler hatte ich auch bekommen und dann behoben. Ich habe aber keine Ahnung wie die neueste version von gcc installieren kann, finde auf die schnelle auch keine Antwort bei google...

    ______________________________________________
    (\__/)
    (='.'=)This is Bunny. Copy and paste Bunny into ur
    (")_(")signature to help him gain world domination.
    ______________________________________________
    Windows ist für nur eins gut: WinZip :mad:@ AlgoDat

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!