PDA

View Full Version : [c++] Non trovo l'errore


-Ivan-
15-02-2005, 18:06
Sono alcuni giorni che tento di far funzionare questo programma ma non riesco proprio a capire quale possa essere il problema.
Tutto funziona ma dopo aver fatto le prime istruzioni si blocca e sono costretto a riavviare il pc perchè i tasti non funzionano più.
Riporto solo la parte di codice strettamente legata all'errore, tutte le funzioni usate sono corrette al di fuori dell'IA dove sembra che il programma si blocchi come se non riuscisse ad uscire da un ciclo, anche i comandi disegna sono parte di un motore grafico e fuinzionano bene.
Quello che non capisco è come faccia a crearsi un errore dopo aver chiamato la funzione IA (se non la chiamo il programma funziona) che non fa altro che fare calcoli matematici che al massimo potrebbero generare risultati non corretti e disegnare una immagine in un punto sbagliato dello schermo.


[...]


//questa funzione è contenuta in un while che viene ripetuto //all'infinito fino alla pressione di esc

void gestione_eventi(){

disegna(sfondo, 0, 0);
disegna(scacchiera, 100, 100);
conquiste_giocatore();
disegna(giocatore, coord_xg, coord_yg, 40, 40, 0, 0);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);
scegli_mossa();
if(turno==0)
{
if (i==0)
{
imput_tastiera();
}
fine_turno(); //imposta turno=1
}
if(turno==1)
{
turno=0;
IA();
}
}

[...]

////////////////////////////////////////////////////////////////////////////////
////////////////////////*INTELLIGENZAARTIFICIALE*///////////////////
void IA()
{
//Fase I INTELLIGENZA ARTIFICIALE
//Calcolo qual'è la casella più vicina da conquistare per il pc
for(k=1;k<11;k++)
{
dc[k]=caselle_da_conquistare[k]/10;
uc[k]=caselle_da_conquistare[k]-(dc[k]*10);
}
dp=pos/10;
up=pos-(dp*10);

//ciclo per il riempimento del vettore distanza
for(k=1;k<11;k++)
{
if(dc[k]>=dp){distanza[k]=dc[k]-dp;}
else
{distanza[k]=dp-dc[k];}
if(uc[k]>=up){distanza[k]=distanza[k]+(uc[k]-up);}
else
{distanza[k]=distanza[k]+(dp-dc[k]);}
}
//Ora ho 2 vettori di uguale dimensione, uno con tutte le caselle da conquistare
//ed uno con le distanze dalla posizione attuale

minimo=distanza[1];
obiettivo=1;
for(k=1;k<11;k++)
{
if(distanza[k]<minimo){obiettivo=k;minimo=distanza[k];}
}
//Obiettivo adesso contiene l'indice della casella che il pc
//deve tentare di conquistare al momento

// CICLI DI CONTROLLO IA
if(dc[obiettivo]<dp)
{
coord_yp=coord_yp-60;
}
if(dc[obiettivo]>dp)
{
coord_yp=coord_yp+60;
}
if(uc[obiettivo]<up)
{
coord_xp=coord_xp-60;
}
if(uc[obiettivo]>up)
{
coord_xp=coord_xp+60;
}
Sleep(150);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);


}

Fenomeno85
15-02-2005, 18:20
1) codice non indentato
2) non ti sembra un pò impossibile se non è un errore sintattico capire l'errore basandosi su un pezzo di un programma che non si sa neppure che fa?

~§~ Sempre E Solo Lei ~§~

-Ivan-
15-02-2005, 18:26
Il codice non è indentato perchè l'ho copiato male.
L'errore secondo le prove che ho fatto dovrebbe essere in una condizione dei cicli nella funzione IA quindi non serve sapere cosa fa il programma.
Vi chiedo solo di dare un'occhiata alle condizioni perchè magari ci può essere un errore banale che mi sfugge in una delle condizioni.
Dalle ultime prove che ho fatto sembra bloccarsi in uno dei 2 cicli for dell'IA.

Fenomeno85
15-02-2005, 18:30
ok indenta sto codice e poi ne parliamo

~§~ Sempre E Solo Lei ~§~

-Ivan-
15-02-2005, 19:46
Non mi viene indentato qua non so perchè, quando clicco su modifica per andare a modificarlo lo vedo indentato ma qua no.
Mi sa che è perchè è indentato con i tab.

anx721
15-02-2005, 21:15
devi racchiudere il codice tra i tag CODE e /CODE chiusi tra parentesi quadri affinche resti l'indentazione

Corponi
16-02-2005, 00:07
ti posso chiedere che gioco è che stai tentando di realizzare?
magari quando hai finito me lo passi :D

hai provato con un buon debugger? dovresti riuscire ad eseguire un passo alla volta la procedura fino a vedere il punto nel quale il cidlo si blocca no? Un bel breakpoint al primo ciclo e testi, se funziona passi a quello successivo...

La mia è solo un' idea eh, non vorrei dare l'idea di saperla lunga. Piu che altro vorrei imparare qualcosa, sono un po' gnubbo in materia.

-Ivan-
16-02-2005, 18:23
Sto tentando di fare un gioco su una scacchiera in cui bisogna conquistare alcune caselle, è il mio progetto che presenterò all'esame di stato.
Con il debug sono riuscito a capire che si blocca nei for, anche se non ho capito se il primo o il secondo, adesso cerco di capire quale è dei 2, la cosa che mi sembra strana è che non in quei 2 cicli non viene fatto niente che potrebbe bloccare in modo così drastico il programma in quanto le variabili usate in quella parte di programma non vengono usate da nessuna altra parte e non faccio altro che fare un paio di operazioni matematiche che nel peggiore dei casi mi dovrebbero solo dare risultati sbagliati.

ps: se vuoi potrai farmi da beta tester:D

anx721
16-02-2005, 18:34
Originariamente inviato da -Ivan-
Sto tentando di fare un gioco su una scacchiera in cui bisogna conquistare alcune caselle, è il mio progetto che presenterò all'esame di stato.



esame di stato per cosa?

-Ivan-
16-02-2005, 18:37
Originariamente inviato da anx721
esame di stato per cosa?

ITIS specializzazione informatica.

-Ivan-
16-02-2005, 18:45
Come posso vedere le variabili cosa contengono in modalità grafica?
Il debug del dev c++ non mi sta aiutando granchè.
Come posso fare il corrispettivo del cout o della printf in ambiente grafico?

Corponi
16-02-2005, 19:07
io all'esame peril liceo l'anno scorso, volevo portare un programma di simulazione di vita artificiale...

poi mi han tolto informatica dalla commissione :cry:
non me ne son fatto + nulla. sigh! Erano altri 5 punti sicuri all'orale.

adesso faccio informatica pura all'uni e mi sto stracciando le palle a sentire gente che mi spiega cose che gia so...
almeno adesso invece di farle in pascal le faccio in c++ :rolleyes:

se mi passi tutta la roba potrei provare a darci un occhiata perche così l'errore non son riuscito a trovarlo.
Che compilatore usi?

-Ivan-
16-02-2005, 19:26
Originariamente inviato da Corponi
io all'esame peril liceo l'anno scorso, volevo portare un programma di simulazione di vita artificiale...

poi mi han tolto informatica dalla commissione :cry:
non me ne son fatto + nulla. sigh! Erano altri 5 punti sicuri all'orale.

adesso faccio informatica pura all'uni e mi sto stracciando le palle a sentire gente che mi spiega cose che gia so...
almeno adesso invece di farle in pascal le faccio in c++ :rolleyes:

se mi passi tutta la roba potrei provare a darci un occhiata perche così l'errore non son riuscito a trovarlo.
Che compilatore usi?


Beato te, se io mi straccerò le palle all'università, cosa che dubito inizierò immediatamente a fare un po' di grafica 3d.
Oggi stavo per comprare un manualone su 3d studio max, avevo già iniziato a fare qualcosa ma ora per mancanza di tempo ho dovuto smettere.

per il programma uso il dev c++ ma con l'aggiunta di alcune librerie prese da un sito di programmazione di giochi che uso come motore grafico.
Se ti va di provarlo fammi un fischio da msg [email protected]).
Ho individuato la parte di codice che da problemi, è il secondo ciclo for della funzione IA.
L'ho riscritta senza else ma fa uguale.
Che stress non ne posso più, non vedo possibili errori logici.