PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pointer & 2xstruct



fred84b
16.09.2009, 12:54
Hallo Leute

Ich habe ein Problem mit pointers und structs. Ich hoffe ihr könnt mir helfen. Die trial and error Methode hat auf jedenfalls nichts gebracht.

Also hier mein Code

typedef struct {
uint8_t mode;
uint8_t msg[4][3];
} mkb_t;

typedef struct{
mkb_t mkb[NUMBER_OF_MKB];
uint8_t adc[NUMBER_OF_ADC][2];
} preset_t;


preset_t preset1 EEMEM = {...};
preset_t preset2 EEMEM = {...};
preset_t preset3 EEMEM = {...};


/*
* Save Preset Mode
*/
uint8_t savePresetMode(uint8_t presetN, uint8_t buttonN, uint8_t newmode)
{
preset_t *p;

switch (presetN)
{
case 1:
p = &preset1;
break;
case 2:
p = &preset2;
break;
case 3:
p = &preset3;
break;
default:
return RETURN_CODE_ERROR;
}

if (eeprom_is_ready())
eeprom_write_byte(p->mkb[buttonN]->mode,newmode);
else
return RETURN_CODE_ERROR;

return RETURN_CODE_OK;
}

Das Problem ist die Zeile:

eeprom_write_byte(p->mkb[buttonN]->mode,newmode);
Die Referenz auf mode liefert ein Compiler Fehler.

Irgendwie blicke ich noch nicht ganz durch, was pointers und structs angeht.

Gruss und danke schonmal
Frédéric

uwegw
16.09.2009, 13:22
So könnte es klappen:


typedef struct {
uint8_t * mode;
uint8_t msg[4][3];
} mkb_t;

typedef struct{
mkb_t * mkb[NUMBER_OF_MKB];
uint8_t adc[NUMBER_OF_ADC][2];
} preset_t;


Also in preset_t ein Array von Zeigern auf mkb_t, und außerdem mode ebenfalls als Zeiger (weil eeprom_write_byte einen uint8_t* als Paramtere will).

Kann gut sein, dass das komplett falsch ist, aber es kompiliert wenigstens...

sast
16.09.2009, 14:46
Um nicht aus allem einen Pointer machen zu müssen, was in einem struct steht kann man auch mit dem Punktoperator auf die einzelnen Elemente zugreifen
zB p->mkb[buttonN].mode
dann sollte das ganze mit
eeprom_write_byte((uint8_t*)(&(p->mkb[buttonN].mode)),newmode);
machbar sein

sast

fred84b
16.09.2009, 15:14
Danke für die Antworten.

Die zweite Lösung gefällt mir schon besser, weil ich die structs nicht umbedingt ändern will.

Den cast (uint8_t*) kann man aber schon weglassen, oder? Der &-Operator liefert ja schon eine Adresse.

sast
16.09.2009, 17:35
ja kannst du.

ich bin bloß gern etwas übervorsichtig und sage was ich will

sast