Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C] (const) struct (const) *ptr, alleen inhoud wijzigen

Pagina: 1
Acties:

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:57

Matis

Rubber Rocket

Topicstarter
Beste PRGers,

Momenteel zit ik met een uitdaging. Ik heb een struct gedefineerd:
C:
1
2
3
4
5
6
7
typedef struct t_gpio_led
{
    char* base_name;
    uint32_t flags;
    uint32_t colors;
    uint32_t pc;
} gpio_led;

Deze wordt natuurlijk ook gebruikt
C:
1
2
#define MAX_NUM_GPIO_LEDS        0x20
static gpio_led leds[MAX_NUM_GPIO_LEDS];

Nu itereer ik in een loopje over de array heen:
C:
1
2
3
4
5
6
7
8
9
10
11
    int idx;
    for (idx = 0; idx < num_active_leds; idx++)
    {
        gpio_led *led = &(leds[idx]);
        const gpio_led *led = &(leds[idx]);
        gpio_led const *led = &(leds[idx]);
        const gpio_led const *led = &(leds[idx]);
        ....
        /* Op onderstaande regel gaat het 3 uit 4 keer fout */
        led->flags |= GPIO_LED_FLG_PROCESSED;
    }

Een van de vier assignments van de variabele led hierboven moet doen wat ik wil. Namelijk:

De pointer mag niet reassigned worden, maar de inhoud van de struct (pointer) mag wel gewijzigd worden.
Ik heb ze alle vier geprobeerd, maar ik krijg (met uitzondering van de bovenste) de volgende foutmelding van gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
gpio_leds.c:250: error: assignment of read-only location ‘*led’
Ik kwam op mijn zoektocht naar deze foutmelding de volgende post tegen, maar de uitleg daar lijkt niet te stroken met de resultaten uit mijn compiler.
Ik had namelijk verwacht dat derde assignment doet wat ik zou willen.
char* const the_string : I cannot change the char to which the_string points, but I can modify the char at which it points
Wie kan me verder helpen?

Matis

[ Voor 8% gewijzigd door Matis op 14-08-2013 11:30 ]

If money talks then I'm a mime
If time is money then I'm out of time


  • Caballeros
  • Registratie: November 2008
  • Niet online
deze?

gpio_led* const led = &(leds[idx]);

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
C:
1
type* const varName = someTypePointer;

lijkt me

http://www.learncpp.com/cpp-tutorial/610-pointers-and-const/

edit:
What ^ he says ;)

[ Voor 60% gewijzigd door Woy op 14-08-2013 11:49 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

Van rechts naar links lezen :)

code:
1
2
3
4
5
const foo  *  const ptr;
^^^^^^^^^  ^  ^^^^^^^^^
    |      |      \------ de variabele 'ptr' is zelf const
    |      \------------- 'ptr' is een pointer
    \-------------------- 'ptr' wijst naar een 'const foo'

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:57

Matis

Rubber Rocket

Topicstarter
Ah thanks, ik had de * dus verkeerd staan. Dat moet tegen de type definitie staan en niet tegen de variabelenaam :P

If money talks then I'm a mime
If time is money then I'm out of time


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-11 13:12
Dat maakt geen reet uit

[ehm]
Als je er geen const tussen hebt staan natuurlijk, anders zou ik toch echt zeggen dat de const verkeerd staat :P

[ Voor 72% gewijzigd door farlane op 14-08-2013 14:50 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ter aanvulling, er is overigens geen verschil tussen const foo en foo const. Iedereen is gewend om const ervoor te schrijven, maar het is eigenlijk consistenter om het erachter te schrijven. Dat maakt het in geval van typedefs ook iets duidelijker

C++:
1
2
3
4
typedef int * intptr;

intptr const a;   // a is een const ptr naar non-const int
const intptr a;   // a is nog steeds een const ptr naar non-const int

[ Voor 3% gewijzigd door .oisyn op 16-08-2013 22:51 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik heb het eerlijk gezegd nog nooit gebruikt...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-11 13:12
Pointer naar een stuk ROM geheugen bijvoorbeeld...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Tsja, het is mij altijd redelijk duidelijk dat als je pointers aanpast het dan niet meer werkt als voorheen. ROM zou je eerder gewoon aan een const* (ipv *const) denken. Maar misschien vooraf gedefineerde, vaststaande dma regions oid.

Anyway, voor de TS, het is ook wel erg lastig om 'C constant pointer' in Google in te tikken en de eerste hit aan te klikken: http://www.thegeekstuff.com/2012/06/c-constant-pointers/ Wat een zoektocht weer :P

[ Voor 33% gewijzigd door Zoijar op 17-08-2013 09:26 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-11 13:12
Zoijar schreef op zaterdag 17 augustus 2013 @ 09:20:
Maar misschien vooraf gedefineerde, vaststaande dma regions oid.
Daar gebruik ik het idd soms voor; of peripheral geheugen of bijvoorbeeld FLASH based settings in een embedded uP.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:57

Matis

Rubber Rocket

Topicstarter
Zoijar schreef op zaterdag 17 augustus 2013 @ 09:20:
Anyway, voor de TS, het is ook wel erg lastig om 'C constant pointer' in Google in te tikken en de eerste hit aan te klikken: http://www.thegeekstuff.com/2012/06/c-constant-pointers/ Wat een zoektocht weer :P
Ik vind het vervelend dat je nu net doet of ik niet gezocht heb. Want in mijn SP geef ik aan dat ik via het zoeken uitkwam op http://stackoverflow.com/...r-const-versus-const-char.
Ook gaf ik aan dat ik daaruit voortvloeiende dus alle 4 de constructies had getest, maar dat ik niet het gewenste resultaat kreeg.

Toen bleek dat ik een interpretatiefout van de voorbeeldcode had gemaakt, de * hoort dus in dit specifieke geval niet tegen de variabele naam aan, maar tegen de typedefenitie.
C:
1
2
3
4
/* Niet zo */
gpio_led const *led = &(leds[idx]); 
/* Maar zo */
gpio_led* const led = &(leds[idx]); 

Ik snap niet goed waaruit jij op denkt te maken dat ik mijn onderzoek niet goed heb gedaan.

[ Voor 4% gewijzigd door Matis op 17-08-2013 13:06 ]

If money talks then I'm a mime
If time is money then I'm out of time


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ja, nouja, er staat daar letterlijk bovenaan:
<type of pointer> * const <name of pointer>
Bij de eerste google hit op 'C pointer const'. Nee, dat vind ik niet goed zoeken, of zelfs een 'zoektocht'. Als iedereen zo zou zoeken werd er uberhaupt nooit software geschreven.

Ik wil mensen best (graag eigenlijk) helpen, maar ik snap gewoon niet dat het makkelijker is om hier een topic te openen en je hele probleem uit te leggen dan 1 google klik. Misschien kan ik zelf erg goed googlen, dat dat het is...
Pagina: 1