Zugriff auf die Adresse eines stuct Elements in einem Array
-
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.
-
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); }
-
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); } }
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ß.
-
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. WennBOOL
als 1-Byte-Type definiert ist, ergibt sich fürstartTime
ein ungerader offset. Structtm
besteht ausint
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
-
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.