Komischer Fehler (Steh ich jetzt aufm Schlauch???)



  • Der Code:

    m_pplTimeMatrix= new T*[m_iSize];
    for(int i=0; i<m_iSize; m_pplTimeMatrix[i]= new T[m_iSize], i++){
       for(int k=0; k<m_iSize; k++) //<-- (A)
    	m_pplTimeMatrix[i][k]=NULL; //<--- (B)
    }
    

    In der Zeile (siehe A) ist die Variable i noch 0 springt er dann in die zweite verschachtelte Schleife (siehe 😎 ist i plötlich (123542) ???



  • Du schreibst bei B in einen nichtinitialisierten Bereich (matrix[i] ist ein gültiges Datum, zeigt aber ins Nirvana, deshalb ist matrix[i][k] undefiniert).

    Geh nochmal die for-Anweisung durch 😉



  • versteh ich grad nich.. steh immer noch aufm Schlauch... oh mann



  • ist das , i++ ein Tippfehler oder absicht?



  • absicht....



  • Ok,

    ich denke, es geht um Folgendes:

    BorisDieKlinge schrieb:

    .... m_pplTimeMatrix[i]= new T[m_iSize], // Hier holst Du für den i. Eintrag Speicher
                              i++){ // Hier erhöhst Du i anschließend !
    ...
    	m_pplTimeMatrix[i][k]=NULL; // Hier ist i eins höher als beim new
    

    Mit einem

    ... m_pplTimeMatrix[++i] = new T[m_iSize]) // und kein i++ mehr
    

    kämst Du vermutlich klar.

    Gruß,

    Simon2.



  • würdest aber nicht bei 0 anfangen ...
    =>

    m_pplTimeMatrix= new T*[m_iSize];
    for (unsigned short time_x = 0; time_x < m_iSize; ++time_x)
    {
        m_pplTimeMatrix[time_x] = new T[m_iSize], 
        for (unsigned short time_y = 0; time_y < m_iSize; ++time_y)
            m_pplTimeMatrix[time_x][time_y] = NULL;
    }
    

    und schon sollte das gehen 😉



  • gut aber ich dachte das i wird erst nach der Iteration (Nach den Anweisungen i, for- Schleifen Block erhöht??

    d.h.:

    for (int i = 0; i < m_iSize; ++i){ 
       m_pplTimeMatrix[i] = new T[m_iSize];
       ....
    }
    

    verhält sich anders als:

    for (int i = 0; i < m_iSize;m_pplTimeMatrix[i] = new T[m_iSize], ++i){ 
        ....
    }
    

    aber wieso?



  • BorisDieKlinge schrieb:

    gut aber ich dachte das i wird erst nach der Iteration (Nach den Anweisungen i, for- Schleifen Block erhöht??

    d.h.:

    for (int i = 0; i < m_iSize; ++i){ 
       m_pplTimeMatrix[i] = new T[m_iSize];
       ....
    }
    

    verhält sich anders als:

    for (int i = 0; i < m_iSize;m_pplTimeMatrix[i] = new T[m_iSize], ++i){ 
        ....
    }
    

    Ja was dachtest Du denn?
    a) Du hast festgestellt: i wird erst nach dem Schleifendurchlauf erhöht
    b) im ersten Beispiel machst Du new explizit am Anfang des Durchlaufs
    c) im zweiten Beispiel machst Du new in einer Kommaliste zusammen mit ++i, welches am Ende des Durchlaufs ausgeführt wird

    Wann wird nun new im Fall c) durchgeführt? (Tipp: Unmittelbar vor ++i).



  • hmm ok.. dann müsste die ganze Geschichte gehen wenn ich das "new..." und "i++" vertausche?

    for (int i = 0; i < m_iSize;, ++i,m_pplTimeMatrix[i] = new T[m_iSize]){ 
        .... 
    }
    


  • btw, kann sein das das nur mir so geht aber ich finde das fällt unter Mißbrauch einer for-Schleife 😉

    die new-Anweisung in der inkrement-bedingung gehört da imho einfach nciht hin. Das führt nur zu Problemen, vor allem weil sich die schleife hier unerwartet verhält.

    Normalerweile wenn ich eine Schleife im Stil for (i=0; i<5; ++i) baue, dann erwarte ich als gültige werte 0,1,2,3,4 . Ich würde also auch erwartem das in dem Beispiel m_pplTimeMatrix[] von 0 bis 4 initialisiert wird.

    Jedoch genau das ist nciht der Fall, denn die Iteration wird ja am Ende der for-schleife durchgeführt _vor_ der Abbruchbedingung. Demnach werden bei diesem Schleifenkonstrukt am ende m_pplTimeMatrix[] von 0 bis 5 initialisiert sein. (Mal davon ausgehend das dieses Konstrukt überhaupt richtig funktioniert).

    Allein deswegen würde ich schon dringend von solchen "Ich bin cooler" Konstrukten abraten. was ist denn falsch an einer schönen, einfachen Schleife wie dieser:

    [cpp]
    for (int i = 0; i < m_iSize; ++i){
    m_pplTimeMatrix[i] = new T[m_iSize];
    ....
    }
    [/code]

    Mal davon abgesehen das man nur eine Zeile hat in der new steht und nicht zwei.



  • BorisDieKlinge schrieb:

    hmm ok.. dann müsste die ganze Geschichte gehen wenn ich das "new..." und "i++" vertausche?

    for (int i = 0; i < m_iSize;, ++i,m_pplTimeMatrix[i] = new T[m_iSize]){ 
        .... 
    }
    

    Muss ich jetzt allen ernstes für Dich die for-Schleife aufdröseln?

    for (init; cond; cont) { ... } // entspricht
    init; while (cond) { ...; cont; }
    

    Die Allokation des Speichers für matrix[i] wird unmittelbar vor oder nach ++i stattfinden (je nach Reihenfolge), und damit am Ende des Schleifenkörpers. Da Du auf matrix[i] im Schleifenkörper bereits zugreifst, wird das so nicht ordentlich funktionieren können.

    Davon ab halte ich es mit bloblo.



  • hmm ok .. stimmt sorry.. KLEINER Denkfehler 😃 ! Aber danke für die Aufklärung



  • BorisDieKlinge schrieb:

    gut aber ich dachte das i wird erst nach der Iteration (Nach den Anweisungen i, for- Schleifen Block erhöht??...

    Ein "beliebtes" Mißverständnis des Post-Operators. Der Unterschied zwischen Post- und Pre- liegt an der Reihenfolge zwischen Increment und Ergebnis-Zuweisung ! Da Du das Ergebnis von i++ gar nicht verwendest, hat das gar nichts mit der Schleife zu tun !

    BorisDieKlinge schrieb:

    gut aber ich dachte das i wird erst nach der Iteration (Nach den Anweisungen i, for- Schleifen Block erhöht??

    d.h.:

    for (int i = 0; i < m_iSize; ++i){ 
       m_pplTimeMatrix[i] = new T[m_iSize];
       ....
    }
    

    verhält sich anders als:

    for (int i = 0; i < m_iSize;m_pplTimeMatrix[i] = new T[m_iSize], ++i){ 
        ....
    }
    

    aber wieso?

    Genau DAS habe ich Dir in meinem ersten Posting erklärt....
    und übrigens das Verhalten der ersten Variante ist genau das, das Du haben willst und keinen Fehler verursacht. 😃 (und sauberer ist es sowieso)

    BorisDieKlinge schrieb:

    hmm ok.. dann müsste die ganze Geschichte gehen wenn ich das "new..." und "i++" vertausche?

    for (int i = 0; i < m_iSize;, ++i,m_pplTimeMatrix[i] = new T[m_iSize]){ 
        .... 
    }
    

    Mal abgesehen davon, dass ich bloblo zustimme: Warum nimmst Du nicht meinen Tipp aus meinem ersten Posting an ? Warum inkrementierst Du i nicht da, wo Du es brauchst: In m_pplTimeMatrix[++i] ?

    Gruß,

    Simon2.



  • ok Chef;) mach ich 😉 Danke 🤡



  • Gern geschehen !

    Good luck,

    Simon2.


Anmelden zum Antworten