Addresse einer Variable innerhalb eines struct Arrays
-
Hallo Leute,
ich habe mal eine kurze Frage. Ich stehe vor dem Problem, dass ich eine Schleife habe, in der deine Variable eine struct Arrays verarbeitet wird. Ich weiß die Größe des Structs, hab aber leider nicht das struct selbst zur Verfügung. Nun versuche ich an die einzelnen Elemente des Arrays der Variable heranzukommen. Hier mal ein Beispiel wie ich das meine
typedef struct tagORATIMESTAMP_STRUCT { signed short DateYYYY; unsigned char DateMM; unsigned char hh; unsigned char mm; unsigned char ss; unsigned int fract; } ORATIMESTAMP_STRUCT, *PORATIMESTAMP_STRUCT; struct werte { int a; int b; ORATIMESTAMP_STRUCT timestamp; }wertearray[100], *pwertearray ... void werte_auslesen(void *data, int array_size, int skipparameter) { int i; for (i = 0; i != arraysize; i++) { PORATIMESTAMP_STRUCT pTst = (PORATIMESTAMP_STRUCT) data; // [...] Verarbeitung der ersten Timestamp werte // Hier müsste nun der Sprung zum nächsten PORATIMESTAMP_STRUCT erfolgen. pTst += 1; // Funktioniert leider nicht, da nur 12 Byte zum Pointer addiert werden (anstatt 22) } }
Habt ihr eine Idee wie ich in der Schleife zum nächsten Element komme?
Danke für eure Hilfe.
Gruß
Hoshek
-
Manchmal kann die Lösung doch so einfach sein...
Aber vielleicht gibt es noch etwas eleganteres?
Hier der Code:
typedef struct tagORATIMESTAMP_STRUCT { signed short DateYYYY; unsigned char DateMM; unsigned char hh; unsigned char mm; unsigned char ss; unsigned int fract; } ORATIMESTAMP_STRUCT, *PORATIMESTAMP_STRUCT; struct werte { int a; int b; ORATIMESTAMP_STRUCT timestamp; }wertearray[100], *pwertearray ... void werte_auslesen(void *data, int array_size, int skipparameter) { int i; for (i = 0; i != arraysize; i++) { PORATIMESTAMP_STRUCT pTst = (PORATIMESTAMP_STRUCT) data; // [...] Verarbeitung der timestamp werte // Verwendung des void Pointers anstatt des struct Pointers. // So kann sicher gestellt werden dass die Adresse richtig hoch gezählt wird. data += skipparameter; } }
-
Für was brauchst du denn das tagORATIMESTAMP_STRUCT?
Schau dir doch mal void** an.
-
Ich finde die Frage recht unklar, weil nicht deutlich ist, mit welchen Werten Deine werte_auslesen gefüllt wird.
Ist data* ein Zeiger auf ORATIMESTAMP_STRUCT, die folgend im Speicher sind, dann wäre richtig:
data += sizeof( ORATIMESTAMP_STRUCT );
Wenn data* ein struct werte * darstellt, dann solltest Du auch damit arbeiten:
void werte_auslesen(void *data, int array_size, int skipparameter) { int i; for (i = 0; i != arraysize; i++) { struct werte * pTst = (struct werte *) data; // [...] Verarbeitung der ersten Timestamp werte data += sizeof( struct werte ); } }
-
Totaler Unsinn. Man kann keinen void-Zeiger inkrementieren. Warum wohl?
Die Antwort auf diese Frage liefert auch die hier notwendige Antwort.void werte_auslesen(void *data, int array_size, int skipparameter) { int i; for (i = 0; i != arraysize; i++) { PORATIMESTAMP_STRUCT pTst = (PORATIMESTAMP_STRUCT) data; // [...] Verarbeitung der ersten Timestamp werte // Hier müsste nun der Sprung zum nächsten PORATIMESTAMP_STRUCT erfolgen. pTst += 1; // Funktioniert leider nicht, da nur 12 Byte zum Pointer addiert werden (anstatt 22) } }
Wieso funktioniert das nicht?
Prinzipiell funktioniert das sehr wohl, wenn auch das Beispiel totaler Unsinn ist und wohl eher gemeint war:void werte_auslesen(void *data, int array_size, int skipparameter) { int i; PORATIMESTAMP_STRUCT pTst = (PORATIMESTAMP_STRUCT) data; for (i = 0; i != arraysize; i++) { // [...] Verarbeitung der ersten Timestamp werte // Hier müsste nun der Sprung zum nächsten PORATIMESTAMP_STRUCT erfolgen. pTst += 1; // Funktioniert leider nicht, da nur 12 Byte zum Pointer addiert werden (anstatt 22) } }
-
@ Martiniclan
Der data Zeiger zeit auf ein ORATIMESTAMP_STRUCTdata += sizeof( ORATIMESTAMP_STRUCT );
Funktioniert leider nicht da bei Zeiger-Inkrementierung nicht die Byte-Anzahl zum Zeiger addiert werden kann, sondern nur die Anzahl der zu "übergehenden" Elemente. Intern wird dies dann in die zu addierenden Bytes umgewandelt.
Geht trotzdem nicht da der Pointer nach dem Addieren an der falschen Stelle landet. Das übergebene
*data
ist selbst kein Array sondern befindet sich in einem struct Array. Ein
pTst += 1;
würde demnach in den völlig falschen Speicher zeigen.
Seltsamer weise funktioniert die Inkrementierung. Alternativ könnte man auch einen char* Pointer nehmen da die Inkrementierung diese Pointers ihn genauso um 1 Byte pro Inkrement weiterverschieben würde.
void werte_auslesen(void *data, int array_size, int skipparameter) { int i; char *base = (char *) data; for (i = 0; i != arraysize; i++) { PORATIMESTAMP_STRUCT pTst = (PORATIMESTAMP_STRUCT) base; // [...] Verarbeitung des timestamps base+= skipparameter; } }