zeiger zeigt auf falsches feld



  • hallo!
    ich stehe vor einem echt merkwürdigen problem. eigentlich ist es ja schon gelöst, aber ich weiß nicht, wieso es überhaupt entstanden ist.
    nun gut, hier erstmal mein ursprünglicher code:

    double test1[2];
    test1 [0] = 0.7;
    test1 [1] = 0.88;
    test1 [2] = 0.999;
    double test2[2];
    test2 [0] = 0.1;
    test2 [1] = 0.22;
    test2 [2] = 0.345;
    vector_add (&test1[0], &test2[0]);
    

    die funktion vector_add() hab ich hier:

    void vector_add(double* pveca, double* pvecb)
    {
    	cout << *(pveca) << "|" << *(pveca+1) << "|" << *(pveca+2) << endl;
    	cout << *(pvecb) << "|" << *(pvecb+1) << "|" << *(pvecb+2) << endl;
    }
    

    so weit so gut. gehen tut das (normalerweise). es wird der funktion also die adresse der beiden ersten felder des arrays übergeben. dann gebe ich die felder aus, auf die der zeiger zeigt. es werden auch überall die richtigen werte angezeigt, nur einer spielt verrückt!
    hier die ausgabe:

    0.345|0.88|0.999
    0.1|0.22|0.345

    *(pveca) zeigt nicht auf das erste feld von test1, sondern auf test2[2]! alles andere geht, also *(pveca) zeigt korrekterweise auf test1[1] und so weiter. nur das eine feld geht nicht. wieso, woran kann das liegen?

    das problem habe ich dahingehend gelöst, dass ich einfach das array test2 nicht mit drei sondern mit 4 feldern deklariert habe. dann ging alles wunderbar! wenn ich jetzt z.B. das letzte feld, also test2[3] mit irgendeinen wert füle, dann zeigt *(pveca) trotzdem den richtigen wert an! und das verstehe ich kein bisschen!

    Ich bedanke mich schonmal im voraus!



  • double test1[2];
    

    sind nur 2 felder ( index 0 und 1 ).
    Kurt



  • Hallo,
    Hier ist bereits ein Fehler enthalten:

    Ulf schrieb:

    double test1[2];
    test1 [0] = 0.7;
    test1 [1] = 0.88;
    test1 [2] = 0.999;
    double test2[2];
    test2 [0] = 0.1;
    test2 [1] = 0.22;
    test2 [2] = 0.345;
    

    Merke: Ein Array mit N Elementen besitzt die Indizes 0 bis (N - 1). D.h. wenn du ein Array test1[2] anlegst, darfst du nur in den Speicher test1[0] und test1[1] schreiben und nicht auch noch in test1[2]!. Du schreibst in deinem Beispiel in Speicher der dir nicht gehört!

    /edit: zu spät...

    Gruß Caipi



  • aber test[2] wird ja korrekt angezeigt, bzw. es funtzt ja, wenn ich test2 um ein feld vergrößer und test1 so lasse.
    und wieso wird dann ausgerechnet beim ersten fels von test1 das erste feld von test2 angezeigt?

    aber schonmal danke für die schnelle antwort!

    edit:
    mensch, hab noch nichtmal ne antwort geschrieben, und schon die zweite antwort von euch! thx für die schnellen antworten!
    ok, werd ich mir merken. klingt auch irgendwie logisch 😃



  • Ich stolpere auch immer wieder darüber 🙂
    Man definiert mit [32] 32 Elemente aber die werden anderst nummeriert.
    Am einfachsten ist es immer [32+1] zu schreiben. Dann bist Du auf der sicheren Seite 🙂



  • noobie schrieb:

    Am einfachsten ist es immer [32+1] zu schreiben. Dann bist Du auf der sicheren Seite 🙂

    Oder man gewöhnt sich in der Informatik einfach an, das man nicht bei Eins sondern
    bei Null zu zählen beginnt. Hier wachsen auch die Bäume in den Boden :p



  • curry-king schrieb:

    noobie schrieb:

    Am einfachsten ist es immer [32+1] zu schreiben. Dann bist Du auf der sicheren Seite 🙂

    Oder man gewöhnt sich in der Informatik einfach an, das man nicht bei Eins sondern
    bei Null zu zählen beginnt.

    ja, ich denke, das ist die richtige Lösung. Wenn man mit Pintern, Arrays, usw. arbeitet, sollte man auch vorsichtig sein.

    curry-king schrieb:

    Hier wachsen auch die Bäume in den Boden :p

    :p 🙂 😃


Anmelden zum Antworten