Beiträge von lowkey

    Ohne eine spezifikation kann man nicht viel machen weil auch fuer ein Taschenrechner sehr viele Fragen aufkommen, wie z.b. die Input Notation
    (ie. 1 2 + oder 1 + 2 oder + 1 2 etc)

    zu dem Code was du gepostet hast:
    meiner Meinung nach sollte man den default zweig des switches NUR fuer eine Fehlermeldung verwenden. Fuer das was du machst gibt es denn '?' case, ich weis jezt nicht genau ob das in C# auf drin ist aber sollte sein. Das ? heist einfach das alle anderen characters in diesen Case fallen, was auch eine zahl waere.

    Die negativ ueberpruefung:
    der User Input erfolg mittels der Konsole also kommt es ueber einen String zu deinem Programm. Daher wird ein char array verwendet. Jede zahl wird in einezelen zahlen gegliedert z.B. 999 wird als '9' '9' '9' in je einem Index gespeichert.

    Code
    ---99 == -99

    das oben angegebene code stueck zeigt dir warum

    Code
    while (temp == '-')
                {
                    isNegative = !isNegative;
                    count++;
                    if (count < input.Length)
                        temp = input[count];
                    else
                        break;
                }

    ausgefuehrt wird, eben wegen diesen mehrfachen '-'. Sobald dieses '-' nicht mehr auftritt bleibt der nicht '-' char in temp gespeichert und die boolean variable isNegativ ist entweder true oder false, true bei ungerader Anzahl an '-' chars und anders false.

    Das potenz Zeichen ist '^'. Die Funktion sollte so aussehen wie du sie hast. Das mit dem Punkt vor Strich Rechnung wuerde dann vieleicht so aussehen das man zwei schleifen hat mit je einem switch. Einmal fuer + und - und dann einmal fuer * und /

    Die Prioritaet fuer den Potenz Operator ist das wirklich entscheidende an diesem Beispiel, sonst waere es ja viel zu einfach fuer eine Bewerbung. Ein Ansatz waere den input String durchzulaufen und dir den Index von drei Operatoren zu merken, das heist du brauchst einem int array [3]. Du gehst den input String durch und speicherst in [0] den Index eines Operators in der folgenden Enumeration {'-','+','/','*'}. Sollten nun ein '^' char im input String sein sollte dieser Index in [1] gespeichert werden. Dann geht es weiter bis man den naechsten Operator erreicht und speichert dessen index in [2]. Zwischen diesen drei Indecies sind jetzt deine zwei Zahlen fuer die Potenz Rechnung.

    Jetzt schneidest du Teilstrings ab, und zwar von inputString[0] bis inputString[[0]], das heist alles inlusieve des ersten operators. Ein zweiter Teilstring ist dann inputString[[2]] bis inputString[inputString.length()]. Also alles von dem dritten operator bis zum ende. Jetzt hast du in inputString nur noch deine zahlen und den potenz Operator. Nach erfolgreichem rechnen muss man das ergebnis der Potenz rechnung mit den Teilstring wieder zusammen schneiden.

    Also in ungefaehr so: teilstring1 + ergebnis + teilstring2. Natuerlich muesste das ganze in einer schleife durchlaufen werden weil es mehrere potenz Operatoren geben koennte.

    Dies ist jetzt nur so schnell hingetippt und ich weis den genauen C# code nicht und ich weis auch nicht ob es die beste Loesung ist, wahrscheinlich nicht. Ich hoffe ich habe jetzt nicht zu viel geholfen da dies ein Bewerbungsbeispiel ist.

    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...

    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.

    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.

    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.

    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

    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

    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

    Nach den zwei letzen Posts kann ich mich ja richtig auf Sysprog freuen :shinner:

    Aber eine kurze Frage zu deinem Test Beispiel Plantschkuh!,

    ich sehe da kein pointer :engel:. Ich sehe das array und dann den Versuch es zu inkrementieren, was ich so verstehen wuerde das es das Array groesser machen soll. Ich wuerde halt sage das der Code gar nicht funktioniert. Aber ich wuerde hier nie an einen Pointer denken, die Antwort vom Assi hat mich deshalb verwirrt.

    Generelle Frage zu dem Casten. Bei sollchen Funktionen wie free(), sollte ma da dann einen int return wert haben zum Beispiel und diesen Wert dann pruefen und eventuell was ausgeben? Ich denke das waere Fehler Behandlung in diesem Sinne oder? Z.B. -1 zurueck geben wenn es nicht geklappt hat.

    Danke nochmals an alle fuer die guten Erklaerungen und ich werde sicher noch ein paar Fragen vor dem Winter Semester haben :verycool:

    Wegen malloc, ich habe gelesen das diese funktion einen pointer vom typ Void zurueckgibt und daswegen mache ich den cast zu float.

    Ich habe mir auch die sysprog Folien angeschaut, daswegen mache ich auch gerade C :P. Da steht der cast auch mit drin. Da ich mit C noch nicht sehr viel gemacht habe habe ich es halt so wie in den Folien gemacht.

    Danke fuer die weitere Erklaerung von -O2. Wundert mich aber schon das bei einer uninitialized variable der normale compiler ohne die O2 option net meckert.

    Also ich benutze immer: gcc -ansi -pendatic -wall
    aber ich habe keine Warning bekommen als ich Kompiliert habe was mich im nachinein auch wundert.

    Fuer was ist denn das -O2 gut? Ich weis irgendwas mit structs aber wuerde gerne genaueres wissen :)

    Kurze andere Frage:
    Ich wollte gerade realloc testen in meinem Programm. Es tut auch die gewuenschte groesse reallocieren ABER, es gibt ein paar Werte die komisch sind, im erweiterten Teil. Sind nicht alle aber manche haben den Wert -0 und 3 von ihnen den Wert 39615136492207134461438014706212143104.000000. Nach diesem Wert kommt am ende wieder ein Korrekter Wert im letzen Index, naemlich 0.

    Benutze:

    Code
    *numbers = (float*)realloc(*numbers, stack_size);

    Koennte mir jemand erklaeren wieso das so ist? Werde natuerlich auch selber suchen aber ka wie weit ich da heute noch komme. Danke im Voraus.

    vielen dank fuer die Antworten. Das mit den Arrays in C ist sowieso eine sehr Komische sache da sie nicht limitiert sind, auser der programmierer setzt sich mit variablen grenzen.

    int test[5];
    test[5] = 7;

    wird zum beispiel problemlos akzeptiert und auch gemacht was fuer mich sehr komisch is aber nagut, dann werde ich mal weiter machen :D

    Erstmals danke fuer den Tipp mit dem leeren Argumenten set, werde ich mir merken.

    Danke auch fuer die vielen posts aber ich habe gerade, nachdem ich einen schoenen langen Post getippt habe mein Fehler gefunden. Es ist ein echt peinlicher Fehler und ich kann es nicht fassen das ich es nicht frueher gesehen habe.

    Ich hatte eine float variable und wollte sie mit folgendem code ausgeben:

    Code
    printf("The magic number is: %d\n", u);

    Is ja klar das da nichts richtiges rauskommen kann:devil:

    Fuehle micht jetzt recht dumm hahaha. Nochmals danke fuer eure Hilfsbereitschaft, werde mich sicher demnaechst wieder melden wegen einem "Problem" :distur:

    Aber kurze Frage noch,

    Code
    *numbers = (float*)malloc (STACK_GROW_INTERVAL * sizeof(float));
        stack_size = sizeof(numbers);

    warum hat im obigen code stack_size nacher den Wert 4?
    STACK_GROW_INTERVAL hat den Wert 16.

    Ich hab mal angefangen ein bisschen in C zu programmieren. Ich komm ganz ok voran aber momentan bin ich total ratlos. Folgendes szenario:

    Ich habe ein paar funktionen in einer .c datei drin die auch ein return wert haben. Diese funktionen werden in einem anderen .c in der main aufgerufen. Das Problem ist aber das ich einen return wert von 0 bekomme anstatt den gewuenschten Wert. Auch total simple funktionen wie:

    int test()
    {
    return 5;
    }

    funktionieren nicht, kommt 0 zurueck, habe das mit printf und einer variable ueberprueft. In einem anderen program laufen die return Werte problemlos. Ich bin einfach ratlos warum es immer 0 zurueck gibt, bzw. scheint. Die variable die ich dann mit printf ausgeben ist natuerlich auf einen Wert initialisiert damit ich es merke falls was falsch laeuft.

    Ich hoffe mir kann jemand helfen. Waere natuerlich bereit code zu posten aber vieleicht ist es ein sehr banaler fehler und ihr muesst mein graesslichen code nicht durchschauen :p

    wollte nur die Lösung von Vertigo bestätigen. Es ist aber egal wie gross die Paritition ist, have meine 20 Gigs gemacht. Wenn Windows die Komponenten von der CD lädt sollte man F10 oder Fn + F10 drücken, hab beides gemacht um sicher zu sein :D. Keine Angst wenn nicht gleich etwas passiert. Man muss warten bis der lade Vorgang fertig ist. Dann kommt man zur Recovery Console wo man dann den Befehl eingibt und alles ist gut :P.

    @mjx mit den 75 Euro meinst du das du 75 Euro weniger bezahlt hast, mit der doppeltet grossen festplatte + 1GB ram, als für die standard version. Also was ich mein, mit den zusätzlichen sachen hat das ding trozdem 75 Euro weniger als die standard version gekostet?