Probleme mit Struct

OP #2704152
Hallo, ich habe folgenden Code:
1
unsigned char Print1[15];
2
unsigned char Print2[15];
3

4
unsigned char PrintOut[5] = {0x01,0x02,0x03,0x04,0x05};
5

6

7
struct sttest
8
{
9
  unsigned char sttest_array[5];
10
};
11

12
struct test1
13
{
14
  struct sttest test1_array1;
15
  struct sttest test1_array2;
16
};
17

18
struct test2
19
{
20
  uint8_t test1_array1[5];
21
  uint8_t test1_array2[5];
22
};
23

24

25

26
#define Pointer1   ((struct test1 *)&Print1[0])
27
#define Pointer2   ((struct test2 *)&Print2[0])
28

29
void main(void)
30
{
31
  
32
  SystemInit();
33

34
  Pointer1->test1_array1.sttest_array[0] = PrintOut[0];
35
  Pointer1->test1_array1.sttest_array[1] = PrintOut[1];
36
  Pointer1->test1_array1.sttest_array[2] = PrintOut[2];
37
  Pointer1->test1_array1.sttest_array[3] = PrintOut[3];
38
  Pointer1->test1_array1.sttest_array[4] = PrintOut[4];
39

40
  Pointer1->test1_array2.sttest_array[0] = PrintOut[0];
41
  Pointer1->test1_array2.sttest_array[1] = PrintOut[1];
42
  Pointer1->test1_array2.sttest_array[2] = PrintOut[2];
43
  Pointer1->test1_array2.sttest_array[3] = PrintOut[3];
44
  Pointer1->test1_array2.sttest_array[4] = PrintOut[4];
45

46
  Pointer2->test1_array1[0] = PrintOut[0];
47
  Pointer2->test1_array1[1] = PrintOut[1];
48
  Pointer2->test1_array1[2] = PrintOut[2];
49
  Pointer2->test1_array1[3] = PrintOut[3];
50
  Pointer2->test1_array1[4] = PrintOut[4];
51

52
  Pointer2->test1_array2[0] = PrintOut[0];
53
  Pointer2->test1_array2[1] = PrintOut[1];
54
  Pointer2->test1_array2[2] = PrintOut[2];
55
  Pointer2->test1_array2[3] = PrintOut[3];
56
  Pointer2->test1_array2[4] = PrintOut[4];
57

58
  while(1);
59
}
Nach meinem Verständnis von sollte danach in Print1 und Print2 das 
gleiche drin stehen.
Aber jedoch bei den verschachteten Structs, beginnt er das zweite Array 
erst bei der Adresse 0x08 einzutragen, weiß einer wieso das so ist?

Verwende den GNU Compiler.

Vielen Dank
Steffen Gerner schrieb:

> Aber jedoch bei den verschachteten Structs, beginnt er das zweite Array
> erst bei der Adresse 0x08 einzutragen, weiß einer wieso das so ist?
>
> Verwende den GNU Compiler.

Auf welcher Platform?

Sieht so aus, als ob dein Compiler da mit Padding Bytes aufgefüllt hat 
um für die Strukturen eine durch 8 dividierbare Adresse zu erhalten.
Steffen Gerner schrieb:
> Arbeite mit dem Corssworks 2.2 für ARM.
>
> Mich wirft das ganze ein bisschen aus der Bahn, weil ich eigentlich
> nicht jedes struct nochmal schreiben wollte :(

Die Frage ist eher: Warum castest du da ein Array in Structs um. Das 
sind Operationen, die man eventuell ganz tief unten in einer Software 
machen kann, wo man irgendwelche über Schnittstellen hereinlaufende 
Daten in Structs zergliedert, aber ansonsten sind derartige Operationen 
meistens keine gute Idee. Immer wenn du etwas umcasten musst, solltest 
du dich sofort fragen, ob es da nicht eine bessere Möglichkeit gibt.


(Im Notfall kann man den meisten Compilern auch die Anweisung geben, 
keine Padding bytes einzufügen. Meistens ist das ein #pragma. "#pragma 
pack" oder so ähnlich. Wie das beim gcc ist, weiß ich nicht. Denn wie 
gesagt: Ich würde erst mal sehen, ob diese Array->Pointer Casterei nicht 
eigentlich schon eine ganz üble Operation ist)
OP
Das problem ist, das ich gerade mit dem uIP TCP/IP stack von Adam 
Dunkels arbeite und der das sehr oft leider macht.

Ich dachte eigentlich eher, das ich das einfach so verwenden kann, aber 
dann werde ich wohl eher mir das ganze doch ein bisschen selber 
zusammenbauen :(

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.