2016-04-21 13 views
7

quindi ho una struct:Come inizializzare correttamente una variabile const const const?

typedef struct myStruct 
{ 
    const int *const array_ptr; 
} myStruct_s; 

Ho un const serie di int:

const int constArray[SIZE1] = 
{ 
     [0] = 0, 
     [1] = 1, 
     [2] = 2, 
     //... 
}; 

Ora ho un const serie di myStruct_s inizializzato con intializers designati:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = &constArray 
      }, 
     //... 
} 

Ricevo l'avviso:

un valore di tipo "const int (*) [SIZE1]" non può essere utilizzato per inizializzare un un'entità di tipo "const int * const"

Come posso inizializzare correttamente questo puntatore?

vorrei evitare:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = (const int *const) &constArray 
      }, 
     //... 
} 

Se possibile, dal momento che mi sento come dico il compilatore "Non so quello che sto facendo, solo che non controllare il tipo di favore" ...

Grazie per il vostro aiuto :).

+1

'array_ptr = & constArray [0];' – Nadir

+3

Gli indici di matrice iniziano da 0. I tuoi compiti ('[1] = 1') iniziano da 1. Non sono correlati al problema, ma sembrano sospetti. – davmac

+0

@davmac: hai ragione! In realtà io uso 'enum' come indici per riempire gli array. Non uso mai numeri magici :). Ho semplificato il mio codice un po 'troppo velocemente! – Plouff

risposta

11

constArray è già (decade in) un puntatore, si vuole

.array_ptr = constArray 

o

.array_ptr = &constArray[0] /* pointer to the first element */ 

invece di

.array_ptr = &constArray /* you don't want the address of */ 

Considerare

int a[] = {1,2}; 
int *p = &a; 

Questo non è corretto perché p vuole un puntatore ad un int (&a[0] o semplicemente a), non è un puntatore a un array di 2 int (&a)

+1

Corretto, ma potrebbe utilizzare una spiegazione del perché esattamente "& constArray' non funziona. – davmac

+0

Ah, ok, ci proverò ma il mio inglese è molto scarso :) –

+0

@davmac, fatto, sentitevi liberi di migliorare la modifica –

-1

È necessario rimuovere la e commerciale da prima constArray, che sarà poi fornire un tipo di puntatore compatibile.

Il motivo: gli array vengono trattati in modo simile ai puntatori in C. Quindi constArray è già efficace const int *const. Ma quando prendi l'indirizzo, ad esempio &constArray, ottieni effettivamente un tipo compatibile con const int *const *const.

+4

No. Si sta ottenendo un tipo che sarebbe compatibile con 'const int (*) []'. Gli array non decadono ai puntatori quando sono l'operando di '&'. – davmac

+3

Il secondo paragrafo è spazzatura –