Warum läuft meine For Schleife nicht bis zum Ende



  • Bitte noch als Ergänzung:

    mit einem Array der Größe 10 scheint alles zu funktionieren, aber warum nicht mit einem größeren Intervall?



  • welcher fehler? vielleicht teilt er durch 0?
    der erste audruck im for-schleifenkopf sieht auch komisch aus.



  • Danke dachschaden!

    "Und dein Problem ist, dass versucht wird, durch Normal[jkl] zu teilen. Du hast aber nicht 200 Elemente an Normal verteilt, sondern nur 196 (und 199 an Vergleich), der Rest der Elemente wird mit 0 initialisiert, und eine Division durch 0 macht Bumm."

    Wie hast du so schnell gesehen, dass ich im einen array nur 196 Elemente hatte?



  • FragenstellerC schrieb:

    Wie hast du so schnell gesehen, dass ich im einen array nur 196 Elemente hatte?

    Man entfernt die Größenangabe in der Arraydeklaration:

    int Normal[] = {/*Bla*/};
    int Vergleich[] = {/*Blubb*/};
    

    , und dann lässt man den Compiler für einen rechnen:

    printf("%lu|%lu\n",sizeof(Normal) / sizeof(Normal[0]),sizeof(Vergleich) / sizeof(Vergleich[0]));
    

    Ausgabe: 196|199 .



  • So ärgerlich, echt.

    Aber eins noch: Wenn ich long double nehme kennt Visual Studio das und kann damit rechnen. Aber DevC scheint long double nicht zu kenner da zeigt er mir stehts 0.0000 an



  • Kenne mich mit DevC nicht aus, aber liege ich korrekt damit, wenn ich rate, dass da mit MinGW gearbeitet wird? Denn dann lass dir gesagt sein, dass MinGW in der Hinsicht wohl kaputt ist.

    Unter Windows sind long double und double das gleiche, da würde man %f nehmen. Aber unter Linux nimmt man laut der Manpage %LF . Ich habe aber grad nur Linux offen, deswegen kann ich darüber nur spekulieren.



  • Danke dir dachschaden hast mir sehr weitergeholfen!



  • dachschaden schrieb:

    Unter Windows sind long double und double das gleiche,

    Quatsch.

    #include <float.h>
    printf("%s",DBL_MAX<LDBL_MAX?"ungleich":"gleich");
    

    long double ist schon seit C89 im Standard, deshalb macht MinGW es auch dann richtig, wenn es für printf msvcrt benutzt.

    Will man bei MinGW sicherstellen, dass stdio nicht nach MS-Gusto läuft, z.B. wenn man auf C99 Wert legt, dann sollte man

    #define __USE_MINGW_ANSI_STDIO 1
    #include <stdio.h>
    

    verwenden, dann ersetzt der MinGW-Compiler die msvcrt-Funktionen durch eigene und es funktioniert alles bestens, sogar für C99, und man braucht nicht auf die (nicht standardkonformen) MS-Rumfrickeleien zu setzen; z.B. "%I64d"-Nonsens für unsigned long long u.ä.



  • Wutz schrieb:

    Quatsch.

    Gerade eben mal getestet:

    #include <float.h>
    #include <stdio.h>
    
    int main(void)
    {
        printf("%I64u|%I64u\n",sizeof(double),sizeof(long double));
        printf("%f\n%f\n",DBL_MAX,LDBL_MAX);
        printf("%s",DBL_MAX<LDBL_MAX ? "ungleich" : "gleich");
        getc(stdin);
        return 0;
    }
    

    Ausgabe:

    8|8
    179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
    179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
    gleich
    

    Kompiliert mit Visual Studio 2015, auf einem 64-Bit System.
    Ich bleibe bei meiner Aussage, dass long double und double gleich sind auf Windows.



  • Dev-Cpp (Orwell 5.1.1) benutzt MinGW/gcc4.9.2, und der zeigt unter einem 64Bit-Windows Unterschiede zw. double+long double an.
    Deine Aussage "unter Windows ist..." ist unhaltbar und für dieses Standard C Forum mindestens unplaziert.



  • Auf Windows, mit dem nativen, extra für diese Plattform bereitgestellten Compiler. Was ich von DevC, welches MinGW verwendet, nicht unbedingt behaupten will. Und dieses C-Forum hat nix zu sagen über long double , weil long double per Definition nicht eindeutig definiert ist:

    The long double type matches an IEC 60559 extended format, else a non-IEC 60559 extended format, else the IEC 60559 double format.

    Von daher muss man schon festlegen. was unter was irgendwie spezifiziert ist. Ob es jetzt 64 Bits oder 80 Bits oder 106 Bits oder 128 Bits lang ist.

    EDIT: Und nicht vergessen: der TE hat explizit nach VS gefragt.


Anmelden zum Antworten