Errore nel dimensionamento array

di il
10 risposte

Errore nel dimensionamento array

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

  • Re: Errore nel dimensionamento array

    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().
  • Re: Errore nel dimensionamento array

    Probabilmente a te basta una costante, quindi

    const int size=1000;
  • Re: Errore nel dimensionamento array

    Uso il GNU Compiler Collection (GCC) integrato nell'IDE Kinetis Design Studio (freescale)....
  • Re: Errore nel dimensionamento array

    Chiedo scusa, ha ragione oregon : ti basta utilizzare const
  • Re: Errore nel dimensionamento array

    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).
  • Re: Errore nel dimensionamento array

    In C++, le costanti "const int" sono valori a compile time e possono essere usate per settare i limiti di un array.
  • Re: Errore nel dimensionamento array

    @loopunrolling quindi usare malloc é scorretto? Come devo fare per allocare un array dinamicamente?
  • Re: Errore nel dimensionamento array

    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.
  • Re: Errore nel dimensionamento array

    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.
  • Re: Errore nel dimensionamento array

    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