Zeiger aus Struct in Struct



  • Hallo bin noch recht neu in der c Programmierung. Soll für ein Schulprojekt ein klienes Programm schreiben dabei sollen verschiedene Datensätze abgelegt werden. Habe mir zu jedem Datensatz eine passendes struct erstellt.Nun möchte mein Lehrer das ich einen struct erstelle der nur aus Zeigern auf die einzelnen structs besteht. Habe mir dazu jetzt schon einiges durchgelesen was ich aber nicht so ganz verstehe.kann mir das jemand an einem kleinen Beispiel erklären?
    Besten Dank schon mal.



  • // die hast du schon:
    struct gibts_schon { int i; };
    struct gibts_auch_schon { long l; };
    
    // diese brauchst du noch:
    struct fehlt_noch {
        struct gibts_schon *eins;
        struct gibts_auch_schon *zwei;
    };
    

    Alles klar?
    🙂



  • Ok das habe ich hinbekommen nun noch eine Frage.Ich lege Messwerte in einem array ab.Möchte nun mit Hilfe des selben structs auf die Messwerte zugreifen. Dazu habe ich einen Zeiger auf das array geht das so wie ich es mit gedacht habe?

    struct Daten_1{ int i; };
    struct Daten_2{ long l; };
    
    struct Daten {
        struct Daten_1 *eins;
        struct Daten_2 *zwei;
        int *pMesswerte;
    }; 
    
    interrupt void Messwerte(void)
    {
        int ADCWert[8]; //soll Lokal sein	
       Daten.pMesswerte = ADCWert;
       //Funktion zum füllen des arrays
    }
    
    Main
    {
      //so hier möchte ich auf einzelne Messwerte zugreifen
      if(Daten.pMesswerte[2] >= 30)
      {
         Errror
      }
    


  • Ich fürchte, das wird so nichts. ADCWert ist lokal in Messwerte(). Deshalb geht die Herrschaft über den Speicherbereich dieses Arrays verloren, sobald die Funktion return't, also darf man in main() nicht mehr erwarten, dass dort noch alles am Platz ist.

    Es könnte helfen, das Array ADCWert static zu machen, wenn es zu jedem Zeitpunkt nur eines davon gibt. Falls es mehrere davon geben soll, solltest du für jedes einzelne dynamisch Speicher anfordern.
    🙂



  • Beispiel mit statischem Array:

    #include <stdio.h>
    
    struct daten {
       int *werte;
    };
    
    void setze_werte(struct daten *p)
    {
       static int array[3] = {42, 43, 44};
       p->werte = array;
    }
    
    int main(void)
    {
       struct daten d;
       setze_werte(&d);
    
       /* jetzt zeigt der werte-Zeiger auf das statische Array: */
       for (int i = 0; i < 3; i++)
          printf("d.werte[%d] = %d\n", i, d.werte[i]);
    }
    

    Beispiel mit dynamisch angefordertem Speicher:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct daten {
       int *werte;
    };
    
    void setze_werte(struct daten *p)
    {
       p->werte = malloc(3);
       p->werte[0] = 42;
       p->werte[1] = 43;
       p->werte[2] = 44;
    }
    
    int main(void)
    {
       struct daten d;
       setze_werte(&d);
    
       /* jetzt zeigt d.werte auf den Speicher von malloc(): */
       for (int i = 0; i < 3; i++)
          printf("d.werte[%d] = %d\n", i, d.werte[i]);
    
       free(d.werte);
    }
    

    Ist dir der Unterschied klar?
    🙂


Anmelden zum Antworten