Zeiger auf Zeiger



  • Probier mal das hier:

    #include "stdafx.h"
    
    #include <stdio.h> 
    #include <malloc.h> 
    #include <conio.h> 
    #include <stdlib.h> 
    
    int main(int argc, char* argv[]) 
    { 
      int *monat=(int*)malloc(sizeof(int)*13);
       int    tag, 
          monatsanzahl, 
          jahresanzahl, 
          tagesanzahl, 
          i, 
          Zahl, 
          leap, 
          Test; 
      int **Zeiger_auf_Monat, **Zeiger_auf_Jahr; 
    
      //Zahl1 = (int*)malloc(sizeof(int); 
      Zeiger_auf_Monat = (int**)malloc(sizeof(int*)); 
    
      //scanf("%d", Zahl1); 
      printf("Geben sie bitte das Jahr ein: \n"); 
      scanf("%d", &jahresanzahl); 
      printf("Geben sie den Monat bitte ein: \n"); 
      scanf("%d", &monatsanzahl); 
      printf("Geben sie bitte den Tag ein: \n"); 
      scanf("%d", &tagesanzahl); 
    
      leap = jahresanzahl%4 == 0 && jahresanzahl%100 != 0 || jahresanzahl%400 == 0; 
      if (leap == 1) 
      { 
    
    	monat[2] = 29; 
      } 
      else 
      { 
        monat[2] = 28; 
      } 
    	monat[1] = 31; 
        monat[2] = 29; 
        monat[3] = 31; 
        monat[4] = 30; 
        monat[5] = 31; 
        monat[6] = 30; 
        monat[7] = 31; 
        monat[8] = 31; 
        monat[9] = 30; 
        monat[10] = 31; 
        monat[11] = 30; 
        monat[12] = 31; 
        *Zeiger_auf_Monat = &monat[monatsanzahl]; 
    
    	tag=tagesanzahl;
    
    for (i = 1; i < monatsanzahl; i++)
    {
    	tagesanzahl+=monat[i];
    }
    
    getch();
    
      return 0; 
    }
    


  • Entspricht das deiner Zielsetzung?
    Ich möchte dich nocheinmal daran erinnern:
    Enn du ein Array hast, dann spricht man dieses von 0 (null) ab an.
    d.h. das erste Element ist element[0] und das letzte wäre darum element[n-1].
    In deinen Beispielen hast du immer mit Feld[1] begonnen und außerdem Feld[n] mit Werten versorgt.



  • #include "stdafx.h"

    Was soll des denn bitte sein ? Da gibt der Compiler bei mir einen Fehler aus !



  • // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    //

    Kannst Du auskommentieren.



  • Hab ich auch gleich nach der Fehlermeldung gemacht...

    Wenn ich das mache, funktioniert das Programm ohne Probleme. Ich muss nur noch ein paar Abfragestrukturen eingeben, damit man nicht den 13. Monat oder mehr oder den 45. Tag eingeben kann.
    Dies sollte aber kein Problem sein ! - Generell bin ich mir noch unsicher, wegen der fehlenden Einbindung von Zeiger-Zeiger. Wir benutzen bei dem Programm bisher nur den Zeiger, aber der Zeiger-Zeiger kommt noch nicht wirklich zum Zuge !



  • Wir benutzen bei dem Programm bisher nur den Zeiger, aber der Zeiger-Zeiger kommt noch nicht wirklich zum Zuge !

    Ich kann Dir auch sagen warum:
    Weil Du die hier gar nicht benötigst! Wenn Du mit Zeiger-Zeigern üben/arbeiten willst, würde ich Dir vorschlagen, dass Du ein wenig mit Strings herumprobierst. Da kann man prima mit solchen Adressierungsverfahren experimentieren.
    Aber hier an dieser Stelle sehe ich keinen Grund, so etwas zu machen.



  • Des muss ich mal nachher mit meinem Chef klären.... komisch, dass er es so geläöst haben will 🙄



  • Theoretisch kann man es nach folgendem Prinzip ja auch machen mit den Monaten:

    #include <stdio.h>
    #include <malloc.h>
    #include <conio.h>
    
    int main(int argc, char* argv[])
    {
      int *Hausnummer1 = (int*)malloc(sizeof(int));
      int **Strasse1 = (int**)malloc(sizeof(int*));
      int auswahl;
    
      Strasse1 = &Hausnummer1;
    
      printf("Es wohnen 3 Leute in der Hausnummer 1. Welche Person wollen sie namentlich gelistet haben ? 1,2 oder 3 ?\n");
      scanf("%d", &auswahl);
      if (auswahl == 1)
      {
        Hausnummer1 = "Stefan Thieme";
      }
      if (auswahl == 2)
      {
        Hausnummer1 = "Berta Thieme";
      }
      if (auswahl == 3)
      {
        Hausnummer1 = "Hans Thieme";
      }
      printf("In dieser Strasse wohnt %s\n", *Strasse1);
    
      getch();
      return 0;
    }
    


  • Ich hab das Programm nun etwas angepasst:

    #include <stdio.h>
    #include <malloc.h>
    #include <conio.h>
    
    int main(int argc, char* argv[])
    {
      int *Hausnummer1 = (int*)malloc(sizeof(int)*10);
      int **Strasse1 = (int**)malloc(sizeof(int*));
      int auswahl;
    
      Hausnummer1[1] = "PersonX1";
      Hausnummer1[2] = "PersonX2";
      Hausnummer1[3] = "PersonX3";
      Hausnummer1[4] = "PersonX4";
      Hausnummer1[5] = "PersonX5";
      Hausnummer1[6] = "PersonX6";
      Hausnummer1[7] = "PersonX7";
      Hausnummer1[8] = "PersonX8";
      Hausnummer1[9] = "PersonX9";
      Hausnummer1[10] = "PersonX10"; 
    
      printf("Es gibt 10 Bewohner im Haus Nr. 1. Welche Person möchten sie namentlich hier sehen ?\n");
      printf("Bitte geben sie eine Zahl zwischen 1 - 10 ein !\n");
      scanf("%d", &auswahl);
      if (auswahl > 0)
      {
        Strasse1[auswahl] = &Hausnummer1[auswahl];
      }
    
      printf("In dieser Strasse wohnt %s", *Strasse1[auswahl]);
    
      /* Freigabe des reservierten Speichers */
      free(Hausnummer1);
      free(Strasse1);
    
      getch();
      return 0;
    


  • int *Hausnummer1 = (int*)malloc(sizeof(int)*10);

    ...
    Hausnummer1[10] = "PersonX10";

    Das ist Falsch (siehe oben) !



  • jap es muss ein char sein.. hab ich eben gesehen, aber abgesehen davon muss ich ein neues Programm schreiben.

    Aufgabe:
    - Jemand sucht eine Wohnung. Dieser jemand kann angeben wieviele Zimmer er will und für jedes Zimmer Länge und Breite eingeben. Es gibt keine natürliche Begrenzung für die Anzahl der Zimmer.
    Ausgegeben werden soll die gesamte Quadratmeteranzahl. Realisierung mit Zeigern und Zeiger-Zeigern !



  • Also so... jetzt hab ich das neue Programm mal gemacht. Der Chef meinte, dass es mir hier klarer wird, warum ich Zeiger-Zeiger brauche.

    #include <stdio.h>
    #include <malloc.h>
    #include <conio.h>
    
    int main(int argc, char* argv[])
    {
      /* Variablen benennen */
      int **Zimmer, *Zimmerdaten;
      int eingabe, i, laenge, breite;
    
      printf("Wieviele Zimmer soll ihre neue Wohnung denn haben ?\n");
      scanf("%d", &eingabe);
      Zimmer = (int**)malloc(sizeof(int*)*eingabe);
      Zimmerdaten = (int*)malloc(sizeof(int));
      for(i = eingabe; i > 0; i--)
      {
        printf("Bitte geben sie die Laenge und Breite fuer das Zimmer ein: \n");
        printf("Bitte Laenge eingeben: ");
        scanf("%d", &laenge);
        printf("Bitte Breite eingeben: ");
        scanf("%d", &breite);
        Zimmerdaten[i] = laenge * breite;
      }
      *Zimmer = &Zimmerdaten[i];
      printf("Die einzelnen Zimmer sind so gross: \n");
    
      /* Hier werden die einzelnen Quadratmeter-Ergebnisse ausgegeben */
      for (i = eingabe; i > 0; i--)
      {
        printf("%d %s\n", Zimmerdaten[i], "Quadratmeter");
      }
      /* Die gesamte Quadratmeterzahl wird hier errechnet */
      for (i = eingabe; i > 0; i--)
      {
        Zimmerdaten[i-1] += Zimmerdaten[i];
        eingabe--;
        if (eingabe == 0)
        {
          printf("Die Gesamtfläche der Wohnung beträgt: ");
          printf("%d %s\n", Zimmerdaten[i], "Quadratmeter");
        }
      }
    
      /* Freigabe des reservierten Speichers */
      free(Zimmer);
      free(Zimmerdaten);
    
      getch();
      return 0;
    }
    

    Gibts Verbesserungsvorschläge ?∞



  • Ich hab nur noch ein Problem, denn wenn ich den Speicher freigeben will, dann gibts einen Speicheradressenfehler:

    /* Freigabe des reservierten Speichers */
      free(Zimmer);
      for (i = eingabe; i > 0; i--)
      {
        *Zimmerdaten = Zimmerdaten[i];
        free(Zimmerdaten);
      }
      getch();
      return 0;
    

    🙂



  • Ich hab den Fehler gefunden..... ich schreibe das Programm jetzt mal so um, dass ich den Zeiger-Zeiger benutzen muss, weil ich hab den Verdacht, dass es daran liegt:

    #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**)malloc(sizeof(int*)*3);
      int *piZimmerdaten = (int*)malloc(sizeof(int)*3);
      int Laenge, Breite, Flaeche;
    
      Laenge = 1;
      Breite = 2;
      Flaeche = Laenge * Breite;
    
      *piZimmerdaten = Laenge;
      *(piZimmerdaten+1) = Breite;
      *(piZimmerdaten+2) = Flaeche;
    
      printf("%d", *piZimmerdaten);
      getch();
    return 0;
    }
    


  • also ich soll die Lösung dynamisch machen und Zeiger-Zeiger verwenden...

    Hat jemand eine Idee, denn ich hab die statische Variante eben geschrieben aus der ich dann die dynamische bauen soll.

    #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 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]);
    
      getch();
    return 0;
    }
    

    Ich habe noch einen Zusatz eingebaut, in dem alle Zimmerflächen zusammenaddiert werden und dabei ist ein kleiner Fehler aufgetreten, denn alle Zimmerflächen nehmen dem Wert der letzten Zimmerfläche an, wodurch ein falscher Wert heraus kommt. Woran kann das liegen ?:

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

    Ich benutze das hier !


Anmelden zum Antworten