Sida 1 av 1

C Union mellan integer och pekare, wtf.

Postat: 6 november 2018, 22:14:19
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

Re: C Union mellan integer och pekare, wtf.

Postat: 6 november 2018, 22:24:13
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.

Re: C Union mellan integer och pekare, wtf.

Postat: 6 november 2018, 22:37:15
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

Re: C Union mellan integer och pekare, wtf.

Postat: 6 november 2018, 22:54:37
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.

Re: C Union mellan integer och pekare, wtf.

Postat: 6 november 2018, 22:57:00
av TomasL
Flyttade ut unionen och type-defade den och lade in den i structen.
därefter fick jag klammra tilldelningen.