2017-10-27 6 views
0
error: incompatible types when initializing type 'REQ_ONE * {aka struct REQ_ONE *}' using type 'REQ_ONE {aka volatile struct REQ_ONE}' 
#define FIND_T(a, type) (*((volatile type *)a)) 

Ich möchte den Inhalt von REQ_ONE erhalten. Ursprünglich war ich mit nur:Fehler: Inkompatible Typen bei der Initialisierung Typ

REQ_ONE *reqReg = FIND(ADDRESS)

aber mein Code Analyzer beschwerte pointer to void not allowed. Daher möchte ich den Typ der Struktur umwandeln, um dies zu umgehen. Ich habe viele verschiedene Strukturen so dass ich nur ein Makro verwenden möchten:

REQ_ONE *reqReg = FIND_W(ADDRESS, REQ_ONE); 

und den Typ-Parameter übergeben ich Ehrerbietung wollen. Allerdings bekomme ich den obigen Kompilierungsfehler, bevor ich überhaupt sehe, ob mein Analyse-Tool zufrieden ist.

#define TEST_ADDR 0x00652000UL 
#define ADDRESS  0x00000500UL 

#define FIND(v) ((void *)TEST_ADDR + v)  
#define FIND_T(a, type) (*((volatile type *)a)) 
#define FIND_W(val, dataType) FIND_T(FIND(val), dataType) 

typedef struct testing_t { 
    union { 
    struct { 
     uint32_t avr_one : 4; 
     uint32_t avr_one : 4; 
     uint32_t avr_one : 4; 
     uint32_t avr_one : 2; 
     uint32_t bcr_one : 4; 
     uint32_t test_one : 4; 
     uint32_t reserved : 1; 
     uint32_t bcr_three : 2; 
     uint32_t reserved1 : 1; 
     uint32_t test_one : 3; 
     uint32_t avg : 2; 
     uint32_t reserved2 : 1; 
    }; 
    uint32_t VALUE32; 
    }; 
} REQ_ONE; 
+0

Erscheint Code zu fehlen, die tatsächlich etwas tut – Steve

+0

Im 'FIND_W' Erweiterung' 'dataType' sollte Baumuster zur sein. –

+0

@Steve Ithe Zeile des Codes, der etwas tut, ist in der Frage – homeGrown

Antwort

1

Ausbau dieser ergibt:

REQ_ONE *reqReg = (*((volatile REQ_ONE *)((void *)0x00652000UL + 0x00000500UL))) 

und es gibt eine * zu viele, so dass Sie dereferenzieren, was Sie zu zeigen und möchten, dass auf einen Zeigertyp Variablen zugewiesen werden. Der Fehler ist in:

#define FIND_T(a, type) (*((volatile type *)a)) // wrong 
#define FIND_T(a, type) (((volatile type *)a)) // no dereference 
+0

Great, dass die Kompilation geht Dank sehr, beschwert sich Analyzer noch über Zeiger auf die Leere nicht erlaubt. Ich dachte, das hätte diese Warnung umgangen. – homeGrown

+0

Das liegt möglicherweise daran, dass Sie einem void-Zeiger einen Wert hinzufügen, sodass der Compiler die Größe des Datentyps, auf den bei der Berechnung der Addition verwiesen wird, nicht kennt. Wäre es beispielsweise ein Zeiger auf int, dann würde 'sizeof (int) * 0x00000500UL' hinzugefügt werden. –

+0

So wie der Code derzeit ist kann ich diese Warnung nicht vermeiden? – homeGrown

Verwandte Themen