Zeiger auf Zeiger



  • Ja, nAnz steht für die Monate (i.d.R. 12). Damit hast Du 12 int-Pointer allokiert. Diese beinhalten die Adresse für erneute int-Arrays. Diese haben, abhängig vom Monat, unterschiedliche größen.

    In deinem Beispiel oben hast Du das ja schon mal so gemacht - halt nur mit einem Monat. Was Du machen musst ist, jetzt jeden weiteren Zeiger-Zeiger ein anderes int-Array zuzuweisen.



  • Geht das nur so mit den Array.... ich bin nur verwirrt, weil mein Chef gemeint hat, dass er die Aufgabe nur mit Zeiger auf Zeiger gemacht haben will.

    Vielleicht ist daher der Ansatz mit den Arrays nicht entsprechend seinen Vorstellungen 😕



  • Hier mal ein kleines Beispiel.
    Die Monate haben jetzt allerdings nur 30 Tage und ich habe auch keine NULL- Abfrage. Aber so in etwa könnte das ganze realisiert werden

    int main(int argc, char* argv[]) 
    {   
      int** monat;
      int *tage;
    
      monat=(int**)malloc(sizeof(int*)*12);
      for(int i=0;i<12;i++)
      {
    	monat[i]= (int*)malloc(sizeof(int)*30);
      }
    	//damit waere der 4. Tag im 2. Monat
    	//monat[1][3]=wert;
    
      //bzw.  wenn man auf die Array-Adresse einen extra-Pointer legen will:
    	//	tage = *(monat+1);  -> zweiter monat
    	//	tage[3] = Wert;		-> 4.Tag
    
      for(i=0;i<12;i++)
      {
    	free(monat[i]);
    	monat[i]=NULL;
      }
    
      free(monat);
    
      getch(); 
      return 0; 
    }
    


  • Ich arbeite derzeit an einer anderen Variante und muss noch schauen, was ich da genau ausgeben will.

    #include <stdio.h>
    #include <alloc.h>
    #include <conio.h>
    #include <mem.h>
    
    int main(int argc, char* argv[])
    {
      int Monat,
          Jahr,
          Tag,
          index;
      int* nMonat;
      int nAnz = 12;
      int** Zeiger_auf_Zahl1 =(int**)malloc(sizeof(int*)*nAnz);
    
      /* / Nullung des Speicherbereichs /
      memset(nAnz, 0, (sizeof(nAnz)));
      memset(Zeiger_auf_Zahl1, 0, (sizeof(Zeiger_auf_Zahl1))); */
    
      Zeiger_auf_Zahl1[0] = 0;
      Zeiger_auf_Zahl1[1] = 31;
      Zeiger_auf_Zahl1[2] = 29;
      Zeiger_auf_Zahl1[3] = 31;
      Zeiger_auf_Zahl1[4] = 30;
      Zeiger_auf_Zahl1[5] = 31;
      Zeiger_auf_Zahl1[6] = 30;
      Zeiger_auf_Zahl1[7] = 31;
      Zeiger_auf_Zahl1[8] = 31;
      Zeiger_auf_Zahl1[9] = 30;
      Zeiger_auf_Zahl1[10] = 31;
      Zeiger_auf_Zahl1[11] = 30;
      Zeiger_auf_Zahl1[12] = 31;
    
      printf("Bitte geben sie das Jahr ein: \n");
      scanf("%d", &Jahr);
      printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &Monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &Tag);
    
      *Zeiger_auf_Zahl1 = (int*)malloc(sizeof(int));
        printf("Zahl ausgeben %d", Zeiger_auf_Zahl1[Monat]);
    
      getch();
      return 0;
    

    Was ist daran auszusetzen bis auf die Ausgabe ? Die stimmt meines Erachtens auch noch nicht !



  • Was ich da sehe, ist schon im Ansatz falsch. Ich möchte da nur darauf hinweisen, dass du in einem Array von 12 Feldern, 13 Werte hineinschreiben willst, für die nocht nicht mal Speicher reserviert wurde!
    Außerdem nützt es nichts, die Felder des Pointer-Arrays einfach mit Integer-Zahlen zu füllen.
    Ich würde vorschlagen, du probierst mal das, was ich Dir geschrieben habe oder probierst Deine Variante, nachdem Du dich über Felder bzw. Pointer informiert hast. OK?



  • okay dann mach ich es mal so 😉

    Ich habe jetzt dein Prinzip mal verstanden, wie du an das Programm herangegangen bist !
    Aber wenn ich noch Jahre hinzufüge, dann hab ich ja eine unbestimmte Mange an Jahren, die in Frage kommt und die in den Berechnungsprozess einfließen. Wie wird dann der Allokierungsbefehl für die Jahre sein ?

    Ich hab die Eingabe erstmal so gemacht:

    printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &tage);
    

    Nun müsste ich ja entsprechend deines vorherigen Codes auch ganz einfach den Monat und die Tage mit Variablen anwählen können:

    Anzahlmonate = monat;
      Anzahltage = tage;
      monat[Anzahlmonate][Anzahltage];
    

    Bihser geht das auch, aber danach wirds etwas schwieriger !



  • Aber wenn ich noch Jahre hinzufüge, dann hab ich ja eine unbestimmte Mange an Jahren, die in Frage kommt und die in den Berechnungsprozess einfließen

    Die Erweiterung auf Jahre stellt kein großes Problem dar:
    Du kannst dafür dein Zeiger-Array in ein neues Array packen. Sozusagen auf ein ***jahr;

    die Allokierung wäre dann

    int ***jahr=(int***)malloc(sizeof(int**)*nAnzJahre);
    

    Die Adressen da drin sind die Adressen von den Zeiger-Arrays



  • Bisher hab ich die "Zeiger-auf-Zeiger-Sache" hier noch nicht im Programm integriert:

    int ***jahr;
      int **monat;
      int *tage;
      int i, Wert, wert, Anzahlmonate, Anzahltage, monate, index;
    
      monat=(int**)malloc(sizeof(int*)*12);
    
      for(i=0; i<12; i++)
      {
        monat[i]= (int*)malloc(sizeof(int)*30);
      }
      tage = (int*)malloc(sizeof(int));
      printf("Bitte geben sie das Jahr ein: \n");
      scanf("%d", &jahr);
      printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &tage);
        // damit waere der 4. Tag im 2. Monat
      Anzahlmonate = monat;
      Anzahltage = tage;
      for (index = 0; index <= Anzahlmonate; index++);
      {
        printf("MONATE %d\n", Anzahlmonate);
        printf("TAGE %d\n", Anzahltage);
      }
    getch();
      for (i = 0; i > 12; i++)
      {
        free(monat[i]);
      }
      return 0;
    


  • Was hast Du eigentlich genau vor?



  • Es soll der Tag im Jahr bestimmt werden... also ich geb Datum an und er sagt mir dann zum Beispiel, dass es der 90. Tag im Jahr ist.



  • Soll das etwa heisen, dass du hinter jeden Integer-Wert den Tag des Jahres legen willst?

    Da würde ich mir aber lieber eine sinnvolle Berechnung einfallen lassen...



  • Ne man berechnet erstmal, ob es ein normales Jahr oder ein Schaltjahr ist und dnan rechnet man wenn man die Anzahl der Monate eingegeben hat, die Tage im Jahr zusammen.

    Die zusammengerechneten Tage im Jahr ergeben dann den Wert für den Jahrestag !



  • Und für was benötigst du dann 'Zeiger-Zeiger'?

    Ich verstehe den Zusammenhang mit der Aufgabenstellung nicht!



  • also mein Chef hat gesagt, dass man diese Aufgabe auch mit Zeiger auf Zeiger programmieren kann und er wollte sehen, wie ich das löse.

    Zum Zusammenhang kann man sagen, dass die Zeiger-Zeiger als zusätzliches Element der Auswahl fürs Schaltjahr gesehen werden sollten.

    Zeiger-Zeiger1 -> Zeiger -> Werte von den Monatstagen im normalen Jahr

    Zeiger-Zeiger2 -> Zeiger -> Werte von den Monatstagen im Schaltjahr



  • #include <stdio.h>
    #include <alloc.h>
    #include <conio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
      int *monat[12],
          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)
      {
        Test = 1;
        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];
      }
      else
      {
        Test = 0;
        monat[1] = 31;
        monat[2] = 28;
        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];
      }
      /* Abfragen für falsche Eingaben - Dient zur Absicherung gegen
      den DAU*/
      if (Test == 1 && monatsanzahl == 2 && tagesanzahl > 29)
      {
      printf("Der Februar hat niemals so viele Tage!\n");
      getch();
      exit(1);
      }
      if (Test == 0 && monatsanzahl == 2 && tagesanzahl > 28)
      {
        printf("Der Februar hat in den normalen Jahren nicht mehr als 28 Tage! \n");
        getch();
        exit(1);
      }
      if (monatsanzahl == 4 && tagesanzahl > 30 || monatsanzahl == 6 && tagesanzahl > 30 || monatsanzahl == 9 && tagesanzahl > 30 || monatsanzahl == 11 && tagesanzahl > 30)
      {
        printf("Der Monat hat niemals so viele Tage in einem Jahr !\n");
        getch();
        exit(1);
      }
      if (monatsanzahl == 1 && tagesanzahl > 31 || monatsanzahl == 3 && tagesanzahl > 31 || monatsanzahl == 5 && tagesanzahl > 31 || monatsanzahl == 7 && tagesanzahl > 31 || monatsanzahl == 8 && tagesanzahl > 31 || monatsanzahl == 10 && tagesanzahl > 31 || monatsanzahl == 12 && tagesanzahl > 31)
      {
        printf("Es gibt keinen Monat mit so vielen Tagen !\n");
        getch();
        exit(1);
      }
    
      /* Hier wird der Tag im Jahr bestimmt. Man zählt die Monatstage zusammen
      und ermittelt somit die Gesamtsumme des Betrages. Bisher besteht noch
      ein Problem mit der Berechnung im Januar und Februar, die anderen Tage nach
      Februar können richtig berechnet werden. */
      for (i = monatsanzahl; i == monatsanzahl; i--)
      {
      if (monatsanzahl == 1)
      {
        Zahl = tagesanzahl;
        tag += Zahl;
        monatsanzahl--;
      }
      if (monatsanzahl == 0)
      {
        printf("Es ist der wievielte Tag in ihrem angegebenen Jahr: %d", tag-1);
        getch();
        exit(1);
      }
        Zahl = monat[monatsanzahl];
        tag += Zahl;
        monatsanzahl--;
      }
      getch();
      return 0;
    }
    

    Ich hab erstmal unabhängig von allem, was ich vorher gesagt habe ein Programm geschrieben.
    Er rechnet ja schön die Tage im Jahr aus (Beispiel: 1.1.2004 = 1. Tag im Jahr), aber wenn ich einen Tag im Januar oder Februar ausgerechnet haben will, dann bekomme ich immer falsche Werte zurück... seht ihr vielleicht woran es liegen kann ?



  • 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 !


Anmelden zum Antworten