Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81

    [c] Invalid Use Of Array With Unsipicified Bounds

    Perchè mi da questo errore???

    codice:
    #include<stdio.h>
    
    #define M 100
    
    int getline(char[], FILE*);
    
    void riempiuno(int[][], int[][]);
    
    int carica(char *, char[][]);
    
    void output (char[][] , int[][] , int[][], int);
    
    void itoa(int, char[]);
    
    void reverse (char[]);
    
    void ricorda(char[][], int[][], int);
    
    void ricorda1(char[][], int[][], int);
    
    
    
    main(int argc, char *argv[])
    
    {       
    
             int q;
    
             char matrice [M] [M];
    
             int  ver[M][4],
    
                  ori[M][4];
    
             char     finale[q][q];
    
             riempiuno(ori,ver);
    
             q=carica(argv[1], matrice);
    
             ricorda(matrice, ori, q);
    
             q=carica(argv[2], matrice);
    
             ricorda1(matrice, ver, q);
    
             output(finale, ori, ver, q);
    
             
    
    }         
    
             
    
             
    
             
    
             
    
    int carica (char *input, char matrice[][])
    
    {
    
        FILE *fin;
    
        fin=fopen(input, "r");
    
        char line[M];
    
        int r,c,len;
    
        
    
        while((len=getline(line, fin))>0)
    
            for(r=0; r<len; r++)
    
                for(c=0; c<len; c++)
    
                    matrice[r][c]=line[c];
    
        return len;
    
    }
    
    
    
    int getline(char line[] , FILE *f )
    
    {
    
        int i=0,c;
    
        while((c=getc(f))!='\0' && c!= '\n')
    
            if (c=='\n')
    
                line[i++]=c;
    
            line[i]='\0';
    
        return i;
    
    }
    
    
    
    void ricorda( char matrice[][], int ori[][], int e)
    
    {    
    
         int q,w,r,i=0,c;
    
         for (r=0; r<e; r++)
    
             {
    
                   for (c=0; c<e; c++)
    
                       {
    
                           if(matrice[r][c]== 'x' && matrice [r][c-1]!='x')
    
                               w=c;
    
                           if(matrice[r][c]== 'x' && matrice [r][c+1]!= 'x')
    
                               {
    
                                              q=c;
    
                                              ori[i][0]=r;
    
                                              ori[i][1]=w;
    
                                              ori[i][2]=q-w;
    
                                              i++;
    
                               }
    
                           
    
             }
    
    }
    
                     
    
    void ricorda1( char matrice[][], int ori[][], int e)
    
    {    
    
         int q,w;
    
         int i=0;
    
         for (r=0; r<e; r++)
    
             {
    
                   for (c=0; c<e; c++)
    
                       {
    
                           if(matrice[c][r]== 'x' && matrice [c][r-1]!='x')
    
                               w=r;
    
                           if(matrice[c][r]== 'x' && matrice [c][r+1]!= 'x')
    
                               q=r;
    
                           ori[i][0]=c;
    
                           ori[i][1]=w;
    
                           ori[i][2]=q-w;
    
                           i++;
    
                       }
    
                           
    
             }
    
    }     
    
    
    
    void riempiuno(int ori[][], int ver[][])     
    
    {
    
         for(r=0; r<M; r++)
    
             for(c=0; c<3; c++)
    
             {
    
                  ori[r][c]=-1;
    
                  ver[r][c]=-1;
    
             }
    
    }
    
    
    
    void output(char matrice[][], int ori[][], int ver[][],int e)
    
    
    
    
    
    {    int j;
    
         char slun[2];
    
         for(r=0; r<e; r++)
    
             for(c=0; c<e; c++)
    
                matrice[r][c]= '.';
    
         
    
         
    
         for(r=0; r<M; c++)
    
             for(c=0; c<3; c++)
    
                 {
    
                      if(ori[r][c]>0)
    
                          {
    
                              matrice[ori[r][0]][ori[r][1]]='O';
    
                              itoa(matrice[r][2],slun);
    
                              for(j=0;slun[j]!='\0'; j++);
    
                                  matrice[ori[r][0]][ori[r][2+1+j]]=slun[j];
    
                          }
    
                 }
    
                 
    
          for(r=0; r<M; c++)
    
             for(c=0; c<3; c++)
    
                 {
    
                      if(ver[r][c]>0)
    
                          {
    
                              matrice[ver[r][0]][ver[r][1]]='V';
    
                              itoa(matrice[r][2],slun);
    
                              for(j=0;slun[j]!='\0'; j++);
    
                                  matrice[ori[r][0]][ori[r][2+1+j]]=slun[j];
    
                          }
    
                 }
    
    }
    
    
    
    void itoa(int n, char s[])
    
    {
    
      int i=0;
    
    
    
      do{
    
         s[i++]=n%10 + '0';
    
         }while((n/=10)>0);
    
      s[i]='\0';
    
      reverse(s);
    
    
    
    }
    
    
    
    
    
    
    
    void reverse(char s[]){
    
     int c,i,j;
    
    
    
     for(i=0, j=strlen(s)-1; i<j; i++,j--) {
    
              c = s[i];
    
              s[i]=s[j];
    
              s[j]=c;
    
              }
    
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Beh ... il messaggio e' chiaro ... non puoi scrivere

    void riempiuno(int[][], int[][]);

    ... devi almeno indicare l'ultima dimensione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    Tu ti riferisci a riempiuno prima del main, o quando vado a svolgere la funzione?

    Ho notato che, se modifico tutte le funzioni così:

    Ho capito che se ad es. nella funzione carica, matto la M (nel primo rigo), così:

    codice:
    int carica (char *input, char matrice[][M])
    
    {
    
       FILE *fin;
    
       fin=fopen(input, "r");
    
       char line[M];
    
       int r,c,len;
    
     
       while((len=getline(line, fin))>0)
    
           for(r=0; r<len; r++)
    
               for(c=0; c<len; c++)
    
                   *matrice[r][c]=line[c];*
    
       return len;
    
    }
    Mi toglie l'errore realtivo al pezzo evidenzato, in cui mi diceva invaid use of errore with unspicfed bounds, ma non riesco a capire perchè sia così fondamentale definire che il numero di colonne di matrice sia M,visto che poi scorro le colonne fino a quando sono minori di len.... e quindi non entra in gioco M

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da maurymg
    Tu ti riferisci a riempiuno prima del main, o quando vado a svolgere la funzione?
    A tutte le dichiarazionu delle funzioni in cui hai le matrici bidimensionali ...

    Ho notato che, se modifico tutte le funzioni così:

    Ho capito che se ad es. nella funzione carica, matto la M (nel primo rigo), così:

    [CODE]
    int carica (char *input, char matrice[][M])
    E' quello che ti sto dicendo di fare ...

    ma non riesco a capire perchè sia così fondamentale definire che il numero di colonne di matrice sia M
    Il compilatore lo deve sapere PRIMA ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    cio' vale dunque solo per i vettori bidimensionali, giusto?
    Perchè finora quando ho passato alle funzioni semplici vettori, non c'era mai stato bisogno di passare anche la grandezza..

    Ho adesso corretto gli errori, ma non mi viene creato alcun file in uscita.. perchè?

    codice:
    #include<stdio.h>
    #include<string.h>
    #define M 100
    int getline(char[], FILE*);
    void riempiuno(int[][], int[][]);
    int carica(char *, char[][]);
    void output (char[][] , int[][] , int[][], int);
    void itoa(int, char[]);
    void reverse (char[]);
    void ricorda(char[][], int[][], int);
    void ricorda1(char[][], int[][], int);
    void stampa (char *, char[][], int);
    
    main(int argc, char *argv[])
    {      
    
             int q;int r,c;
             char matrice [M] [M];
             int  ver[M][4],
                  ori[M][4];
             char     finale[M][M];
             riempiuno(ori,ver);
             q=carica(argv[1], matrice);
             ricorda(matrice, ori, q);
             q=carica(argv[2], matrice);
             ricorda1(matrice, ver, q);
             output(finale, ori, ver, q);
             stampa(argv[3], finale,q);
    }         
             
             
             
             
    int carica (char *input, char matrice[][M])
    {
        FILE *fin;
        fin=fopen(input, "r");
        char line[M];
        int r,c,len;
        
        r=0;
        while((len=getline(line, fin))>0)
                {
                for(c=0; c<len; c++)
                    matrice[r][c]=line[c];
                r++;
                }
        return len;
    }
    
    int getline(char line[] , FILE *f )
    {
        int i=0,c;
        while((c=getc(f))!='\0' && c!= '\n')
            line[i++]=c;
        if (c=='\n')
            line[i++]=c;
        line[i]='\0';
        return i;
    }
    
    void ricorda( char matrice[M][M], int ori[M][3], int e)
    {    
         int q,w,r,i=0,c;
         for (r=0; r<e; r++)
             {
                   for (c=0; c<e; c++)
                       {
                           if(matrice[r][c]== 'x' && matrice [r][c-1]!='x')
                               w=c;
                           if(matrice[r][c]== 'x' && matrice [r][c+1]!= 'x')
                               {
                                              q=c;
                                              ori[i][0]=r;
                                              ori[i][1]=w;
                                              ori[i][2]=q-w;
                                              i++;
                               }
                           
                  }
    }
    }
                     
    void ricorda1( char matrice[M][M], int ori[M][3], int e)
    {    
         int q,w,r,c;
         int i=0;
         for (r=0; r<e; r++)
             {
                   for (c=0; c<e; c++)
                       {
                           if(matrice[c][r]== 'x' && matrice [c][r-1]!='x')
                               w=r;
                           if(matrice[c][r]== 'x' && matrice [c][r+1]!= 'x')
                           {
                               q=r;
                           ori[i][0]=c;
                           ori[i][1]=w;
                           ori[i][2]=q-w;
                           i++;
                       }   }
                           
             }
    }     
    
    void riempiuno(int ori[M][3], int ver[M][3])     
    {int r,c ;
         for(r=0; r<M; r++)
             for(c=0; c<3; c++)
             {
                  ori[r][c]=-1;
                  ver[r][c]=-1;
             }
    }
    
    void output(char matrice[M][M], int ori[M][3], int ver[M][3],int e)
    
    
    {    int j,r,c;
         char slun[2];
         for(r=0; r<e; r++)
             for(c=0; c<e; c++)
                matrice[r][c]= '.';
         
         
         for(r=0; r<M; r++)
                 {
                      if(ori[r][0]>=0)
                          {
                              matrice[ori[r][0]][ori[r][1]]='O';
                              itoa(ori[r][2],slun);
                              for(j=0;slun[j]!='\0'; j++);
                                  matrice[ori[r][0]][ori[r][1]+j+1]=slun[j];
                          }
                 }
                 
          for(r=0; r<M; r++)
            {
                      if(ver[r][0]>=0)
                          {
                              matrice[ver[r][0]][ver[r][1]]='V';
                              itoa(ver[r][2],slun);
                              for(j=0;slun[j]!='\0'; j++);
                                  matrice[ver[r][0]][ver[r][1]+j+1]=slun[j];
                          }
                 }
    }
    
    void itoa(int n, char s[])
    {
      int i=0;
    
      do{
         s[i++]=n%10 + '0';
         }while((n/=10)>0);
      s[i]='\0';
      reverse(s);
    
    }
    
    
    
    void reverse(char s[]){
     int c,i,j;
    
     for(i=0, j=strlen(s)-1; i<j; i++,j--) {
              c = s[i];
              s[i]=s[j];
              s[j]=c;
              }
    
    }
     
             
             
    void stampa(char *input, char matrice[][M], int q)
    {     
         FILE *fout;
         int r,c;
         fout=fopen(input,"w"); 
         for(r=0; r<q; r++)
         {
             for(c=0; c<q; c++)
                 fprintf(fout, "%c", matrice[r][c]);
             fprintf(fout, "\n");
         }
    
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Guarda che le dichiarazioni iniziali devono essere uguali a quello che scrivi dopo ...

    Per quanto riguarda il problema della mancata scrittura del file, hai fatto un po' di debugging ...?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    Originariamente inviato da oregon
    Guarda che le dichiarazioni iniziali devono essere uguali a quello che scrivi dopo ...
    A cosa ti riferisci in particolare?

    Originariamente inviato da oregon
    Per quanto riguarda il problema della mancata scrittura del file, hai fatto un po' di debugging ...?

    Cosa intendi per debugging? Non avevo mai sentito questo termine..
    Ho fatto una ricerca su wiki..
    Se intendi di mettere vari printf per capire dove risiede l'errore, nn riesco a capire cmq dov'è l'errore.

    Se invece intendi proprio il comando debug, mi dice il programma ha causato una violazione di accesso (errore di segmentazione).
    P.s. andando su debug non so nemmeno cosa ho fatto...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da maurymg
    A cosa ti riferisci in particolare?
    In testa dichiari

    void riempiuno(int[][], int[][]);

    e poi la funzione e'

    void riempiuno(int ori[M][3], int ver[M][3])

    Cosa intendi per debugging? Non avevo mai sentito questo termine..
    Per un programmatore, non e' una bella cosa ...

    Se intendi di mettere vari printf per capire dove risiede l'errore, nn riesco a capire cmq dov'è l'errore.
    Anche questo ... esegui passo passo, interrompi il codice nei vari punti e cerca di capire dove puo' essere il problema ...

    Se il file non lo crea, controlla la funzione che dovrebbe farlo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    Originariamente inviato da oregon
    In testa dichiari

    void riempiuno(int[][], int[][]);

    e poi la funzione e'

    void riempiuno(int ori[M][3], int ver[M][3])
    Non capisco dove sta la contraddizione.. Sono due matrici di int.
    Per un programmatore, non e' una bella cosa ...
    E' da poco piu' di due mesi che studio il c.. sto cercando di impararlo...


    Tu hai identificato l'errore?
    Non so dove guardare...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da maurymg
    Non capisco dove sta la contraddizione.. Sono due matrici di int.
    No ... una e' una dichiarazione di come sara' la funzione ... devono essere uguali ...

    Tu hai identificato l'errore?
    Non so dove guardare...
    Devo prendere il tuo codice e provarlo ... ci vuole del tempo ...

    Intanto, nel main utilizzi

    int ver[M][4],
    ori[M][4];

    e nell funzioni l'ultima dimensione e' di [3]

    Questo e' sbagliato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.