Zeiger auf Zeiger die Zweite



  • Ich hab ein kleines Programm geschrieben:

    #include <stdio.h>
    #include <malloc.h>
    #include <conio.h>
    
    /* Das Ziel ist es bei diesem Programm darauf zu kommen, wie man
    die einzelnen Wohnungen mit ihren Daten ansprechen kann */
    int main(int argc, char* argv[])
    {
      int **piZimmer;
      int *piZimmerdaten = (int*)malloc(sizeof(int)*3);
      int *piErgebnis = (int*)malloc(sizeof(int));
      int Laenge1, Breite1, Laenge2, Breite2, Laenge3, Breite3, Flaeche1, Flaeche2, Flaeche3, i, zimmeranzahl;
    
      printf("Wieviele Zimmer soll ihre Wohnung denn haben ?\n");
      scanf("%d", &zimmeranzahl);
    
      piZimmer = (int**)malloc(sizeof(int*)*zimmeranzahl);
    
      printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl-2,". Zimmer ein: \n");
      printf("Bitte Laenge eingeben: ");
      scanf("%d", &Laenge1);
      printf("Bitte Breite eingeben: ");
      scanf("%d", &Breite1);
      *(piZimmerdaten) = Laenge1;
      *(piZimmerdaten+1) = Breite1;
      Flaeche1 = Laenge1 * Breite1;
      *(piZimmerdaten+2) = Flaeche1;
    
      *piZimmer = piZimmerdaten;
      printf("%d%s%d%s%d\n", piZimmer[0][0], " x ", piZimmer[0][1], " = ", piZimmer[0][2]);
    
      printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl-1,". Zimmer ein: \n");
      printf("Bitte Laenge eingeben: ");
      scanf("%d", &Laenge2);
      printf("Bitte Breite eingeben: ");
      scanf("%d", &Breite2);
      *(piZimmerdaten) = Laenge2;
      *(piZimmerdaten+1) = Breite2;
      Flaeche2 = Laenge2 * Breite2;
      *(piZimmerdaten+2) = Flaeche2;
    
      *(piZimmer+1) = piZimmerdaten;
      printf("%d%s%d%s%d\n", piZimmer[1][0], " x ", piZimmer[1][1], " = ", piZimmer[1][2]);
    
      printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl,". Zimmer ein: \n");
      printf("Bitte Laenge eingeben: ");
      scanf("%d", &Laenge3);
      printf("Bitte Breite eingeben: ");
      scanf("%d", &Breite3);
      *(piZimmerdaten) = Laenge3;
      *(piZimmerdaten+1) = Breite3;
      Flaeche3 = Laenge3 * Breite3;
      *(piZimmerdaten+2) = Flaeche3;
    
      *(piZimmer+2) = piZimmerdaten;
      printf("%d%s%d%s%d\n", piZimmer[2][0], " x ", piZimmer[2][1], " = ", piZimmer[2][2]);
    
      printf("Die Wohnung ist insgesamt mit allen Zimmern: \n");
      *piErgebnis = piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2];
      printf("%d%d%d", piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2]);
      getch();
      return 0;
    }
    

    Dabei nehmen die piZimmer-Werte den Wert des letzten piZimmers immer an:

    printf("%d%d%d", piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2]);
    

    Woran könnte das denn liegen ?



  • cHillb3rT schrieb:

    printf("%d%d%d", piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2]);
    

    Willst du hier die einzelnen Werte ausgeben, dann musst du die Werte mit Komma trennen, nicht mit Plus.
    Willst du die Summe ausgeben, darf da nur ein %d im Formatstring stehen.



  • Das Problem bei diesen piZimmer-Werten ist, dass die Werte alle gleich sind, obwohl sie aufgrund der Eingabe unterschiedlich sein müsste.

    printf("%d", piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2]);
    

    Das Problem ist das gleiche auch wenn ich da nur ein %d setze !

    Meine Frage war halt woran dies liegen kann ?



  • Die Werte sind nicht gleich. Es sind dieselben, denn du hast nur drei Werte. Du holst doch nur Speicher für 3 int. Wie sollen da 9 Werte reinpassen?

    Deine drei Zeiger in piZimmer zeigen alle auf piZimmerdaten, und damit auf dieselben Speicherstellen.



  • also muss ich nun 9 ints reservieren, wenn ich für 3 Zimmer die Werte eingeben will. Zudem wie würdest du denn dann auf die anderen Speicherstellen verweisen, damit auch die anderen Werte ansprechen kann ?

    Dann müsste ich noch was verändern oder?:

    *(piZimmer+1) = piZimmerdaten;
    
    *piZimmer = piZimmerdaten;
    


  • Wenn es dir einfach nur darum geht, die Gesamtfläche zu ermitteln, brauchst du gar keine Zeiger.

    Ich habe - nicht nur aus diesem Thread - den Eindruck, dass deine Problemlösungsstragie hauptsächlich darin besteht, solange am Code herumzubasteln, bis etwas dabei herauskommt, was halbwegs funktioniert, oder was zumindest der Compiler akzeptiert. So kommst du IMHO nie auf einen grünen Zweig, denn der Lerneffekt ist praktisch gleich Null. Du musst verstehen, was der Code tut. Nimm Papier und Bleistift, und zeichne auf, was wohin zeigt. Dann solltest du in der Lage sein, das Problem selbst zu lösen.

    Ich könnte dir wieder eine fertige Lösung hinsetzen, aber dann kommt bald nur wieder die nächste Frage. Bis du nicht lernst, deine Codeprobleme durch Denken zu lösen, bist du ein bodenloses Loch für die Zeit derer, die dir helfen. Ab jetzt halte ich mich bei deinen Fragen zurück, bis ich erkenne, dass du nachdenkst, statt nur rumzuprobieren. Bitte nicht persönlich nehmen.



  • Nimm statt malloc.h stdlib.h, malloc/realloc/usw werden heute in stdlib.h definiert.


Anmelden zum Antworten