Zeiger auf Array von Strukturen



  • Hallo alle zusammen,

    kann mir jemand sagen, was ich hier falsch mache?

    [code]
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Sensors {
            unsigned char cs;
            unsigned char channel;
    };
    
    struct Sensors * Gyros(void)
    {
            struct Sensors GyroX = {1, 2};
    
            struct Sensors GyroY = {3, 4};
    
            struct Sensors Gyros[2] = {GyroX, GyroY};
    
            struct Sensors *pGyros = Gyros;
    
            return pGyros;
    }
    
    int main(void)
    {
            struct Sensors * pGyros;
    
            pGyros = Gyros();
    
            unsigned char i;
            for (i=0; i<2; i++) {
                    printf("%d %d\n", pGyros->cs, pGyros->channel);
                    pGyros++;
            }
    
            return 0;
    }
    
    [/code]
    

    Als Ausgabe erhalte ich:

    1 2
    170 191

    Vielen Dank,

    Lisa



  • struct Sensors Gyros[2] is lokal und wird ungültig nach verlassen deiner funktion. der pointer den du zurückgibts zeigt also auf müll. wenn du es so machen willst muss dein Gyros[2] aufn heap -> malloc().



  • Vielen Dank für die schnelle Antwort, genau daran lag es!

    So geht es:

    [code]
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Sensors {
            unsigned char cs;
            unsigned char channel;
    };
    
    struct Sensors * Gyros(void)
    {
            struct Sensors GyroX = {1, 2};
            struct Sensors GyroY = {3, 4};
    
            struct Sensors *Gyros = (struct Sensors *) malloc( 2 * sizeof(struct Sensors) );
    
            Gyros[0] = GyroX;
            Gyros[1] = GyroY;
    
            return Gyros;
    }
    
    int main(void)
    {
            struct Sensors * pGyros;
    
            pGyros = Gyros();
    
            unsigned char i;
            for (i=0; i<2; i++) {
                    printf("%d %d\n", pGyros->cs, pGyros->channel);
                    pGyros++;
            }
    
            return 0;
    }
    [/code]
    




  • 🙂 Vielen Dank für den Hinweis, das ganze sieht jetzt so aus:

    [code]
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Sensors {
            unsigned char cs;
            unsigned char channel;
    };
    
    struct Sensors * Gyros(void)
    {
            struct Sensors GyroX = {1, 2};
            struct Sensors GyroY = {3, 4};
    
            struct Sensors *Gyros = malloc( 2 * sizeof(struct Sensors) );
    
            Gyros[0] = GyroX;
            Gyros[1] = GyroY;
    
            return Gyros;
    }
    
    int main(void)
    {
            struct Sensors * pGyros;
    
            pGyros = Gyros();
    
            unsigned char i;
            for (i=0; i<2; i++) {
                    printf("%d %d\n", pGyros->cs, pGyros->channel);
                    pGyros++;
            }
    
            return 0;
    }
    [/code]
    

    Leider scheint mein Mikrocontroller für den ich das Programm schreibe (AT91SAM9XE512), die Funktion malloc() nicht zu kennen. Ich habe die Strukturen jetzt global definiert und initialisiert.

    Gruß Lisa.


Anmelden zum Antworten