- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: pointer & 2xstruct

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Ort
    Liestal
    Alter
    40
    Beiträge
    17

    pointer & 2xstruct

    Anzeige

    Praxistest und DIY Projekte
    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
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    So könnte es klappen:
    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;
    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...

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    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

    雅思特史特芬
    开发及研究

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Ort
    Liestal
    Alter
    40
    Beiträge
    17
    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.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    ja kannst du.

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

    sast

    雅思特史特芬
    开发及研究

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus