Speicher für Matrix reservieren



  • Hallo alle zusammen,

    da ich schon seit Tagen das Internet durchforste und auch in diversen Büchern und Foren keine zufriedenstellende Antwort gefunden habe, poste ich mal mein Problem.

    Es geht um eine Matrix mit den Grenzen [nrl...nrh][ncl...nch]. Das Prinzip ist klar: Erst den Speicher für die Zeilen reservieren und dann für jedes Element einer Zeile. Allerdings verstehe ich nicht was in den mit "Frage 1|2" kommentierten Zeilen passiert. 😕

    /*Speicher für Zeilen reservieren*/
    m = (char**) malloc((nrh-nrl+1)*sizeof(char*)))
    if((m == NULL)
         {   
          printf("kein speicher\n"); 
          exit(0); 
         } 
    
      /*Frage 1: Was passiert hier?*/
      m -= nrl;
    
      /*Speicher für Spalten reservieren */
      for(i=nrl;i<=nrh;i++)
        { 
         m[i] = (char*) malloc((nch-ncl+1)*sizeof(char)))    
         if((m[i] ==NULL)
           {
            printf("kein speicher\n"); 
            exit(0); 
           } 
    
          /*Frage 2: Was passiert hier?*/
         m[i] -= ncl; 
        }
    

    Vielen Dank schonmal für eure Hilfe 🙂



  • a -= b
    bedeutet so viel wie
    a = a-b



  • Das habe ich verstanden 😉

    Was passiert in den zwei Zeilen? Warum wird m bzw. m[i] um genau diesen Wert dekrementiert?



  • Wenn nrl > 0 ist, dann kann doch nach der Zeile m -= nrl;
    der Zeiger m nur noch ins Nirvana zeigen.
    Das gleiche in grün gilt für die Zeile m[i] -= ncl;



  • So hatte ich das auch verstanden und bin deshalb verwirrt. Die Zeilen mit dem m -= nrl sind in vielen Beispielen zu Speicherreservierung von Matrizen im Internet zu finden (u.a. in Vorlesungskripten). Wozu? *absolut ratlos*



  • Vermutlich fehlen bei deinem Codeschnipsel noch ein paar Zeilen zwischen Zeile 7 und Zeile 9 und zwischen Zeile 20 und 23, in denen die Zeiger um die Werte nrl, ncl inkrementiert und anschließend wieder zurückgesetzt werden.
    Sonst sehe ich da keinen Sinn.



  • Nein, zwischen diesen Zeilen fehlt nichts. Zu Beginn der Funktion werden noch die Variablen int i,j und char **m deklariert und am Ende werden den Matrixfeldern noch Werte zugewiesen. Sonst passiert nichts in der Funktion.



  • Nagut. Also wenn du mich fragst, kann dieses Codeschnipsel nicht zuverlässig funktionieren.



  • Der Meinung bin ich auch. Vielen Dank für die Rückmeldung.



  • Kein Thema, NULL Problemo.


Anmelden zum Antworten