Salut,
Je suis sur un nouveau projet de jeu de réflexion mais j´ai un problème ( plusieurs ? ).
Tout d´abord je vous préviens d´avance, j´ai l´impression que ca merde complètement car des fois je tapais mon code, ca plantait, alors je remplacait, je remplacait et puis je mets un synonyme et ca passe...
Voila comment je suis arrivé au code suivant pour que l´utilisateur entre son nom :
------
char* getCharEvent()
{
SDL_Event e;
char* returnvalue="_";
if ( SDL_PollEvent(&))
{
switch(e.type)
{
case SDL_QUIT:
bQuit=true;
break;
case SDL_KEYDOWN:
if ( e.key.keysym.sym>=SDLK_a && e.key.keysym.sym<=SDLK_z)
returnvalue = SDL_GetKeyName(e.key.keysym.sym);
else if ( e.key.keysym.sym==SDLK_SPACE)
returnvalue = " " ;
else if ( e.key.keysym.sym==SDLK_MINUS)
returnvalue = " -";
else returnvalue="_";
break;
}
}
return returnvalue;
}
void startgame()
{
typedef char* string;
char tableaucarac[11];
string chaine;
. ..
for ( i=0;i<11;i++)
tableaucarac[i]=´_´;
while ( !bQuit && gamescreen==NEWGAME && newgamestate==0)
{
tableaucarac[11]=´\0´;
SDL_FillRect(Screen,NULL,0);
dialogbox(false,true,NULL,"Quel est ton nom ? ");
sprintf(chaine,"%s",tableaucarac);
vTexte(tableaucarac,200,200,"font.ttf",30,255,255,
255);
vTexte("Tapez votre nom au clavier",50,300,"font.ttf",25,255,100,0);
vTexte("Attention au QWERTY < => AZERTY Pour certains claviers",50,330,"font.ttf",18,255,0,0);
recept = getCharEvent();
if ( indice==0)recept=(string)strupr(recept);
else recept=(string)strlwr(recept);
sscanf(recept,"%c",&);
if ( charg!=´_´)
{
if ( indice<11)
tableaucarac[indice]=charg;
if ( indice<11)indice++;
}
keystate = SDL_GetKeyState(NULL);
if ( keystate[SDLK_BACKSPACE])
{
if ( indice>0)indice--;
tableaucarac[indice]=´_´;
SDL_Delay(50);
}
if ( keystate[SDLK_RETURN])
newgamestate++;
SDL_Flip(Screen);
sync_fps(350);
}
}
if ( bQuit)quit();
else startgame();
}
----
Et là il rame comme pas 2, et au bout de quelques minutes, l´ordi plante ( pas assez de mémoire, alors que j´viens d´en rajouter ( jsuis à 512 mo)).
Autre détail pas amusant du tout, voici ma fonction quit :
void quit()
{
SDL_FreeSurface(menuprincipal);
SDL_FreeSurface(cursor);
SDL_FreeSurface(Screen);
}
Sous linux, pas de problèmes. Sous Windows, y´a le rapport d´erreurs Microsoft qui se lance...
Je rajoute la ligne SDL_Quit() à la fin de la fonction : sous les 2 os, Segmentation Fault...
Compilé avec :
Mingw ( Windows), GCC 3.4 ( Linux)...
Voilà, si vous pouviez m´aider à résoudre ces problèmes, ce serait très sympa, merci d´avance à tous !
++
Vengeur
met le code < strong>complet</strong> sur un wall, parceque la on le lit rien.
http://rafb.net/paste/
Sinon, quel version de windows ? de SDL?
Windows XP Home SP1 5.1
Linux Kernel 2.6.8 ( jcrois, pas sur pour le . 8)
SDL 1.2.8
J´oubliais :
http://rafb.net/paste/results/yNEOAa20.html
donne TOUT le code
et indente le aussi
600 lignes ?
Trop long...
Dsl , j´ai copié/collé à partir du forum...
Ce genre de bug ne vient pas de la ou on pense qu´il vient.
Je supose qu´il y a un depassement de tableau dans un coin.
Quel type d´erreur windows est ce ? une erreur noyal ( et oui, un noyal, des noyaux
) se manifestant pas un ecran bleu/redemarrage, ou est ce juste une alerte du systeme ?
Euh, ben c´est une erreur sans plantage :
Il me fait un rapport d´erreur et il me demande s´il veut que je l´envoie chez Microsoft... et la vie reprend son cours ; )
heu, j´ai quand meme besoin de tout le code...
Je paste le tout...
game_engine.c : http://rafb.net/paste/results/GaGHqT19.html
utilandinit.c :
http://rafb.net/paste/results/0IGPzV51.html
general.c ( vide pour l´instant):
http://rafb.net/paste/results/rexcrl90.html
gui.c :
http://rafb.net/paste/results/nOU0p222.html
main.c :
http://rafb.net/paste/results/UiFNtr97.html
main.h :
http://rafb.net/paste/results/k4qGFn60.html
http://rafb.net/paste/results/0IGPzV51.html
( je le donne si d´autre veulent aider)
alors, tu imagines bien que je n´ai pas la solution, je vais juste faire des commentaires.
Il n´y a toujorus pas tout le code.
l147: returnsurface = IMG_Load(filename);
apriori, cte bete la ca peut renvoyer NULL
tu dois gerer l´erreur
l76 a 80 je n´ai pas la definition de nomelements
deplus strdup fait une copie de la chaine de caractere en la malloquant, il te faut donc liberer cette memoire a la fin de ton programme ( a l´aide d´un free)
l4: bool bQuit;
ce booleen semble ne pas etre initialise
l16/18: les save ne sont pas active est-ce normal ?
l42: SDL_Delay(3000);
tu le fait attendre pour le plaisir ?
toujours dans la fonciton de chargement, verifie que tes structures sont cohérente.
( on peut avoir la definition de GAMESTRUCT ? )
l101/103
fp = fopen("data/cmodel.gdt","r");
fscanf(fp, " %d " ,&);
models = calloc(nombremodels, sizeof(CARDMODEL));
verifie l´ouverture de ton fichier et que le calloc a fonctionné correctemet
l110: models[i].nom = ( string)strdup(tmp);
comme au dessus
c´est quoi string ? on peut avoir la definition?
tu fais des sprintf vers cte bete la, ut es sur de ne pas faire des buffer overflow ?
l131 SDL_Flip(Screen);
je n´ai pas vu l´initialisation de SDL, tu es bien activé le DBuffering ?
dans vTexte
tu devrais peut etre garder les font en memoire...
J´ai pas grand chose de plus a dire.
sauf fait attention a tes strdup, penses a les libéré.
et verifie bien les codes de retour de tes fonctions ( surtout quand c´est succeptible de plater comme une lecture de fichier ou une allocation memoriel)
http://rafb.net/paste/results/0IGPzV51.html
tst c´est uns tring
et au vu de main.h c´est un char*
et la tu fais un sprintf dans un truc pas alloue, donc ca delire c´est normal
de la meme facon l109
http://rafb.net/paste/results/GaGHqT19.html
l19 blitSurface(cursor, 230, 341+optionmenuprincip*41);
c´est quoi ces magic numbers, detaille
oula, startgame c´est recursif en plus
ca m´etonne pas que ca delire ton truc...
tu as des allocs montrueuse partout ( strdup) et tu recursive en plus
http://rafb.net/paste/results/nOU0p222.html
l5(pas de jeu de mot) tu ne libere pas ca
j´arrete la, libere ta memoire quand tu fait de l´alloc dynamique
les définitions sont dans main.h, autant pour les string que les structures...
C´est récursif mais bon, j´ai tjrs fait comme ca...
Je vais m´occuper de ca alors... je te dirai si ca va mieux...
c´est un truc pour afficher le curseur en fonction de sa position ( 0, 1 ou 2)... Il fait 41x41 pixels et la première option est position y = 341...
" http://rafb.net/paste/results/GaGHqT19.html
l19 blitSurface(cursor, 230, 341+optionmenuprincip*41);
c´est quoi ces magic numbers, detaille"
C´est pas forcément parce que c´est récursif que c´est mauvais... dans ce cas là je n´ai pas regardé, mais dans certains cas, une bonne récursivitée terminale vaut toutes les versions itératives du monde... ( point de vue cout/complexité)
Ce n´etait pas une vraie question.
c´etait plus un effet de manche destiné a te faire comprendre que c´est pas clair.
et que du code pas clair, c´est du code qui marche pas ( ptet qu´il peut marcher masi bon, c´est mauvais signe).
Comment faut faire pour bien faire:
utiliser des #define par exemple, qui te permette de faire
et tu remplace dans ta ligne, ca sera beaucoup plus clair et tu risquera moins d´erreur
lag-it: en terme de complexité c´est pareil.
et :"une bonne récursivitée terminale vaut toutes les versions itératives du monde... ( point de vue cout/complexité)"
point de vue cout, je vote bluff sur le chi², si tu as une recursivité terminale, ca veut dire que tu as une équivalence directe en iteratif.
ton itératif fera moins d´appel de fonction ( ca ca coute cher)
deplus, une suite d´appel de fonciton va generer beaucoup d´empilement donc va decaler ton execution pointeur, ce qui risque de provoquer des defaults de caches donc encore une perte de temps.
la recursivite terminale ne va JAMAIS plus vite que de l´itératif.
apres, il y a des cas ou on est pas en recursivité terminale ou le cout vers une recursivite terminale est cher ( ou ce n´est pas possible)
et la oui, je suis d´accord, le recursif c´est mieux.
apres, etant donné l´état du code en question, il est evident qu´il a choisit la facilite sans se poser de question.
J´ai fait tout ce que tu as dit mais pas moyen...
L´écran d´entrée de nom bouffe de la mémoire, c´est incroyable, tout à l´heure mon pc a planté ( en moins d´1/4 d´heure)...
Alors voilà, si quelqu´un aurait des idées d´optimisations ( j´en ai mais c´est bourrin), ce serait super sympa ! Et si quelqu´un sait comment régler ce problème de quit ! Merci !