c array



  • #include <stdio.h>

    int main(int argc, char* argv[])
    {
    double coord[100];
    double tStep;
    int steps;
    double ub[100];
    int i, j;

    tStep = 0.001;
    steps = 100;

    for (i=0; i<100; i++) {
    coord[i] = 0.0;
    ub[i] = 0.0;
    };

    for (i=0; i<steps; i++) {
    for (j=100; j>=1; j--) {
    ub[j] = 0.000002+ ub[j-1];
    };
    };
    printf("n: %d , coord[0]: %f\n",i, coord[0]);

    }

    Hallo zusammen,
    mit obenliegendem Programm bekomme ich coord[0]=0.0002, wobei ich 0.0 erwarte.
    Hat jemand eine Idee, woran kann es liegen?



  • for (j=100; j>=1; j--) {
      ub[j] = 0.000002+ ub[j-1];
    };
    

    Wahrscheinlihc schreibst du an dieser stelle in wild in den speicher, da ub nur gültige indices von 0..99 hat.
    wenn der Compiler die Variablen so anlegt, dass das coord direkt hinter up liegt, dann wird das erste element von coord überschrieben.

    Ein guter Kompiler sollte aber hier schon zur kompiletime eine Warnung ausgeben.



  • vlad_tepesch schrieb:

    Ein guter Kompiler sollte aber hier schon zur kompiletime eine Warnung ausgeben.

    😮

    Und wie sollte er deiner Meinung nach erkönnen können, daß der
    Indexbereich überschritten wird (werden könnte)?



  • da das array direkt lokal mit 100 elementen deklariert wird und jeder programmablaufpfad (es gibt nur einen) direkt auf den Zugriff des 101. Elements hinausläuft.

    Bild mir ein schon mal so eine Warnung gesehen zu haben, bin mir aber nicht sicher. (eventuell mingw?)



  • @orangensaft: In Zukunft bitte Code-Tags benutzen. Ist einfach lesbarer... 🙂



  • Javaner schrieb:

    vlad_tepesch schrieb:

    Ein guter Kompiler sollte aber hier schon zur kompiletime eine Warnung ausgeben.

    😮

    Und wie sollte er deiner Meinung nach erkönnen können, daß der
    Indexbereich überschritten wird (werden könnte)?

    char s[100];
    s[100]=65;
    

    Wieso sollte das ein Compiler nicht erkennen können? Möglich wär's in bestimmten (simplen) Situationen durchaus.



  • das kann ja gewünscht sein, würd ned sagen daß des da oben ein fehler ist. wenn ich weiß, wasich tue, ist der code ja durchaus legitim.



  • sowas ist definitiv ein fehler.
    Man kann nie wissen, was bei der Codeoptiomierung an so einer stelle passiert, da man nicht davon ausgehen kann, dass die speicherstelle, an die man auf diese art und weise schreibt, auch die nächste Variable ist, die man deklariert hat



  • deshalb testet man es nach dem kompilieren ja auch.



  • bamser schrieb:

    das kann ja gewünscht sein, würd ned sagen daß des da oben ein fehler ist. wenn ich weiß, wasich tue, ist der code ja durchaus legitim.

    Es war die Rede von einer Warnung, nicht von einem Fehler.



  • bamser schrieb:

    deshalb testet man es nach dem kompilieren ja auch.

    Hääh!?!?!? 😮

    Nur auf das was eindeutig definiert ist darf man
    sich verlassen und entsprechend coden.

    Wo kämen wir denn hin, wenn man sich nur auf Ergebnisse
    des Kompilats verläßt? Der Compiler kann in der nächsten
    Version Undefiniertes vollkommen anders bearbeiten.



  • Nein du Träumer. Ich weiß ganz genau welchen Compiler ich verwende und verwenden werde und deshalb kann ich sowas problemlos tun, wenn ich weiß, wie sich der Kompilierer verhält. Behalt deine Windoof Weisheiten mal schön für dich...



  • bamser schrieb:

    Nein du Träumer. Ich weiß ganz genau welchen Compiler ich verwende und verwenden werde und deshalb kann ich sowas problemlos tun, wenn ich weiß, wie sich der Kompilierer verhält.

    Wieso Träumer? 😕

    Welche Compiler du wie verwendest bleibt natürlich dir überlassen.
    Aber so muß nun ja nicht jeder denken.

    bamser schrieb:

    Behalt deine Windoof Weisheiten mal schön für dich...

    Das ausgerechnet mir jemand Windoof-Weisheiten nachsagt
    finde ich schon irgendwie amüsant. 😃

    Ich habe schon unter Unix programmiert, als WinDoof und Linux
    noch nicht mal angedacht waren.



  • char s[100]; 
    s[100]=65;
    

    Wenn Du so etwas (oder auch nur etwas ähnliches) machen musst,
    stimmt aber auch etwas mit Deinem Codedesign nicht.
    Zu viel Compilerhilfe erschwert das Lernen der Logik. 😛



  • Asmodiel schrieb:

    char s[100]; 
    s[100]=65;
    

    Wenn Du so etwas (oder auch nur etwas ähnliches) machen musst,
    stimmt aber auch etwas mit Deinem Codedesign nicht.
    Zu viel Compilerhilfe erschwert das Lernen der Logik. 😛

    Falls du mich meinst (ist ja mein Beispielcode): das sollte nur ein Beispiel für ein Konstrukt sein, dass ein Compiler erkennen könnte, um eine Warnung auszuspucken. Natürlich findest du sowas in meinem Code nicht! 🙂


Anmelden zum Antworten