+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

Matrici e Array: invalid use of array with unspecified bounds

  1. #1
    DrGonzo non è in linea Novello
    Salve ragazzi...sto lavorando con matrici e array e a un certo punto mi ha dato un errore. Allora ho fatto delle prove con un altro codice sorgente...molto semplice. Crea un array e una matrice e la inizializza. Le stampa a video. Poi le passa alla funzione relativa dell'array e della matrice che somma 1 all'elemento nell'array e nella matrice. Adesso però mi da un piccolo problema. Con l'array tutto apposto non mi da errori, però per la matrice si. Allego il codice di seguito:
    void Arr(int []);
    void Mat(int [][]);
    int main(){
     int a[5]={1,2,3,4,5};
     printf("%d ",a[0]);
     printf("%d ",a[1]);
     printf("%d ",a[2]);
     printf("%d ",a[3]);
     printf("%d \n",a[4]);
     Arr(a);
     printf("%d ",a[0]);
     printf("%d ",a[1]);
     printf("%d ",a[2]);
     printf("%d ",a[3]);
     printf("%d \n",a[4]);
     
     int b[2][2]={{2,3},{4,5}};
     printf("%d ",b[0][0]);
     printf("%d ",b[0][1]);
     printf("%d ",b[1][0]);
     printf("%d \n",b[1][1]);
     Mat(b);
     printf("%d ",b[0][0]);
     printf("%d ",b[0][1]);
     printf("%d ",b[1][0]);
     printf("%d \n",b[1][1]);
     
     scanf("%d",&a[0]);
     return 0;
    }
    void Arr(int ptr[]){
     int x=0;
     while(x<5){
      //printf("%d \n",ptr[x]+1);
      ptr[x]=(int)ptr[x]+1;
      x++;
     } 
    }
    void Mat(int ptr[][]){
     int x=0;
     int y=0;
     while(x<2){
      while(y<2){
       ptr[x][y]=(int)ptr[x][y]+1;
       y++;
      }
      x++;
      y=0;
     }
    }
    
    invalid use of array with unspecified bounds: questo è l'errore che mi da. Come se per la matrice non avesse un limite...perchè?
    Ultima modifica di bottomap; 12-05-2008 16:21  Motivo: formattato codice

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Il problema è legato direttamente alla sintassi ed alle basi del linguaggio. Non è possibile specificare un array multidimensionale privo di entrambe le dimensioni (a[][]). La prima deve essere specificata, se si vuole utilizzare la notazione in questione.

    Non è comunque un problema, supposto che si sappia quello che si sta facendo (ovvero che si abbia il pieno controllo dei limiti della matrice), utilizzare la notazione int **ptr (o int* ptr[]) al posto di int ptr[][].

    La matrice multidimensionale statica (int a[m][n]) sarà qualcosa che utilizzerai, man mano che approfondisci il linguaggio, sempre meno, a favore di un'allocazione dinamica delle risorse. La notazione int** ha a che fare proprio con quest'ultimo argomento.

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  3. #3
    DrGonzo non è in linea Novello
    Ho fatto prove con puntatori...ti allego il codice cambiato. In teoria questo dovrebbe funzionare. Ma anche questo mi dà un errore. Semmai se mi puoi dire cosa dovrei cambiare per farlo funzionare saresti gentilissimo (comunque io conosco i limiti della matrice):

    void Arr(int []);
    void Mat(int **);

    int main(){
    int a[5]={1,2,3,4,5};
    printf("%d ",a[0]);
    printf("%d ",a[1]);
    printf("%d ",a[2]);
    printf("%d ",a[3]);
    printf("%d \n",a[4]);
    Arr(a);
    printf("%d ",a[0]);
    printf("%d ",a[1]);
    printf("%d ",a[2]);
    printf("%d ",a[3]);
    printf("%d \n",a[4]);

    int b[2][2]={{2,3},{4,5}};
    printf("%d ",b[0][0]);
    printf("%d ",b[0][1]);
    printf("%d ",b[1][0]);
    printf("%d \n",b[1][1]);
    Mat(b);
    printf("%d ",b[0][0]);
    printf("%d ",b[0][1]);
    printf("%d ",b[1][0]);
    printf("%d \n",b[1][1]);

    scanf("%d",&a[0]);
    return 0;
    }

    void Arr(int ptr[]){
    int x=0;
    while(x<5){
    //printf("%d \n",ptr[x]+1);
    ptr[x]=(int)ptr[x]+1;
    x++;
    }
    }

    void Mat(int **ptr){
    int x=0;
    int y=0;
    while(x<2){
    while(y<2){
    ptr[x][y]=ptr[x][y]+1;
    y++;
    }
    x++;
    y=0;
    }
    }

    L'errore che mi dà è: Array.c:26: warning: passing arg 1 of `Mat' from incompatible pointer type

  4. #4
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    La notazione in questione (int**) non è intercambiabile con int[][]. Per usarla devi allocare dinamicamente la matrice come vettore di puntatori. La notazione con il doppio operatore [] è utile solo in ambiti molto limitati e difficilmente ne avrai bisogno nel prosieguo.

    Per risolvere in altro modo (quindi mantenendo il codice che hai scritto), l'unica è passare le dimensioni della matrice nel prototipo della funzione (void Mat(int [2][2])).

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [C++]Problema con vettori/array/matrici
    Da ValerioHD nel forum C/C++
    Risposte: 9
    Ultimo Post: 26-12-2010, 21:01
  2. Accodare velocemente un Array ad un altro Array
    Da Neway nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 08-11-2010, 13:42
  3. vb6 array
    Da BrandonHeat nel forum Visual Basic 6
    Risposte: 12
    Ultimo Post: 08-11-2006, 12:17
  4. Risposte: 2
    Ultimo Post: 05-11-2005, 09:22
  5. Array
    Da dolcissimo nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 17-06-2005, 17:28