[C] Problema di segmentation faut

DispErata891
ciao!sto scrivendo un programma in C e quando lo faccio girare mi va in segmentation fault ma non so il perchè!

provo a spiegare il problema:
praticamente devo fare un programma per un gioco, in cui posso scegliere (o tramite tastiera, o menù) delle diverse opzioni:
- le dimensioni del gioco
-il tipo di giocatori (uomo/uomo,uomo/pc,pc/pc)
-la modalità di gioco (cioè quando far terminare la partita)
In base al tipo di giocatori ho sviluppato 3 diverse funzioni (uomo/uomo,uomo/pc,pc/pc), alle quale passo sia le dimensioni del gioco, sia la modalità di gioco. Se io provo a farmi stampare le diverse opzioni prima di entrare nella funzione (o uomo/uomo,o uomo/pc, o pc/pc, a seconda della scelta fatta), sono corrette, cioè corrispondono a quelle che ho scelto io (quindi non penso ci sia un problema nella scelta delle opzioni no??). Quando invece faccio girare il programma, appena dovrebbe entrare nella funzione, mi dice segmentation fault.

Ho provato a non passare la modalità di gioco nella funzione, ma solo le dimensioni del gioco, togliendo così l'opzione "modalità" nella scelta da fare. In questo modo inizializzavo la modalità di gioco direttamente dentro la funzione...e tutto andava bene (quindi non penso ci sia un problema nella funzione..no??).
Quello che non capisco è che io passo sia le dimensioni, sia la modalità nello stesso modo dentro la funzione...

...non so dove trovare l'errore!!!
Spero di essermi spiegata bene anche se capisco che non vedendo il programma non è facilissimo capire il problema..
grazie cmq!

Risposte
dzcosimo
magari vedendo il codice....così non si capisce molto bene...
forse però altri più esperti di me ti sapranno dare una mano comunque ;-)

apatriarca
Devi mostrare il codice.

DispErata891
va bene...ve lo passo!
Cmq ora ho aggiunto altre cose...spero sia comprensibile comunque!
E' fatto su più file...ed è lunghissimo...

vi mostro quello che dovrebbe servire..



int main(int argc,char **argv) 
{
SDL_Surface *screen;
SDL_Rect v;
SDL_Event event;
int esc=0,esc1=0,esc2=0,esc3=0,esc4=0;
TTF_Font *font;
int sfondo;
int menu[10][3];
int mg[10][3];
int mcon[25][3];
int mcon2[10][3];
int usc[3][3];
int tasti[20][3];
int mossa[10][2];
int choice1=7;
int *choice2;
int choice4=-1;
int choice3=7;
int choice5=-1;
int j,k;
float *l;
int posto[8][9];
int i=0;
int gioc=1;
int livello1=0,livello2=0;
int modalita=0;
int r=6,c=7;
STORIA st[50];
TURNO tu[50];


for (k=0;k<50;k++)
{st[k].riga=0;
st[k].colonna=0;
}

for (k=0;k<50;k++)
   tu[k].scelta=0;
/*crea sfondo e rettangolo*/

  if(SDL_Init(SDL_INIT_VIDEO)<0)
  {
    fprintf(stderr,"Couldn't init video: %s\n",SDL_GetError());
    return(1);
  }

/* Initialize the TTF library */
  if(TTF_Init() < 0)
  {
    fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
    SDL_Quit();
  }

  font = TTF_OpenFont("FreeSans.ttf", DEFAULT_PTSIZE);
  if(font == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }

 
switch (argv[1][0])
  {
    case 'g':
           v.x=0; 
	   v.y=0;
	   v.w=780;
	   v.h=600;
	   //h=60;
	   screen=SDL_SetVideoMode(v.w,v.h,32,SDL_HWSURFACE);
  if(screen==NULL)
  {
    fprintf(stderr,"Can't set video mode: %s\n",SDL_GetError());
    SDL_Quit();
  }

   break;
   case 'p':
	   v.x=0; 
	   v.y=0;
	   v.w=640;
	   v.h=480;
	   //h=40;	
	    screen=SDL_SetVideoMode(v.w,v.h,32,SDL_HWSURFACE);
  if(screen==NULL)
  {
    fprintf(stderr,"Can't set video mode: %s\n",SDL_GetError());
    SDL_Quit();
  }
  break;
  }	

//tasto uscita
usc[1][0]=330;
usc[1][1]=460;
usc[1][2]=10; 

for (j=0;j<r;j++)
 for (i=0;i<c;i++)
  posto[j][i]=0;

sfondo=SDL_MapRGB(screen->format,212,55,150);
SDL_FillRect(screen,NULL,sfondo);
puliscischermo(v,screen,sfondo);
creamenu(v,screen,menu);

    do 
    {
     choice1=sceltamenu(menu,screen);
      switch(choice1)
      {
         case 1:
	                     		puliscischermo(v,screen,sfondo);
					caricafoto(screen,usc);
					SDL_UpdateRect(screen,0,0,0,0);
					tornamenu(screen,usc);
					puliscischermo(v,screen,sfondo);
					creamenu(v,screen,menu);
					choice1=5;
					esc=0;
					break;
	case 2:
					puliscischermo(v,screen,sfondo);
					regole(screen,usc,v);
					SDL_UpdateRect(screen,0,0,0,0);
					tornamenu(screen,usc);
					puliscischermo(v,screen,sfondo);
					creamenu(v,screen,menu);
					choice1=5;
					esc=0;
	
					break;
	case 3:
				        esc2=0;
					
					for (j=0;j<r;j++)
 						for (i=0;i<c;i++)
  							posto[j][i]=0;

					puliscischermo(v,screen,sfondo);
					vuotascacchiera(posto,r,c);
					scacchiera(v,screen,tasti,c,l);
					comandigioco(v,screen,mg,menu);
					
					tasti[9][0]=mg[0][0]; 
					tasti[9][1]=mg[0][1];
					tasti[9][2]= mg[0][2];
					tasti[10][0]=mg[1][0];
					tasti[10][1]=mg[1][1];
					tasti[10][2]=mg[1][2];
					tasti[11][0]=mg[2][0];
					tasti[11][1]=mg[2][1];
					tasti[11][2]=mg[2][2];
					tasti[12][0]=mg[3][0];
					tasti[12][1]=mg[3][1];
					tasti[12][2]=mg[3][2];
					tasti[13][0]=mg[4][0];
					tasti[13][1]=mg[4][1];
					tasti[13][2]=mg[4][2];
					tasti[14][0]=mg[5][0];
					tasti[14][1]=mg[5][1];
					tasti[14][2]=mg[5][2];
					
						switch(gioc)	/*tipo di partita*/
						   {
							case 1:
					printf("gioc %d\n",gioc);
					printf("liv1 %d\n",livello1);
					printf("liv2 %d\n",livello2);
					printf("modo %d\n",modalita);
								*choice2=uomouomo(screen,v,mossa,tasti,l,posto,mg,choice2,st,sfondo,menu,tu,r,c,modalita);
								
							break;
							case 2:
					printf("gioc %d\n",gioc);
					printf("liv1 %d\n",livello1);
					printf("liv2 %d\n",livello2);
					printf("modo %d\n",modalita);
								*choice2=uomopc(screen,v,mossa,tasti,l,posto,mg,choice2,st,sfondo,menu,tu,livello1,r,c,modalita);
							break;
							case 3:
					printf("gioc %d\n",gioc);
					printf("liv1 %d\n",livello1);
					printf("liv2 %d\n",livello2);
					printf("modo %d\n",modalita);
								*choice2=pcpc(screen,v,mossa,tasti,l,posto,mg,choice2,st,sfondo,menu,tu,livello1,livello2,r,c,modalita);
							break;
						  }
					
					if ((*choice2!=14)&&(*choice2!=15))
					{
					do
					{	choice3=sceltagioco(screen,mg);
					switch(choice3)
						{
							case 1:
							        salva(posto,r,c);
								SDL_UpdateRect(screen,0,0,0,0);
								
								
							break;
							case 2:
								istruzioni(screen,v);
								SDL_UpdateRect(screen,0,0,0,0);
								
							break;
							case 3:
								vuotascacchiera(posto,r,c);
								load(posto,r,c);
								SDL_UpdateRect(screen,0,0,0,0);
								ridisegna(screen,posto,l,mossa,r,c);
								SDL_UpdateRect(screen,0,0,0,0);
							       
							break;	
							case 4:
								
								k=1;
								do
								  {k++;
								}while (tu[k].scelta!=0);
								history(k,st);
								
							break;						
							case 5:
								esc2=1;
								
							break;
							case 6:
								
							        vuotascacchiera(posto,r,c);
								puliscischermo(v,screen,sfondo);
								SDL_UpdateRect(screen,0,0,0,0);
								creamenu(v,screen,menu);
								esc2=1;
							break;
							
						}
					}while(esc2!=1);
					}SDL_UpdateRect(screen,0,0,0,0);	
					choice1=6;
					esc=0;
					
					break;
case 4:
					esc3=0;
					esc4=0;
					puliscischermo(v,screen,sfondo);
					dimscac(screen,v,mcon2);
					
					do
    						{ if (SDL_PollEvent(&event))
      							switch(event.type)
      							{
     							   case SDL_MOUSEBUTTONDOWN:
         							  if(event.button.button==1)
	 								opt_menu(mcon2,8,event.button.x,event.button.y,&choice5);
								   case SDL_KEYDOWN:
									switch (event.key.keysym.sym)
		  								{
		   								case SDLK_6:
											choice5=1;
		     								break;
		     								case SDLK_7:	
         	         								choice5=2;
 		     								break;
		     								case SDLK_8:	
         	         								choice5=3;
		      								break;
										case SDLK_9:
											choice5=4;
										break;
										case SDLK_n:
											choice5=5;
										break;
										case SDLK_v:
											choice5=6;
										break;
										case SDLK_s:
											choice5=7;
										break;
										case SDLK_ESCAPE:
											choice5=8;
										break;
		     								default:							
		     								break;

		  								} 
							}
						switch(choice5)
							{
								case 1:	
									r=5;
									c=6;
								break;
								case 2:	
									r=6;
									c=7;
								break;
								case 3:	
									r=7;
									c=8;
								break;
								case 4:	
									r=8;
									c=9;
								break;
								case 5:
									modalita=0;
								break;
								case 6:
									modalita=1;
								break;
								case 7:	
									puliscischermo(v,screen,sfondo);
									configurazione(v,screen,mcon);
									do
										{choice4=scelta_conf(screen,mcon);
									switch(choice4)
			                        			{
									case 1:
										gioc=1;
									break;
									case 2:
										gioc=2;
									break;	
									case 3:
										gioc=3;		
									break;
									case 4:
										livello1=0;
									break;	
									case 5:
										livello1=1;
									break;
									case 6:
										livello2=0;
									break;
									case 7:
										livello2=1;
									break;
									case 8:
										SDL_UpdateRect(screen,0,0,0,0);
										puliscischermo(v,screen,sfondo);
										dimscac(screen,v,mcon2);
										esc3=1;
									break;
									case 9:
										livello1=2;		
									break;
									case 10:
										livello1=3;
									break;	
									case 11:
										livello1=4;
									break;
									case 12:
										livello1=5;
									break;
									case 13:
										livello1=6;
									break;
									case 14:
										livello1=7;		
									break;
									case 15:
										livello1=8;
									break;	
									case 16:
										livello1=9;
									break;
									case 17:
										livello2=2;
									break;
									case 18:
										livello2=3;
									break;
									case 19:
										livello2=4;
									break;
									case 20:
										livello2=5;
									break;
									case 21:
										livello2=6;
									break;
									case 22:
										livello2=7;
									break;
									case 23:
										livello2=8;
									break;
									case 24:
										livello2=9;
									break;
									default:
									break;
									}
									choice4=-1;
  									}while (esc3!=1);
								break;
								case 8:
									esc4=1;
								break;
								default:
								break;
							}
						choice5=-1;
					}while(esc4!=1);
					SDL_UpdateRect(screen,0,0,0,0);
					puliscischermo(v,screen,sfondo);
					creamenu(v,screen,menu);
					choice1=6;
					esc=0;
	break;
	case 5:
					
					 
	    				 esc1=1;
					 break;


      }
  SDL_UpdateRect(screen,0,0,0,0);
    }while(esc1==0);



  TTF_CloseFont(font);

  TTF_Quit();
  SDL_Quit();
  return(0);


}

ora mostro le 3 funzioni...quelle rimandano ad altre funzioni...ma il prblema non dovrebbe essere in quelle!



int uomouomo(SDL_Surface *screen,SDL_Rect v,int mossa[][2],int tasti[][3],float *l,int posto[][9],int mg[][3],int *choice2,STORIA st[],int sfondo,int menu[][3],TURNO tu[],int r,int c,int modalita)
{
TTF_Font *medio,*font;
int i;
int colore;
int filetto=0;
int turno=1;
int tempo1,tempo2;
time_t t,t2;
int fg1,fg2;
char punti[50];

/* Initialize the TTF library */
  if(TTF_Init() < 0)
  {
    fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
    SDL_Quit();
  }

   medio = TTF_OpenFont("FreeSans.ttf", MED_PTSIZE);
  if(medio == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }		


  font = TTF_OpenFont("FreeSans.ttf", DEFAULT_PTSIZE);
  if(font == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }		
for (i=0;i<c;i++)
mossa[i][0]=tasti[i][0]+8;
for (i=0;i<r;i++)
mossa[i][1]=v.y+100+(*l*(c-1))-*l/2-i*(*l); //lato in basso della cella	
//*turno=1;
printf("turno %d ",turno);


					do
					{	
	

	
						if (turno%2==0)
						{	
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:giocatore 2",v.x+10,v.h-50,solid);
							tempo1=time(&t);
							colore=SDL_MapRGB(screen->format,212,55,150);
							filetto=giocata(tasti,screen,l,colore,mossa,posto,choice2,turno,st,v,sfondo,menu,r,c,modalita);
							tu[turno].scelta=*choice2;
							GC_DrawText(screen,font,212,55,150,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:giocatore 2",v.x+10,v.h-50,solid);
							if (filetto==2)
						         {
							   GC_DrawText(screen,font,0,0,0,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							   turno--;
							 }
							if ((filetto==1)&&(*choice2<=9)&&(modalita==0))
							 {
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il giocatore 2",v.x+10,v.h-50,solid);
							   turno++;
							 }
							if ((filetto==3)&&(modalita==0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							    turno++;
							  }
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							GC_DrawLine(screen,v.w-310,265+i,v.w,265+i,sfondo);
							
							SDL_UpdateRect(screen,0,0,0,0);
							 
							}
						else if (turno%2!=0)
							{
							
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:giocatore 1",v.x+10,v.h-50,solid);
							tempo1=time(&t);
							colore=SDL_MapRGB(screen->format,212,255,150);
 							filetto=giocata(tasti,screen,l,colore,mossa,posto,choice2,turno,st,v,sfondo,menu,r,c,modalita);
							tu[turno].scelta=*choice2;
							GC_DrawText(screen,font,212,55,150,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:giocatore 1",v.x+10,v.h-50,solid);
							if (filetto==2)
						         {
							   GC_DrawText(screen,font,0,0,0,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							  turno--;
							 }
					
							if ((filetto==1)&&(*choice2<=9)&&(modalita==0))
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il giocatore 1",v.x+10,v.h-50,solid);
							if ((filetto==3)&&(modalita=0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							  }		
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							SDL_UpdateRect(screen,0,0,0,0);
							
							}
						if (*choice2<=9)
							{
							tempo2=time(&t2);
							tempo(screen,v,tempo1,tempo2,(turno-1));
							}
							tempo1=tempo2; 
					}while (filetto!=1);
if (modalita==1)
{
fg1=controlla_vinc(posto,r,c,1);
fg2=controlla_vinc(posto,r,c,2);
printf("fg1 %d\n",fg1);
printf("fg2 %d\n",fg2);
if (fg1==fg2)
	 sprintf(punti,"pareggio %d : %d ",fg1,fg2);
if (fg1>fg2)
	sprintf(punti,"ha vinto il giocatore 1   %d : %d ",fg1,fg2);
if (fg2>fg1)
	sprintf(punti,"ha vinto il giocatore 2   %d : %d ",fg2,fg1);
GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,punti,v.x+10,v.h-50,solid);
}
return(*choice2);
}


int uomopc(SDL_Surface *screen,SDL_Rect v,int mossa[][2],int tasti[][3],float *l,int posto[][9],int mg[][3],int *choice2,STORIA st[],int sfondo,int menu[][3],TURNO tu[],int livello1,int r,int c,int modalita)
{
TTF_Font *medio,*font;
int j;
int colore;
int filetto=0;
int turno=1;
time_t t1;
int a,t;
int ec,eg,max=-100,i;
int u=0,d[10];
int copia[10][9];
int tempo1,tempo2;
time_t t3,t2;
int fg1,fg2;
char punti[50];


for (i=0;i<r;i++)
  for (j=0;j<c;j++)
    copia[i][j]=0;
(void) time(&t1);
srand((unsigned int) t1);


/* Initialize the TTF library */
  if(TTF_Init() < 0)
  {
    fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
    SDL_Quit();
  }

   medio = TTF_OpenFont("FreeSans.ttf", MED_PTSIZE);
  if(medio == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }

  font = TTF_OpenFont("FreeSans.ttf", DEFAULT_PTSIZE);
  if(font == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }		

//celle da riempire con le palline
for (i=0;i<c;i++)
mossa[i][0]=tasti[i][0]+8;
for (i=0;i<r;i++)
mossa[i][1]=v.y+100+(*l*(c-1))-*l/2-i*(*l); //lato in basso della cella






					do
					{	
	

	
						if (turno%2==0)
						{	
							a=2;
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:computer",v.x+10,v.h-50,solid);
							colore=SDL_MapRGB(screen->format,212,55,150);
							for (i=0;i<r;i++)
								for (j=0;j<c;j++)
									copia[i][j]=posto[i][j];
							tempo1=time(&t3);
							SDL_Delay(3*100);
								if (livello1==0)
									j=rand()%7;
								else
								
								 {max=-100;
    								  for (j=0; j<c; j++)
	  								{
	  								i=controllo_riga(copia,j,r);
	  								if (i<r)
	    									{
	    									copia[i][j]=a;
	    									ec=euristica(copia,2,r,c);
	    									eg=euristica(copia,1,r,c);
	    									if ((ec-eg)>max)
	     									   {
	      										for (u=0; u<c; u++)
	        									d=-100;
	      										u=0;
	      										max=ec-eg;
	     									        d=j;	/*nella lista d vengono memorizzate le mosse che sono equivalenti*/
	      										u++;
	      									   }
	    									else if ((ec-eg)==max)
	      									   {
	      										d=j;
	      										u++;
	      									   }
          									copia[i][j]=0;
            									}
          								}
								
      								srand(time(&t1));
      								u=rand()%(u);
      								j=d;
								t=controllo_riga(posto,j,r);
									if (t>r)
									 turno--;
      									
      								}
							
							filetto=disegnapallina(screen,mossa,l,colore,j,posto,&filetto,st,turno,r,c,modalita);
							tu[turno].scelta=*choice2;
							GC_DrawText(screen,font,212,55,150,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:computer",v.x+10,v.h-50,solid);
							if (filetto==2)
						         {
							   GC_DrawText(screen,font,0,0,0,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							   turno--;
							 }
							if ((filetto==1)&&(*choice2<=9)&&(modalita==0))
							 {
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il computer",v.x+10,v.h-50,solid);
							   turno++;
							 }
							if ((filetto==3)&&(modalita==0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							    turno++;
							  }
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							GC_DrawLine(screen,v.w-310,265+i,v.w,265+i,sfondo);
							SDL_UpdateRect(screen,0,0,0,0);
							 
							}
						else if (turno%2!=0)
							{
							
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:giocatore 1",v.x+10,v.h-50,solid);
							tempo1=time(&t3);
							colore=SDL_MapRGB(screen->format,212,255,150);
 							filetto=giocata(tasti,screen,l,colore,mossa,posto,choice2,turno,st,v,sfondo,menu,r,c,modalita);
							tu[turno].scelta=*choice2;
							GC_DrawText(screen,font,212,55,150,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:giocatore 1",v.x+10,v.h-50,solid);
							if (filetto==2)
						         {
							   GC_DrawText(screen,font,0,0,0,0,0,0,0,0,"ATTENZIONE:mossa non valida!",v.x+10,v.h-80,solid);
							  turno--;
							 }
					
							if ((filetto==1)&&(*choice2<=9)&&(modalita==0))
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il giocatore 1",v.x+10,v.h-50,solid);
							if ((filetto==3)&&(modalita=0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							  }		
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							SDL_UpdateRect(screen,0,0,0,0);
							
							}

						if (*choice2<=9)
							{
							tempo2=time(&t2);
							tempo(screen,v,tempo1,tempo2,(turno-1));
							}
							tempo1=tempo2; 
							 
					}while (filetto!=1);
if (modalita==1)
{
fg1=controlla_vinc(posto,r,c,1);
fg2=controlla_vinc(posto,r,c,2);
printf("fg1 %d\n",fg1);
printf("fg2 %d\n",fg2);
if (fg1==fg2)
	 sprintf(punti,"pareggio %d : %d ",fg1,fg2);
if (fg1>fg2)
	sprintf(punti,"ha vinto il giocatore 1   %d : %d ",fg1,fg2);
if (fg2>fg1)
	sprintf(punti,"ha vinto il computer  %d : %d ",fg2,fg1);
GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,punti,v.x+10,v.h-50,solid);
}

return(*choice2);
}

int pcpc(SDL_Surface *screen,SDL_Rect v,int mossa[][2],int tasti[][3],float *l,int posto[][9],int mg[][3],int *choice2,STORIA st[],int sfondo,int menu[][3],TURNO tu[],int livello1,int livello2,int r,int c,int modalita)
{
TTF_Font *medio;
int j;
int colore;
int filetto=0;
int turno=1;
time_t t1;
int a,t;
int ec,eg,max=-100,i;
int u=0,d[10];
int copia[10][9];
int tempo1,tempo2;
time_t t3,t2;
int fg1,fg2;
char punti[50];


for (i=0;i<r;i++)
  for (j=0;j<c;j++)
    copia[i][j]=0;
(void) time(&t1);
srand((unsigned int) t1);


/* Initialize the TTF library */
  if(TTF_Init() < 0)
  {
    fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
    SDL_Quit();
  }

   medio = TTF_OpenFont("FreeSans.ttf", MED_PTSIZE);
  if(medio == NULL)
  {
    fprintf(stderr, "Couldn't load font\n");
  }		

for (i=0;i<c;i++)
mossa[i][0]=tasti[i][0]+8;
for (i=0;i<r;i++)
mossa[i][1]=v.y+100+(*l*(c-1))-*l/2-i*(*l); //lato in basso della cella


					do
					{	
	

	
						if (turno%2==0)
						{	
							*choice2=-1;
							a=2;
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:computer 2",v.x+10,v.h-50,solid);
							colore=SDL_MapRGB(screen->format,212,55,150);
							for (i=0;i<r;i++)
								for (j=0;j<c;j++)
									copia[i][j]=posto[i][j];
							tempo1=time(&t3);
							SDL_Delay(3*100);
								if (livello2==0)
									j=rand()%7;
								else
								
								 {max=-100;
    								  for (j=0; j<c; j++)
	  								{
	  								i=controllo_riga(copia,j,r);
	  								if (i<r)
	    									{
	    									copia[i][j]=a;
	    									ec=euristica(copia,2,r,c);
	    									eg=euristica(copia,1,r,c);
	    									if ((ec-eg)>max)
	     									   {
	      										for (u=0; u<c; u++)
	        									d=-100;
	      										u=0;
	      										max=ec-eg;
	     									        d=j;	/*nella lista d vengono memorizzate le mosse che sono equivalenti*/
	      										u++;
	      									   }
	    									else if ((ec-eg)==max)
	      									   {
	      										d=j;
	      										u++;
	      									   }
          									copia[i][j]=0;
            									}
          								}
      								srand(time(&t1));
      								u=rand()%(u);
      								j=d;
								t=controllo_riga(posto,j,r);
									if (t>r)
									 turno--;
      									
      								}
							
							filetto=scelta(tasti,screen,l,mossa,posto,turno,j,st,v,sfondo,menu,colore,choice2,r,c,modalita);
							tu[turno].scelta=*choice2;
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:computer 2",v.x+10,v.h-50,solid);
						
							if ((filetto==1)&&(*choice2<=9)&&(modalita=0))
							 {
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il computer 2",v.x+10,v.h-50,solid);
							   turno++;
							 }
							if ((filetto==3)&&(modalita==0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							    turno++;
							  }
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							GC_DrawLine(screen,v.w-310,265+i,v.w,265+i,sfondo);
							SDL_UpdateRect(screen,0,0,0,0);
							 
							}
						else if (turno%2!=0)
							{
							
							*choice2=-1;
							a=1;
							GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"turno:computer 1",v.x+10,v.h-50,solid);
							colore=SDL_MapRGB(screen->format,212,255,150);
							tempo1=time(&t3);
							SDL_Delay(3*100);
								if (livello1==0)
									j=rand()%7;
								else
								
								 {max=-100;
    								  for (j=0; j<c; j++)
	  								{
	  								i=controllo_riga(copia,j,r);
									
	  								if (i<r)
	    									{
	    									copia[i][j]=a;
	    									ec=euristica(copia,2,r,c);
	    									eg=euristica(copia,1,r,c);
	    									if ((ec-eg)>max)
	     									   {
	      										for (u=0; u<c; u++)
	        									d=-100;
	      										u=0;
	      										max=ec-eg;
	     									        d=j;	/*nella lista d vengono memorizzate le mosse che sono equivalenti*/
	      										u++;
	      									   }
	    									else if ((ec-eg)==max)
	      									   {
	      										d=j;
	      										u++;
	      									   }
          									copia[i][j]=0;
            									}
          								}
      								srand(time(&t1));
      								u=rand()%(u);
      								j=d;
								t=controllo_riga(posto,j,r);
									if (t>r)
									turno--;
      											
							}
 							
							filetto=scelta(tasti,screen,l,mossa,posto,turno,j,st,v,sfondo,menu,colore,choice2,r,c,modalita);
							tu[turno].scelta=*choice2;
							turno++;
							GC_DrawText(screen,medio,212,55,150,0,0,0,0,0,"turno:computer 1",v.x+10,v.h-50,solid);
					
							if ((filetto==1)&&(*choice2<=9)&&(modalita==0))
							   GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"ha vinto il computer 1",v.x+10,v.h-50,solid);
							if ((filetto==3)&&(modalita==0))
							  {
							    GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,"partita finita in pareggio",v.x+10,v.h-50,solid);
							    filetto=1;
							  }		
							if (filetto==5)
							  turno--;
							for (i=0;i<170;i++)
							GC_DrawLine(screen,v.w-310,265+i,v.w,265+i,sfondo);
							SDL_UpdateRect(screen,0,0,0,0);
							
							}
							if (*choice2<=9)
							{
							tempo2=time(&t2);
							tempo(screen,v,tempo1,tempo2,(turno-1));
							}
							tempo1=tempo2;  
							 
					}while (filetto!=1);
if (modalita==1)
{
fg1=controlla_vinc(posto,r,c,1);
fg2=controlla_vinc(posto,r,c,2);
printf("fg1 %d\n",fg1);
printf("fg2 %d\n",fg2);
if (fg1==fg2)
	 sprintf(punti,"pareggio %d : %d ",fg1,fg2);
if (fg1>fg2)
	sprintf(punti,"ha vinto il computer 1   %d : %d ",fg1,fg2);
if (fg2>fg1)
	sprintf(punti,"ha vinto il computer 2   %d : %d ",fg2,fg1);
GC_DrawText(screen,medio,0,0,0,0,0,0,0,0,punti,v.x+10,v.h-50,solid);
}

return(*choice2);
}

apatriarca
Dovresti usare il tag CODE per inserire il codice. Hai provato a fare un debug? In modo da avere qualche indicazione su dove potrebbe essere l'errore.

DispErata891
no, non ho provato...
però riguardandaci, ho provato ad isolare tutta la parte dei vari switch, e inserendo le variabili (livello1,livello2,modalità) direttamente dentro alle 3 funzioni, funziona.

Quindi credo ci sia un problema nello "switch(choice5)" e "switch(choice 4)" ...
sinceramente io non lo vedo...però non è che me ne intenda così tanto...quindi potrei non accorgermene!

apatriarca
Mi dispiace ma non riesco a capire come potrebbe esserci un errore in quella parte ma devo ammettere che mi sfugge il significato di gran parte del codice. Credo che la chiarezza del codice migliorerebbe se dividessi la funzione main in diverse funzioni. Così com'è è secondo me troppo lunga. Di che gioco si tratta?

DispErata891
beh ora vedo cosa fare!grazie in ogni caso!il gioco è forza 4..

Neptune2
Magari rispondo un pò in ritardo, ma le funzioni, non dovresti prima dichiararle nella testata del codice ? Cosi come sono le utilizzi nel main prima ancora di averle dichiarate (benchè poi si possano definire dove vuoi nel codice) e mi pare ovvio che ti dia errore.

apatriarca
Ma l'errore non era a livello di compilazione ma di esecuzione e quindi non si trattava di quello. E poi non manca solo quello ma anche l'inserimento delle librerie. Quando avevo risposto avevo dato per scontato che quella parte del codice l'aveva semplicemente ignorata durante la copiatura.

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