Error linguaggio C
spesso durante la compilazione risulta l'errore :
expected expression before ' {' token
che cosa significa?
expected expression before ' {' token
che cosa significa?
Risposte
E' un errore della sintassi del codice che hai scritto.
Se posti il sorgente lo possiamo trovare
Se posti il sorgente lo possiamo trovare
Immagino tu abbia dimenticato un ';' o qualcosa del genere.
#include <stdio.h> #include <time.h> #include <stdbool.h> void generate_random_walk(char a[10][10]); void print_array(char a[10][10]); int main(void) { char b[10][10]; generate_random_walk(b); print_array(b); return 0; } void generate_random_walk(char a[10][10]) { a[10][10]={{'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}, {'.', '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.' , '.'}}; bool d[10][10]={false}; ed int f; srand((unsigned)time(NULL)); int i=0; int j=0; int posizione; char c; a[0][0]='A'; d[0][0]=true; for(c='B';c<='Z';c++){ posizione=rand()%4; R: if ((posizione ==0) && ( j+1 <10) && (d[i][j+1]==false)){ j=j+1; a[i][j]=c; d[i][j]=true; f=1; } if((posizione ==1) &&( i+1<10) && (d[i+1][j]==false)){ i=i+1; a[i][j]=c; d[i][j]=true; f=1; } if((posizione ==2) && (i-1>= 0) &&(d[i-1][j]==false)){ i=i-1; a[i][j]=c; d[i][j]=true; f=1; } if ((posizione ==3 )&& (j-1>=0) &&(d[i][j-1]==false)){ j=j-1; a[i][j]=c; d[i][j]=true; f=1; } else { if (f ==1) goto L; else if ( (d[i][j-1]==true) &&(d[i-1][j]==true)&& (d[i+1][j]==true) && (d[i][j+1]==true)) goto M; posizione=rand()%4; goto R; } L: f=0; } M: return; } void print_array(char a[10][10]) { int i=0;int j=0; for (i=0;i<10;i++){ printf("\n"); for(j=0;j<10;j++) printf("%c", a[i][j]); } }
Programma che restituisce valori casuali che si devono muovere di una sola posizione che so no etichettati con le lettere in base all'ordine con cui escono.
A che linea ti dà errore?
OK, cominciamo dal primo errore. Una volta inizializzato un array non è più possibile usare la scrittura:
a[n] = { ... }
per inizializzarlo. Bisogna usare cicli oppure funzioni come memcpy.
Vedo un "ed" senza senso dopo la definizione di d.
Manca stdlib.h
Inoltre non vedo la necessità dell'uso dei goto.
a[n] = { ... }
per inizializzarlo. Bisogna usare cicli oppure funzioni come memcpy.
Vedo un "ed" senza senso dopo la definizione di d.
Manca stdlib.h
Inoltre non vedo la necessità dell'uso dei goto.
scusa non ho capito che ho sbagliato all'inizializzazione.
a che serve stdlib.h
a che serve stdlib.h
Di fatto un po' di tutto. Il passaggio di matrici in C non è così automatico, la dimensione non la passi per esempio. Inoltre non si può inizializzare in quel modo una variabile che hai già definito da un'altra parte. La scrittura a[10][10] si riferisce ad un elemento alla posizione (10, 10) che è tra l'altro persino fuori dalla matrice. La libreria stdlib definisce srand e rand.
Comunque ho corretto varie cose del codice, eliminato i goto e gestito la matrice come vettore per semplificarne il passaggio a funzione.
Comunque ho corretto varie cose del codice, eliminato i goto e gestito la matrice come vettore per semplificarne il passaggio a funzione.
#include <stdio.h> #include <time.h> #include <stdlib.h> #include <stdbool.h> void generate_random_walk(char* a, const unsigned int l); void print_array(char* a, const unsigned int l); int ind(const unsigned int i, const unsigned int j, const unsigned int l); int main(void) { char b[100]; generate_random_walk(b, 10); print_array(b, 10); return 0; } void generate_random_walk(char* a, const unsigned int l) { for(unsigned int i=0; i!=l; ++i) for(unsigned int j=0; j!=l; ++j) a[ind(i,j,l)] = '.'; bool d[10][10]={false}; bool repeat = true; int f=0; srand((unsigned)time(NULL)); int i=0; int j=0; int posizione; char c; a[ind(i,j,l)]='A'; d[0][0]=true; for(c='B';c<='Z';c++){ if(repeat) posizione=rand()%4; else repeat = true; if ((posizione ==0) && ( j+1 <10) && (d[i][j+1]==false)){ j=j+1; a[ind(i,j,l)]=c; d[i][j]=true; f=1; } if((posizione ==1) &&( i+1<10) && (d[i+1][j]==false)){ i=i+1; a[ind(i,j,l)]=c; d[i][j]=true; f=1; } if((posizione ==2) && (i-1>= 0) &&(d[i-1][j]==false)){ i=i-1; a[ind(i,j,l)]=c; d[i][j]=true; f=1; } if ((posizione ==3 )&& (j-1>=0) &&(d[i][j-1]==false)){ j=j-1; a[ind(i,j,l)]=c; d[i][j]=true; f=1; } else { if (f == 1) f=0; else { if ( (d[i][j-1]==true) &&(d[i-1][j]==true)&& (d[i+1][j]==true) && (d[i][j+1]==true)) return; posizione=rand()%4; repeat = false; } } } } void print_array(char* a, const unsigned int l) { unsigned int i=0; unsigned int j=0; for (i=0;i<l;i++){ printf("\n"); for(j=0;j<l;j++) printf("%c", a[ind(i,j,l)]); } } int ind(const unsigned int i, const unsigned int j, const unsigned int l) { return j*l + i; }
ma come devo scrivere i parametri nel caso di un vettore a due dimensioni ?
Questo è un esempio di programma che come potrai notare stampa tutti gli elementi della matrice associando anche le entrate... Comunque in un qualsiasi libro di teoria si trova tutto ciò

#include <stdio.h> #define NUMRIGHE 3 #define NUMCOLON 4 main() { int matrice[NUMRIGHE][NUMCOLON] = { {0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5} }; int riga,colonna; for(riga=0;riga<NUMRIGHE;riga++) for(colonna=0;colonna<NUMCOLON;colonna++) { printf("Matrice[%d][%d] = %d, posizione = %d\n", (riga+1),(colonna+1),matrice[riga][colonna], matrice [riga][colonna]); /* incremento riga e colonna perché in genere gli umani contano da 1 e non da 0 */ } }
La risposta più sensata da dire è che non lo fa nessuno, il fatto è che, nel caso in cui tutte le dimensioni sono fissate tranne una, lo puoi fare usando particolari giochetti ma alla fine questi giochi non portano eccessivi vantaggi rispetto al metodo che ti ho presentato. Il controllo diretto della memoria ha anche alcuni vantaggi in quanto permette di posizionare gli elementi della matrice in modi differenti che sono più efficienti con quel particolare algoritmo.