Zugriff auf die Adresse eines stuct Elements in einem Array


  • 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