mahlzeit, ich habe ein Problem beim Verständis eines Fehlers. ich habe folgende sachen:
1 | typedef struct |
2 | {
|
3 | uint8 messageType; |
4 | uint8 messageSubType; |
5 | uint16 messagesize; |
6 | } message __attribute__((aligned(4))); |
7 | |
8 | typedef struct |
9 | {
|
10 | uint8 ecuNumber; |
11 | uint16 aliveTime; |
12 | uint16 sizeReqponseTable; |
13 | uint16 sizeRequestTable; |
14 | uint32 *requestTable; |
15 | uint32 *responseTable; |
16 | uint16 sizeReqponseTable; |
17 | uint16 sizeRequestTable; |
18 | } commInit; |
19 | |
20 | |
21 | static void function() |
22 | {
|
23 | ..
|
24 | message *msg_p |
25 | |
26 | msg_p = (message *) getData(msg); |
27 | |
28 | commInit *init_p = (commInit*)&msp_p[1]; |
1 | static uint32 responseTable_au32[200]; |
2 | static uint32 requestTable_au32[200]; |
3 | |
4 | static void init() |
5 | {
|
6 | ...
|
7 | commInit init; |
8 | ...
|
9 | init.responseTable = responseTable_au32; |
10 | init.requestTable = requestTable_au32; |
11 | ...
|
Der Fehler tritt bei commInit *init_p = (commInit*)&msp_p[1]; auf. bei der Initialisierung init.responseTable = responseTable_au32; init.requestTable = requestTable_au32; seht in init.responseTable und init.requestTable die adresse von responseTable_au32 und requestTable_au32 (32 bit-Adressen). was genau steht in &msp_p[1] ? msp_p ist doch nur ein pointer auf eine Struktur. aber was genau bewirkt [1] ? Das Problem bei commInit *init_p = (commInit*)&msp_p[1]; ist, dass danach in init_p->responseTable_au32 und in init_p->requestTable_au32 eine andere Adresse steht. Es die Adresse wie responseTable_au32 und requestTable_au32 aber als 64 bit-Adresse (mit 0 aufgefüllt) Beispiel Adresse von responseTable_au32 is 0x23232323 Bei der Initialisierung steht in init.responseTable ebenfalls 0x23232323 in init_p-responseTable steht jetzt allerdings 0x2323232300000000 Wenn ich jetzt darein schreiben möchte, kracht es natürlich. Der Code kommt von einem 32-bit system. Jetzt bauen wir aber in einem 64-bit system. kann es daran liegen? Dann hätte ich aber gedacht, dass responseTable_au32 ebenfalls schon eine 64 Bit-Adresse hat. Wie kann ich das Problem fixen? Am Code selber dürfen wir leider nichts ändern (es sei denn es muss, so wie in diesem Fall)