CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C/SDL] Mal parti...

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:13:08

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

godrik
godrik
Niveau 30
08 juin 2005 à 16:18:20

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?

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:23:51

Windows XP Home SP1 5.1
Linux Kernel 2.6.8 ( jcrois, pas sur pour le . 8)
SDL 1.2.8

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:24:23

J´oubliais :
http://rafb.net/paste/results/yNEOAa20.html

godrik
godrik
Niveau 30
08 juin 2005 à 16:27:21

donne TOUT le code
et indente le aussi

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:28:52

600 lignes ?
Trop long...

Dsl , j´ai copié/collé à partir du forum...

godrik
godrik
Niveau 30
08 juin 2005 à 16:32:08

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 ?

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:35:26

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 ; )

godrik
godrik
Niveau 30
08 juin 2005 à 16:36:07

heu, j´ai quand meme besoin de tout le code...

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:36:56

Je paste le tout...

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 16:47:01

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

godrik
godrik
Niveau 30
08 juin 2005 à 16:57:22

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)

godrik
godrik
Niveau 30
08 juin 2005 à 17:09:01

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

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 17:09:23

les définitions sont dans main.h, autant pour les string que les structures...

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 17:11:59

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

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 17:13:58

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

lag-it
lag-it
Niveau 10
08 juin 2005 à 17:16:28

" 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é)

godrik
godrik
Niveau 30
08 juin 2005 à 17:18:33

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

  1. define POS_PREMIER_OPTION 341

et tu remplace dans ta ligne, ca sera beaucoup plus clair et tu risquera moins d´erreur

godrik
godrik
Niveau 30
08 juin 2005 à 17:22:52

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.

Vengeur41
Vengeur41
Niveau 10
08 juin 2005 à 20:19:17

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 !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware