C Union mellan integer och pekare, wtf.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46292
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

C Union mellan integer och pekare, wtf.

Inlägg av TomasL »

Hur fn_n gör man.
kompilator gcc (microchip mplab) PIC32
Hare en strukt som ser ut så här

Kod: Markera allt

typedef struct 
	{
		uint16 MB_reg_u16; // Externt publicerat modbusregister
		uint16 options_u16;	//optioner för källa, extern eller lokal mm
		union
		{
			uint32 source_idx_u32; //index till data i tillexempel global.data för fjärråtkomst från slav
			uint16 *source_ptr; 	//pekare till lokala data
		};
	} MB_reg_access_struct;
fyller på med lite testdata

Kod: Markera allt

const MB_reg_access_struct MB_reg_access_st[NUM_F_PMF_ADR] =
{
	{101, 	0,	{&global_data.MSTstatus_u16}},
	{102, 	0,	{(uint16*)&global_data.Sensors.Sens_arr_s16[MST_VB_IN] }},
	{100,	0,{ 100}},//((void*)&global_data.SLVstatus_u16) - ( (void*) &global_data)  /2},
	{103,	0, {100}},//((void*)&global_data.Evap_temp_s16) - ( (void*) &global_data)  /2},
};
och får felet på de två första raderna, dvs {101.....:

Kod: Markera allt

..\COMMON\f_omf.c:47:2: warning: initialization makes integer from pointer without a cast
..\COMMON\f_omf.c:48:2: warning: initialization makes integer from pointer without a cast
Findecanor
Inlägg: 1011
Blev medlem: 2 juli 2010, 23:04:07

Re: C Union mellan integer och pekare, wtf.

Inlägg av Findecanor »

Ja, du kan initialisera bara första elementet i en union på det sättet.

Använd istället punkt-notation för "designated initialisers":

Kod: Markera allt

const MB_reg_access_struct MB_reg_access_st[NUM_F_PMF_ADR] =
{
   {101,    0,   .source_ptr = &global_data.MSTstatus_u16 },
   {102,    0,   .source_ptr = (uint16*)&global_data.Sensors.Sens_arr_s16[MST_VB_IN] },
   {100,   0,   .source_idx_u32 = 100},
   {103,   0,   .source_idx_u32 = 100}
};
Redigerat: "Designated initialisers" kom med ISO C99.
Eftersom du använder GCC så borde det stödjas tycker jag.. men jag stötte själv på en kompilator som inte gjorde det för bara ett par år sedan.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46292
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C Union mellan integer och pekare, wtf.

Inlägg av TomasL »

funkar inte, får felet

Kod: Markera allt

..\COMMON\f_omf.c:48:2: error: unknown field 'source_ptr' specified in initializer
..\COMMON\f_omf.c:48:2: warning: missing braces around initializer
Findecanor
Inlägg: 1011
Blev medlem: 2 juli 2010, 23:04:07

Re: C Union mellan integer och pekare, wtf.

Inlägg av Findecanor »

Ah. Då måste du köra med en äldre kompilator... eller så kanske du har en kommandorads-parameter till kompilatorn som väljer äldre C-standard.
Jag hade provat koden ovan med en rätt färsk GCC för Intel och kommandorads-parametrar "-std=C99 -pedantic" och fick visserligen varningar för att unionen är anonym (ISO C först i C11 med har stödjts av GCC många år innan dess), men det fungerade.

Du skulle kunna byta plats på elementen i unionen så att pekaren kommer först och sen i varje initialiser cast'a int-värdet till pekare ( :shock: ).
Det borde funka men är fult.
Senast redigerad av Findecanor 6 november 2018, 22:57:04, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46292
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C Union mellan integer och pekare, wtf.

Inlägg av TomasL »

Flyttade ut unionen och type-defade den och lade in den i structen.
därefter fick jag klammra tilldelningen.
Skriv svar