Zugriff auf die Adresse eines stuct Elements in einem Array



  • Also wenn ich das richtig verstehe bekomme ich mit &array[3] die Adresse vom 4 Element. Sollte dies ein einfacher Datentyp sein ok.
    Bei einem struct bekomme ich damit die Adresse des structs. Also den Begin des Speicherbereichs. Und mit .Startadresse soll ich dann die Adresse innerhalb der struckts bekommen ?


  • Mod

    Du hast irgendwie nicht die richtige C-Denkweise. Die Operatoren wirken stumpf auf ihre Argumente, es ist ihnen egal, wenn das Argument selber wieder ein anderer Ausdruck ist. Der Adressoperator gibt dir immer die Adresse von dem, worauf er angewandt wird, es gibt keine Sonderbehandlung von structs oder Structelementen.

    Der Geasamtausdruck &array[1234].startTime ist, wenn man die Operatorpriorität mittels Klammern hervor hebt, nicht anderes als

    &((array[1234]).startTime)
    

    oder noch expliziter ausgeschrieben:
    Adressoperator angewandt auf (Strukturelementzugriffsoperator mit Parameter startTime angewandt auf (Indexzugriffsoperator mit Parameter 1234 angewandt auf array ) )

    Das dachte ich auch, aber mein Processor reagiert mit einem Address Interrupt.

    Dann machst du einen Fehler. Damit meine ich nicht, dass du die Adresse falsch feststellst, sondern höchstwahrscheinlich machst du allgemein was falsch und dereferenzierst beispielsweise eine Adresse, die dir nicht gehört oder ähnliches. Ohne mehr Code kann man aber nichts genaues sagen.



  • OK.

    Ich war soweit mein Array als Pointer zu definieren um dann
    mittels &array[234]->startTime auf die Adresse zuzugreifen.

    Und siehe da auch ein Adress Zugrifsfehler. 😞

    ich habe mktime so oder so aufgerufen :

    mktime(&dayrunevent_p[i]->startTime);
    mktime(&dayrunevent[i].startTime);
    

    Also schein ein anderes Problem vorzuliegen, kann das noch am c syntax liegen oder ist das schon ein Problem mit meinem PIC24F.

    Ich will mktime nutzen, da ich auf startTime.tm_mday Tage aufaddiere.
    mktime soll laut Beschreibung die gesammte tm structur richten. Also wieder ein gültiges Datum herstellen.


  • Mod

    Die zweite Syntax ist die korrekte. Aber existiert das i'te Element?



  • Ja, die Schleife ist recht überschaubar, und die Obergrenze wird mit einem #define sowohl in der Deklaration array[MAX_PROGS] als auch in der for (i=0; i< MAX_PROGS; i++) Schleife verwendet.
    Im Augenblick so :

    #define MAX_PROGS 3
    
    typedef struct __attribute__((__packed__)){
    	BOOL Run;									
    	BOOL Aktiv;									
    	BOOL Write;									
    	struct tm startTime; 
    	time_s runTime;								
    	BYTE Valve;									
    } runevent_s;
    
    runevent_s *dayrunevent_p[MAX_PROGS];
    
    for (i=0; i < MAX_PROGS; i++) {    
        dayrunevent_p[i]->startTime = picTime; // picTime ist vom typ struct tm
        dayrunevent_p[i]->startTime.tm_mday = 5;
        mktime(&dayrunevent_p[i]->startTime);
        ......
    }
    

  • Mod

    Du hast gar keine runevent_s-Objekte, nur jede Menge Zeiger auf solche, die aber anscheinend auf nichts konkretes zeigen.

    Falls obige Aussage auf falschen Annahmen über die nicht gezeigten Teile des Codes beruhen sollten (vielleicht weist du den Zeigern ja irgendwo zwischendurch was zu?), dann poste das nächste Mal bitte ein compilierbares Minimal(!)beispiel.



  • Nur vergessen zu kopieren 😞

    runevent_s dayrunevent[MAX_PROGS];
    runevent_s *dayrunevent_p[MAX_PROGS];
    dayrunevent_p[0] = &dayrunevent[0];
    dayrunevent_p[1] = &dayrunevent[1];
    dayrunevent_p[2] = &dayrunevent[2];
    

    Wobei ich ja vorher ohne die Pointer Variante unterwegs war.
    Änder aber leider nichts.


  • Mod

    Dann erstell das erwähnte Minimalbeispiel. Das habe ich noch oben in meinen vorherigen Post reineditiert, vielleicht hast du es noch nicht gesehen.



  • Zurück auf Start : 😉

    #define MAX_PROGS 3 
    
    typedef struct __attribute__((__packed__)){ 
        BOOL Run;                                   
        BOOL Aktiv;                                 
        BOOL Write;                                 
        struct tm startTime; 
        time_s runTime;                             
        BYTE Valve;                                 
    } runevent_s; 
    
    runevent_s dayrunevent[MAX_PROGS]; 
    
    time_t rawtime;                     // hab ich jetzt schnell eingefügt
    time (&rawtime);                    //
    &picTime = localtime (&rawtime);    //
    
    for (i=0; i < MAX_PROGS; i++) {     
        dayrunevent_p[i].startTime = picTime; // picTime ist vom typ struct tm 
        dayrunevent_p[i].startTime.tm_mday = 5; 
        mktime(&dayrunevent_p[i].startTime); 
    }
    

  • Mod

    Compilierbares Minimalbeispiel! 🙄

    Wenn ich mir die Mühe mache, deinen Code compilierbar zu machen, dann funktioniert er auch:

    #define MAX_PROGS 3
    #include <time.h>
    #include <stdbool.h>
    
    typedef struct __attribute__((__packed__)){
        bool Run;                                  
        bool Aktiv;                                
        bool Write;                                
        struct tm startTime;
        time_t runTime;                            
        char Valve;                                
    } runevent_s;
    
    int main()
     {
      runevent_s dayrunevent[MAX_PROGS];
      time_t rawtime = time(NULL);
      struct tm picTime = *localtime (&rawtime);
    
      for (int i=0; i < MAX_PROGS; i++) {    
        dayrunevent[i].startTime = picTime; 
        dayrunevent[i].startTime.tm_mday = 5;
        mktime(&dayrunevent[i].startTime);
      }
     }
    

    http://ideone.com/4BeAj0

    So, wo sind nun die Unterschiede zu dem Code, der bei dir nicht funktioniert? Noch einmal mache ich mir nicht die Mühe einen unvollständigen Code zu ersetzen.

    PS:

    time_t rawtime;                     // hab ich jetzt schnell eingefügt
    time (&rawtime);                    //
    &picTime = localtime (&rawtime);    //
    

    Copy&Paste! Wenn du hier im Editor programmierst, baust du bloß lauter weitere Fehler ein, die wir dann finden, die gar nichts mit deinem Problem zu tun haben. So wie diesen Schwachsinn hier.



  • Sorry ich war nicht so schnell. Das kam vom hin und her editieren.
    Hier wäre mein Beispiel gewesen.

    #include <stdio.h>
    #include <time.h>
    
    #define MAX_PROGS 3
    
    typedef struct { 
        struct tm startTime; 
        int runTime;                             
    } runevent_s;
    
    int main() {
    
    struct tm picTime;
    runevent_s dayrunevent[MAX_PROGS]; 
    int i;
    
    time_t rawtime;                      
    time (&rawtime);                    
    picTime = *localtime (&rawtime);  
    
    for (i=0; i < MAX_PROGS; i++) {     
        dayrunevent[i].startTime = picTime; // picTime ist vom typ struct tm 
        dayrunevent[i].startTime.tm_mday = i; 
        mktime(&dayrunevent[i].startTime);
        printf("%s",asctime(&dayrunevent[i].startTime));
    }
    }
    

    Und Ja, geht auch bei mir. Habe es online laufen gelassen.
    Leider bin ich nun nicht weiter. Zumindest weiß ich jetzt das mktime() so funktionieren muß.


  • Mod

    Und dieses identische Programm läuft nicht auf deinem Pic24?

    ptrPicTime = &picTime;
    time_t rawtime;                      
    time (&rawtime);                    
    ptrPicTime = localtime (&rawtime);
    

    Dir ist schon klar, dass dieser gesamte Codeabschnitt total sinnlos ist und du picTime letztendlich uninitialisiert benutzt? mktime sollte zwar mit unitialisierten Werten zurecht kommen, aber vielleicht ist deine Implementierung nicht auf jeden Sonderfall ausgelegt.



  • Sharki schrieb:

    typedef struct __attribute__((__packed__)){ 
        BOOL Run;                                   
        BOOL Aktiv;                                 
        BOOL Write;                                 
        struct tm startTime; 
        time_s runTime;                             
        BYTE Valve;                                 
    } runevent_s;
    

    Ich tippe auf fehlerhaftes Alignment. Mit __attribute__((__packed__)) deaktivierst du das automatische Padding des Compilers. Wenn BOOL als 1-Byte-Type definiert ist, ergibt sich für startTime ein ungerader offset. Struct tm besteht aus int Werten. Der erste Zugriff auf einen Member (z.B. startTime.tm_mday = i; oder innerhalb von mktime) verursacht dann den Speicherfehler.



  • Hi ok das war es 🙂

    Ich bin nur nicht darauf eingegangen weil ich vorher schon jede Menge andere Datenstrukturen habe, die genauso aufgebaut sind, und ich dort auch auf alle Möglichen arten zugreife. Eine Umstellung im struct hat übrigens auch nichts gebracht ....

    Vielen Dank für die flotte Hilfe an alle.

    @SeppJ : Das was nur Pseudocode. picTime wird ordentlich via sntp gesetzt. Nur die Routine ist zwei Seiten groß, da blickt ja sonst keiner durch. Danke 🙂


  • Mod

    Sharki schrieb:

    @SeppJ : Das was nur Pseudocode. picTime wird ordentlich via sntp gesetzt. Nur die Routine ist zwei Seiten groß, da blickt ja sonst keiner durch. Danke 🙂

    Deswegen ist es wichtig, dass dein Minimalbeispiel nicht das darstellt, von dem du denkst, das es der Fehler ist, sondern das, was wirklich den Fehler erzeugt. Dein gezeigter Code hatte gar nichts mit dem Fehler zu tun. Du hättest beim Kürzen des Codes immer wieder testen müssen, ob der Fehler überhaupt noch auftritt, sonst ist das Minimalbeispiel nutzlos.


Anmelden zum Antworten