Error linguaggio C

streghettaalice
spesso durante la compilazione risulta l'errore :
expected expression before ' {' token

che cosa significa?

Risposte
nessuno.nobody
E' un errore della sintassi del codice che hai scritto.
Se posti il sorgente lo possiamo trovare

vict85
Immagino tu abbia dimenticato un ';' o qualcosa del genere.

streghettaalice
#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.

vict85
A che linea ti dà errore?

vict85
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.

streghettaalice
scusa non ho capito che ho sbagliato all'inizializzazione.
a che serve stdlib.h

vict85
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.

#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;
}

streghettaalice
ma come devo scrivere i parametri nel caso di un vettore a due dimensioni ?

Obidream
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ò :D
#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 */
   }
}

vict85
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.