salut,
je bosse sur IFITE, ou combat tour a tour maker depuis deja 8 mois, et depuis 2 mois je suis completement bloque par des erreurs de segmentation
j´ai resolu celle que j´ai pu trouvé, me suis aide des debugger de dev-c++, code::block et visual c++
mais il en reste une, et peut-etre d´autre, que je n´arrive pas a resoudre
ca fait deja 2 mois, et c´est ptet un truc con
j´ai donc pensé a mettre le code sur un forum de programmation (ici, quand ce sera commenté) et de demander de l´aide (a la fin ce sera opensource), seulement cela represente + de 2500 lignes de code
Est ce que l´un de vous pourrez y jeter un oeil et essayer de voir d´ou peut venir l´erreur svp? je sais que 2500 ligne de code est peut-etre beaucoup (ou peut-etre pas),mais j´ai vraiment besoin d´aide ![]()
les librairie utilisé sont sdl, sdl_image, fmod
en attendant une reponse (positive
ou negatif
) je suis en train de continuer de commenter le code et de le clarifié
pour l´erreur, je sais deja a peu pres quelle variable pose probleme mais je ne vois pas pourquoi
il s´agit de toutes les variables concernant les caracteristique du joueur et de ces adversaires (pv_perso, pm_perso, force_perso, etc.), et c´esr une erreur de segmentation
j´ai essayer de mettre +50 au new pour etre sur d´avoir assez de case, ca n´a rien changé ^^
merci infiniment
++
tu ne donnes pas lien pour le code donc ce n´est pas facil de chercher l´erreur.
La meilleur solution pour ne pas avoir ce genre de probleme est d´écrire des assert dans son code.
Le principe c´est de prendre une condition dont on est sur et de la vérifier
Par exemple quand on passe a une fonction un pointeur que l´on compte lire
assert (p != NULL);
On va dire, c´est sur que p n´est pas nul! C´est justement pour cela que l´on écrit un assert, parceque si c´est nul, on préfère le savoir tout de suite!
Ou encore, tu fais une somme de terme positif, tu vérifie que c´est positif. La encore, on va me dire que c´est évident. C´est justement parceque c´est évident qu´il faut impérativement écrire un assert.
Je vais publier du code d´un jeu que j´ai ecris pour nintendo DS. J´ai pas de débuggeur, je teste directement sur la plateforme. Je n´ai pas eu de problème parceque mon code est défensif partout. et je suis donc informer TOUT DE SUITE des erreurs qui s´y passent.
Sinon, pour les outils. As tu regardé du coté des vérificateurs de mémoire ? genre valgrind sous linux x86 (pas sur que ca marche en x64)
le code arrive, il me reste juste a finir de le commenter (je le ferai ce soir)
je vais me renseigner sur les assert et essayer apres
pour les verificateurs de memoire, il en existe sous windows?
il en existe. Mais je ne sais pas s´il y en a des gratuits...
Purify (payant) est considéré comme une référence dans le domaine.
Si ton code tourne sous linux, je jetterai un oeil dessus ce soir.
http://rapidshare.com/files/16212662/IFITE_v1.0.rar.html
j´ai mis en .rar tout le dossier du jeu, avec les .txt et images necessaire pour le tester
l´erreur apparait d´abord dans lecture_texte() lors de la lecture des 6 dernieres lignes (voir textes.txt dans le dossier donnée), et ensuite dans toute les fonction appellant les variables pv_perso, pm_perso, etc.
ces variables ont un nombre de case egal a id_perso_max, donc au nombre de perso different, et tout les boucles utilisant ces tableaux ne depassent pas id_perso_max, donc je ne vois pas d´ou vient l´erreur
(dsl de l´avoir mis sur rapidshare, mon hebergeur 1&1 ne voulait pas charger
)
si tu as visual C++ d´installé, lance ton programme en appuyant sur F5 (débuggage)
laisse le planter. Une fois planté, tu auras acces au code de débuggage (si c´est un debordement, il te demanderas si tu veux abandonner, il faut faire "ignorer" pour retomber sur le debuggueur)
Tu risques de tomber sur de l´assembleur : pas de panique, une liste déroulante en bas te permettra de dérouler la pile d´appel des fonctions, et de localiser le crash : survole tes variables ou tes structures et selectionne "add watch" pour regarder les données.
ça peut etre un débordement, variables non initialisé, ou cas non attendu.
bref, apprendre a te servir du débuggueur est important !
surtout, si tu fais du SDL : NE LANCE PAS EN PLEIN ECRAN EN MODE DE DEBUGGAGE : lance en fenetré.
je ne suis pas arriver a mettre la main sur une lib fmod qui marche. Je regarderais encore ce soir.
En passant.
le nom du fichier pour les ttf c´est SDL_ttf.h et pas SDL_TTF.h
penses au gens qui ont un systeme de fichier case sensitive! ![]()
Sous Windows, pas de probleme de casse sur les noms de fichiers.
Par contre, c´est vrai qu´il est mieux d´etre rigoureux
Pour FMOD, j´avais fait un tuto il y a longtemps, qui est toujours sur mon site, mais qui ne fonctionne pas avec les versions récentes de FMOD (j´ai reçu des mails me disant que ça marchait pas, mais j´ai jamais corrigé, snif)
En fait, FMOD se compose de 2 "modules", FMUSIC et FSOUND
FSOUND est pour lire un MP3, un WAV ou autres formats, et utilise donc la carte son, telle qu´on l´utilise a 99.9%
FMUSIC utilise les sons MIDI, c´est a dire le synthé interne qu´il y a sur toutes les cartes son, qui est, je pense, voué a disparaitre. les .MID sont de plus en plus "émulés" si j´ose dire.
Quoiqu´il en soit, FMUSIC est obsolete, dans une des versions plus récentes que j´avais vu, seul FSOUND était toujours supporté.
d´accord, donc je vais rectifier pour SDL_TTF
pour fmod j´ai aussi un probleme sous visual c++, mais pas sous dev-c++, donc je vais debugguer sous visual c++ avec le son en commentaire, puis une fois qu´il n´y aura plus d´erreur, je recompilerai sur dev-c++ avec fmod
FSOUND_STREAM est toujours supporté dans les versions recentes de fmod?
j´ai lancé le debugguage sous visual c++, j´ai eu le message d´erreur suivant :
"Des erreurs se sont produites lors de la derniere generation. Voulez vous continuer et executer la derniere generation reussis ?"
si je met non, ca arrette le debuggage, si je met oui, ca me dit qu´il est impossible de lancer ifite.exe car il est introuvable
donc j´ai voulur recompilé pour refaire le .exe et la j´ai des nouvelles erreurs que je n´ai pas sur dev-c++ et c::b
"msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) déjà défini(e) dans LIBCMT.lib(typinfo.obj)
msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) déjà défini(e) dans LIBCMT.lib(typinfo.obj)
msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit déjà défini(e) dans LIBCMT.lib(crt0dat.obj)
..."
et d´autre :
"main.obj : error LNK2001: symbole externe non résolu _IMG_Load
main.obj : error LNK2019: symbole externe non résolu _TTF_Init référencé dans la fonction _SDL_main"
pour les premieres erreur j´ai trouvé comment resoudre le probleme en ignorant la lib, mais dans "projet" je devrais trouver "parametre" mais il n´y est pas, il n´y a que propriete où il n´y a pas l´onglet lien
va dans "projet"/ "settings", onglet C/C++, category "code generation", use run-time library = "Multithreaded DLL"
ça devrait aller mieux.
"Des erreurs se sont produites lors de la derniere generation. Voulez vous continuer et executer la derniere generation reussis ?"
--> ça veut dire : "j´ai pas réussi a compiler, tu veux qu´on débug avec la derniere version qui a compilé ? " --> Répondre non, il faut réussir a compiler avant ![]()
"LINK : fatal error LNK1561: le point d´entrée doit être défini"
j´ai etait dans projet==>propriété ==>editeur de lien ==> avancé et la dans point d´entrée, j´ai tapé main, vu que d´apres ce que j´ai compris des topic qui en parlais, c´ets qu´il ne trouve pas le main
et apres je n´ai plus cette erreur (donc j´imagine que c´est bon), mais j´ai des erreur du genre :
"jeux.obj : error LNK2019: symbole externe non résolu _IMG_Load référencé dans la fonction "void __cdecl lecture_options(void)" (?lecture_options@@YAXXZ)
main.obj : error LNK2001: symbole externe non résolu _IMG_Load"
ca j´ai pas encore trouvé la raison, je cherche encore
Pour le main, il se peut (SDL est comme ça) qu´il attende une forme particuliere.
Pour SDL :
int main(int argc,char** argv)
(ne cherche pas a utiliser argv et argv si tu n´es pas familier avec ça, prototype juste ton main comme ça.
Ensuite, le message d´erreur que tu mets dit que dans jeux.obj (donc dans jeux.cpp ou jeux.c en non compilé), tu as une fonction qui s´appelle "lecture_option" qui appelle une autre fonction _IMG_Load, cette fonction a été prototypée dans un include, mais par contre, il ne trouve pas le corps de cette fonction.
C´est toi qui a fait _IMG_Load ? Si c´est le cas, elle n´est pas compilée dans ton projet, si ce n´est pas le cas, elle doit etre dans une lib : il faut que tu linkes une lib.
est ce que tu as bien linker avec SDL et SDLmain ? car il dit qu´il ne trouve pas de point d´entré, hors celui-ci se trouve dans SDLmain.
j´ai bien linker sdl et sdlmain, mais j´avais oublier de linker sdl_ttf et sdl_image
pour le point d´entrée, depuis que je mis "main" dans proprieté du projet, je n´ai plus eu ce message
maintenant j´ai :
"jeux.obj : warning LNK4210: la section .CRT existe ; il se peut qu´il y ait des terminateurs ou des initialiseurs static non gérés
MSVCRT.lib(cpu_disp.obj) : warning LNK4210: la section .CRT existe ; il se peut qu´il y ait des terminateurs ou des initialiseurs static non gérés
Incorporation du manifeste en cours..."
je suis en train de regarder la doc officiel de visual c++, y´a plusieur cas, faut que je trouve le bon
j´espere que je ne vais pas avoir tout les warning LNK... les uns apres les autres ![]()
si c´est que des warning, c´est pas très grave. La SDL est l´une des bibliothèque les plus crade que je connaisse, ça ne m´étonnerait pas beaucoup que ces warnings fassent partie du fonctionnement _normal_ de la lib.
le probleme c´est qu´il s´agit des seuls erreur de compilation que j´obtient
impossible de finir la compilation a cause de ces warnings ![]()
normalement un warning n´empêche pas la compilation. Tu es sûr qu´il n´y a pas une erreur quelque part un peu plus haut dans le log et que tu ne l´a pas vu ?
en fait je viens de m´apercevoir qu´il crée bien un .exe mais dans le dossier debug
par contre lorsque que je veux executer ou debugguer ce .exe ca me dit :
"le point d´entrée de procedure SDL_strlcpy est introuvable dans la biblitotheque de liaisons dynamique SDL.dll."
j´ai l´impression d´avancé a reculons, a chaque fois une nouvelle erreur ![]()
est ce que tu utilise bien la même version de la SDL pour compiler ton projet (les fichiers .lib) que celle qui est installé sur ton système. Par exemple, est-ce qu´il n´y a pas des vieux fichirs SDL.dll qui trainerait dans ton dossier windows ou windows/system ou windows/system32 (ou n´impoete où ailleurs dans ton PATH) ?
Si c´est le cas, supprimer les et remplace les par les dernières versions de la lib, tout comme les fichier .lib qui doivent être quelque part dans le dossier lib de ton compilo.
D´autre part, pour éviter ce genre e problème, si tu as mis le fichier SDL.dll dans le dossier de ton projet, supprime le car ce n´est pas une place correcte (ne serait-ce que parce que tes programmes sont démarré par l´IDE de ce dossier, mais ce n´est pas le dossier dans lequel il se trouve).