Probleme mit Return

  • 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

    ______________________________________________
    (\__/)
    (='.'=)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

  • Waere natuerlich bereit code zu posten

    Ich bitte darum. Die main, den Aufruf der Funktion test... Versuche, einen möglichst einfachen Fall zu finden, der nicht so funktioniert wie du es dir vorstellst.

  • es könnte sein dass du in dem programm wo es nicht funktioniert bereits eine funktion namens test() hast in irgend einer include file welche dann ausgeführt wird anstatt der welche du testen möchtest

    ka wie ein c compiler bei sowas reagiert aber das würde erklären wieso es anderso geht

    eine andere möglichkeit wäre, du sagst du hast die funktionen in einer .c file drin und verwendest sie in einer anderen .c file
    ka was der standard und so ist bei c aber der normalfall ist dass du die deklarationen in einer .h file hast und die definitionen in einer .c file, wenn du dann diese funktionen in 2 verschiedenen c files verwenden moechtest dann inkludierst du die .h file in beiden

    wenn ka was genau du gemacht hast, #include "deinefile.c" .. ka ob sowas überhaupt geht? möglich dass du denkst du verwendest diese funktionen aber in wirklichkeit sind sie dem compiler nicht bekannt und er macht sie einfach deswegen und sie sind entsprechend leer bzw geben 0 zurück

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

    Einmal editiert, zuletzt von Vevusio (6. August 2008 um 02:42)

  • möglich dass du denkst du verwendest diese funktionen aber in wirklichkeit sind sie dem compiler nicht bekannt und er macht sie einfach deswegen und sie sind entsprechend leer bzw geben 0 zurück


    Nein. In C89, und das ist der noch immer am weitesten verbreitete Standard, ist es absolut legitim, nicht deklarierte Funktionen aufzurufen. Wenn man sie aber nirgends definiert hat, schreit der Linker. Eine Defaultimplementierung wird dir kein C-Compiler synthetisieren.

    *plantsch*

  • und obs jetzt in einem .h(pp) file oder .c(pp) drin steht ist dem compiler herzlich wurscht. Dor wo das include steht wird "mehr oder weniger" eine Art copy-paste gemacht.

    mfg Schakal

  • int test()


    Du solltest dir uebrigens moeglichst frueh, also genau jetzt, angewoehnen, Argumentlisten in C nicht leerzulassen. Eine leere Argumentliste heisst naemlich nicht "diese Funktion hat keine Argumente", sondern aus traditionellen Gruenden leider "diese Funktion koennte Argumente haben, vielleicht auch nicht, aber ich sage es dir nicht". Wenn du ausdruecken willst, dass test keine Argumente nimmt, schreib "void" in die Argumentliste:

    Code
    int test(void)


    Dann kann dein C-Compiler das Programm besser auf Typfehler ueberpruefen.

    *plantsch*

  • Danke Kuh, hab das grad bei meinem aktuellen Projekt ergaenzt (wusste es naemlich nicht diese () != (void) und hab natuerlich justament einen Fall gehabt wo im Header () stand und im src dann (blabla)

    Bist ja eine ziemliche C-Crack-Kuh!

    I like Toast!

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

    ______________________________________________
    (\__/)
    (='.'=)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

    Einmal editiert, zuletzt von lowkey (6. August 2008 um 15:29)

  • Zitat

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

    vl irre ich mich ja total, aber du erzeugst ja einen Float Pointer mit 4*16 Bytes Größe.

    sizeof(number) liefert 4 weil die größe vom Pointer geliefert wird
    sizeof(*number) liefert das gewünschte ergebnis

    sorry falls ich da falsch liege - die pointer zeit is lange her *gg*

    Paddys, hm.....

  • sizeof liefert immer nur Konstanten, in deinem zweiten Fall (sizeof(*number)) also sizeof(float) (sofern numbers ein float* ist). Man kann in C einfach nicht die Größe eines mit malloc allozierten Blocks herausfinden.

  • vl irre ich mich ja total, aber du erzeugst ja einen Float Pointer mit 4*16 Bytes Größe.

    sizeof(number) liefert 4 weil die größe vom Pointer geliefert wird
    sizeof(*number) liefert das gewünschte ergebnis

    sorry falls ich da falsch liege - die pointer zeit is lange her *gg*


    "sizeof(*number)" liefert die Größe des Pointers, auf einem "normalen" 32-bit Prozessor also 4. Das korrekte Ergebnis würde bei obigem Beispiel "STACK_GROW_INTERVAL * sizeof(float)" liefern. Die Größe von Arrays fixer Größe lässt sich zwar mit sizeof berechnen -- allerdings zieht das insgesamt mehr Verwirrung nach sich als es des Lesbarkeit hilft.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • 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

    ______________________________________________
    (\__/)
    (='.'=)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

  • da hattest du schlicht glueck, dass der beriche frei war. wenn du in einen bereich schreibst in dem du nichts verloren hast (der nicht allokiert wurde), dann kann dir das programm auch segfaulten, weil die memory protection vom OS zuschlaegt.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Bist ja eine ziemliche C-Crack-Kuh!

    ich denk mir auch immer wieder er/sie hat zum fruehstueck nicht gras sondern den C-standard gefressen ;)


    Muh! Danke für [strike]die Blumen[/strike] den Klee. Vor erschreckend langer Zeit war ich regelmäßiger Gast in comp.lang.c, da lernt man Sachen, von denen einem die Hörner schlackern.

    *plantsch*

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

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


    Ein richtig guter Compiler sollte dich warnen, wenn du sowas probierst. GCC zum Beispiel:

    Es ist dringendst empfohlen, deinen Compiler (fast... :)) so streng wie möglich zu stellen. Warnings sind nicht dafür da, dir zu zeigen, daß dein Compiler nicht mag, sondern um dir Hilfestellungen zu geben, wie du dein Programm verbessern kannst. Es lohnt sich rauszufinden, wie du deinen Compiler dazu bringst, dir für solchen Code eine Warnung auszugeben.

    -Wall -Wextra -ansi -pedantic -O2 rulez.

    *plantsch*

  • Es ist dringendst empfohlen, deinen Compiler (fast... :)) so streng wie möglich zu stellen. Warnings sind nicht dafür da, dir zu zeigen, daß dein Compiler nicht mag, sondern um dir Hilfestellungen zu geben, wie du dein Programm verbessern kannst. Es lohnt sich rauszufinden, wie du deinen Compiler dazu bringst, dir für solchen Code eine Warnung auszugeben.

    -Wall -Wextra -ansi -pedantic -O2 rulez.

    Das blöde ist halt, dass sich einige Libraries nicht an diese Empfehlung halten. Dadurch hat man dann halt, wenn man so eine Include-File einbindet, gleich ein paar Screens voll Warnungen, gegen die man eigentlich nichts machen kann.

  • Das blöde ist halt, dass sich einige Libraries nicht an diese Empfehlung halten. Dadurch hat man dann halt, wenn man so eine Include-File einbindet, gleich ein paar Screens voll Warnungen, gegen die man eigentlich nichts machen kann.

    hm, man sollte halt libs von leuten meiden, die keine ahnung vom programmieren haben. bevor mein code nicht bei "-ansi -Wall -pedantic" ohne fehlermeldungen durchlaeuft zeige ich ihn nicht her. ich weisz, das liefert noch lange keine aussage ob es guter code ist, aber es ist imo eine grundvoraussetzung.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

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

    ______________________________________________
    (\__/)
    (='.'=)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 (7. August 2008 um 00:02)

Jetzt mitmachen!

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