Indice di un array (da parametro di funzione)

di il
8 risposte

Indice di un array (da parametro di funzione)

Salve, devo sviluppare una libreria in C per l'università. Ho un problema con una funzione che come parametro passa un unsigned int. Il parametro fornito vorrei che diventasse l'indice di un array, ma non compila perchè l'indice deve essere una costante. La sintassi è questa:

void esempio(unsigned int n) {
static unsigned int a[n];
}

Ho provato a salvare il parametro in una variabile locale const unsigned int e a usare questa variabile come indice ma continua a dare lo stesso errore.

void esempio (unsigned int n){
const unsigned int c = n;
static unsigned int a[c];
}

Come posso fare per far si che l'array abbia n elementi?

8 Risposte

  • Re: Indice di un array (da parametro di funzione)

    Togli lo static...
  • Re: Indice di un array (da parametro di funzione)

    Weierstrass ha scritto:


    Togli lo static...
    ho risolto, togliendo lo static non cambia nulla . Ho dovuto allocare dinamicamente l'array con malloc().
  • Re: Indice di un array (da parametro di funzione)

    Ciao,
    in C per inizializzare un array è necessario che il numero di elementi sia un valore costante, per fare questo hai due possibilità:
    - Indicare in modo diretto il numero di elementi
     int array[5]; 
    - Indicare il numero di elementi con un valore costante
    
    cost int x = 5;
    int array[x];
    
    oppure
    
    #DEFINE LENGTH 5
    ...
    int array[LENGTH];
    
    Quello che cercavi di fare tu si chiama allocazione dinamica ed in C si devono utilizzare funzioni come malloc() o calloc() e come hai constatato tu stesso, funziona.
  • Re: Indice di un array (da parametro di funzione)

    samuele09 ha scritto:


    Weierstrass ha scritto:


    Togli lo static...
    ho risolto, togliendo lo static non cambia nulla . Ho dovuto allocare dinamicamente l'array con malloc().
    Ma che dici

    https://www.onlinegdb.com/online_c_compile

    Questo non compila perché c'è lo static
    
    #include <stdio.h>
    void esempio(unsigned int n) {
        int i;
        static unsigned int a[n];
        for(i = 0; i < n; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }
    }
    int main(){
        esempio(3);
        esempio(5);    
        return 0;
    }
    
    Questo compila ed esegue
    
    #include <stdio.h>
    void esempio(unsigned int n) {
        int i;
        /*static*/ unsigned int a[n];
        for(i = 0; i < n; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }
    }
    int main(){
        esempio(3);
        esempio(5);    
        return 0;
    }
    
    Se poi il problema è che vuoi un array globale, allora usi la malloc(), oppure - dato che comunque sicuramente dovrai porre un limite alla lunghezza del tuo array - puoi usare direttamente variabili globali
    
    #include <stdio.h>
    
    #define ARRAY_MAX 10000
    unsigned int a[ARRAY_MAX];
    int a_index;
    
    int esempio(unsigned int n) {
        if(n > ARRAY_MAX){
            printf("errore : valore di n (%u) troppo grande\n", n);    
            return -1;
        }
        int i;    
        a_index = n;
        for(i = 0; i < a_index; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }       
        return 0;    
    }
    
    int main(){
        esempio(3);
        esempio(5);    
        esempio(ARRAY_MAX + 1); 
        return 0;
    }
    
  • Re: Indice di un array (da parametro di funzione)

    Weierstrass ha scritto:


    samuele09 ha scritto:


    Weierstrass ha scritto:


    Togli lo static...
    ho risolto, togliendo lo static non cambia nulla . Ho dovuto allocare dinamicamente l'array con malloc().
    Ma che dici

    https://www.onlinegdb.com/online_c_compile

    Questo non compila perché c'è lo static
    
    #include <stdio.h>
    void esempio(unsigned int n) {
        int i;
        static unsigned int a[n];
        for(i = 0; i < n; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }
    }
    int main(){
        esempio(3);
        esempio(5);    
        return 0;
    }
    
    Questo compila ed esegue
    
    #include <stdio.h>
    void esempio(unsigned int n) {
        int i;
        /*static*/ unsigned int a[n];
        for(i = 0; i < n; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }
    }
    int main(){
        esempio(3);
        esempio(5);    
        return 0;
    }
    
    Se poi il problema è che vuoi un array globale, allora usi la malloc(), oppure - dato che comunque sicuramente dovrai porre un limite alla lunghezza del tuo array - puoi usare direttamente variabili globali
    
    #include <stdio.h>
    
    #define ARRAY_MAX 10000
    unsigned int a[ARRAY_MAX];
    int a_index;
    
    int esempio(unsigned int n) {
        if(n > ARRAY_MAX){
            printf("errore : valore di n (%u) troppo grande\n", n);    
            return -1;
        }
        int i;    
        a_index = n;
        for(i = 0; i < a_index; i++){
            a[i] = i + 1;
            printf("%u\n", a[i]);
        }       
        return 0;    
    }
    
    int main(){
        esempio(3);
        esempio(5);    
        esempio(ARRAY_MAX + 1); 
        return 0;
    }
    
    Su Visual Studio17 non compila nè togliendo lo static nè aggiungendo const, per cui l'unica soluzione nel mio caso era allocare dinamicamente l'array con malloc() o calloc().
  • Re: Indice di un array (da parametro di funzione)

    Visual studio non ha un buon supporto degli standard del C e gli array di lunghezza variabile (VLA) sembra che non siano supportati in quanto parte dello standard C99, a cui l'ambiente di Microsoft aderisce solo parzialmente.

    Per programmare in C ti conviene usare un IDE e compilatore diverso, oppure fare a meno dei VLA.

    PS: Prima di passare ad altro, assicurati che tuoi file sorgenti abbiano l'estensione c e non cpp, può darsi che funzioni.
  • Re: Indice di un array (da parametro di funzione)

    All'università dovrebbero saperlo, però, che la Microsoft è ferma all'età della pietra per quanto riguarda il C, e magari farvi usare qualcosa di più adatto.

    E non hanno intenzione di aggiornarsi.
    https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/
    C17 senza VLA...
  • Re: Indice di un array (da parametro di funzione)

    Una domanda, per capire, scusatemi

    Ma ammettendo di avere un compilatore che aderisce al C99, per avere un (quasi) VLA globale (ad esempio di interi) non basta definire globale un puntatore ad intero
    Poi nella main() si dichiara un VLA di interi, che sarà locale, quindi non utilizzabile in altre funzioni
    Poi si eguaglia il puntatore globale all'indirizzo del VLA
    il puntatore è globale e si può usare ovunque come fosse un array, in questo caso il VLA

    Sbaglio qualcosa?
Devi accedere o registrarti per scrivere nel forum
8 risposte