Errore nel dimensionamento array

di Anonimizzato18856 il
10 risposte
Salve,
ho un array che viene gestito da diversi if e for nel programma.
Per evitare di scrivere ogni volta i valori di controllo che coincidono con la dimensione dell'array ho definito la seguente variabile:
int size = 1000;
Mi viene un errore nella riga in cui definisco l'array:
static char GPS_buff[size];
L'errore è: "variably modified 'GPS_buff' at file scope".

Se rimuovo size e ci metto l'importo numerico va tutto bene.

Perchè succede questo?

10 Risposte

  • Quale compilatore usi?
    Sostanzialmente il tuo compilatore non supporta i VLA (variable length array) e quindi, se vuoi utilizzare una dimensione variabile, devi allocare esplicitamente con malloc().
  • Probabilmente a te basta una costante, quindi

    const int size=1000;
  • Uso il GNU Compiler Collection (GCC) integrato nell'IDE Kinetis Design Studio (freescale)....
  • Chiedo scusa, ha ragione oregon : ti basta utilizzare const
  • Pessimo. La dimensione di un array deve essere un'espressione costante e non una variabile costante. I VLA sono una trovata del GCC e del Numerical C introdotta poi nello standard C99 che è stato formulato sostanzialmente a favore del compilatore standard per gli Unix-like. In seguito gli altri compilatori vi si sono adeguati controvoglia. Il fatto che i VLA siano diventati standard col C99 non significa che sia corretto usarli. Il modo migliore per definire un array di dimensione costante è il seguente:
    
    #define SIZE (1000U)
    int main (void)
    {
        int v [SIZE]; 
    }
    
    Questo dovrebbe essere l'unico modo da usare per dichiarare array, infatti anche l'uso di malloc() e simili va evitato in accordo col MISRA/C, regola 20.4 della vecchia edizione (sicuramente presente anche nel MISRA/C 2012).
  • In C++, le costanti "const int" sono valori a compile time e possono essere usate per settare i limiti di un array.
  • @loopunrolling quindi usare malloc é scorretto? Come devo fare per allocare un array dinamicamente?
  • Semplicemente non si fa. Si alloca precedentemente un vettore molto grande e lo si usa per la varie operazioni. In ogni caso bisogna capire quale linguaggio stia usando OP. Di C++ non so assolutamente nulla, in C almeno Hello World lo so fare. Credo comunque che OP sia alle prese con una MCU ARM e dal quel che poco che so, praticamente nulla, questi aggegi si programmano esclusivamente in C e Assembly. Già la differenza tra file HEX (per i PIC) prodotti partendo da un sorgente C e uno ASM si nota: ho fatto diverse prove e ho notato che scrivendo il codice in ASM si ottiene un risparmio in termini di dimensioni dell'eseguibile pari a circa il 60% rispetto allo stesso firmware scritto in C (che guarda un po' è la stessa percentuale di ottimizzazione che XC8 dice di poter raggiungere con la versione completa). Usare altri linguaggi non mi pare sensato. Poi ovviamente nessuno ha la sfera di cristallo quindi OP dovrebbe fornire più informazioni per poter ottenere un aiuto mirato. In ogni caso chiudo qui l'OT e lascio intervenire chi sa le cose che le mie "competenze" finiscono qui. Suggerisco solo di consultare datasheet e manuale del compilatore che aiutano sempre parecchio.
  • Caro loopunrolling, non diciamo fesserie. Prima di tutto siamo entrambi OT perché la questione é già stata risolta da oregon e secondariamente la malloc() può essere utilizzata, anche su ARM.
  • No, mi da errore anche con const...l'unico modo in cui mi funziona è con il metodo di loopunrolling.

    Quindi la prossima volta devo andare a cercare sul C99??

    Grazie comunque a tutti per l'aiuto.
Devi accedere o registrarti per scrivere nel forum
10 risposte