Pages : 1
#1 Le 10/02/2008, à 17:56
- berthel
[résolu] Segment fault => SDL_ttf
salut a tous
alors bon voila mon problème c'est que dès que je fait appelle dans un programme a la librairie SDL_ttf le programme se lance et se ferme aussi tà´t :
et la console ( je suis sous Kubuntu ) m'affiche segment fault ( core dumped ) j'ai tester dans plusieurs programme et même le plus basique comme celui ci :
1.
#include <stdlib.h>
2.
#include <stdio.h>
3.
#include <SDL/SDL.h>
4.
#include <SDL/SDL_image.h>
5.
#include <SDL/SDL_ttf.h>
6.
7.
int main(int argc, char *argv[])
8.
{
9.
SDL_Surface *ecran = NULL, *texte = NULL;
10.
SDL_Rect position;
11.
SDL_Event event;
12.
TTF_Font *police = NULL;
13.
SDL_Color couleurNoire = {0, 0, 0};
14.
int continuer = 1;
15.
16.
17.
SDL_Init(SDL_INIT_VIDEO);
18.
TTF_Init();
19.
20.
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
21.
SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);
22.
23.
/* Chargement de la police */
24.
police = TTF_OpenFont("angelina.ttf", 65);
25.
if ( police == NULL)
26.
printf("ereur de chargement de la police /n");
27.
/* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
28.
texte = TTF_RenderText_Solid(police, "Salut les Zér0s !", couleurNoire);
29.
30.
while (continuer)
31.
{
32.
SDL_WaitEvent(&event);
33.
switch(event.type)
34.
{
35.
case SDL_QUIT:
36.
continuer = 0;
37.
break;
38.
}
39.
40.
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
41.
42.
position.x = 60;
43.
position.y = 370;
44.
SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
45.
SDL_Flip(ecran);
46.
}
47.
48.
TTF_CloseFont(police);
49.
TTF_Quit();
50.
51.
SDL_FreeSurface(texte);
52.
SDL_Quit();
53.
54.
55.
return EXIT_SUCCESS;
56.
}
donc là je bloque un peu surtout que tout est ok (je pense ) niveau installation et linker .....
merci de votre aide
Dernière modification par berthel (Le 11/02/2008, à 23:06)
Hors ligne
#2 Le 10/02/2008, à 18:04
- compte supprimé
Re : [résolu] Segment fault => SDL_ttf
slt Berthel
estce que tu as dejà essayé de compiler un autre code SDL sur ton Kubuntu?
#3 Le 10/02/2008, à 18:27
- berthel
Re : [résolu] Segment fault => SDL_ttf
je faisait un jeu en SDL et j'ai voulut ajouter SDL-ttf ==> la console ma afficher segment fault alors j'ai reprit le programme de base de SDL-ttf pour voir d'o๠venait le problème , et en effet le problème venait bien de la librairie SDL-ttf
Hors ligne
#4 Le 10/02/2008, à 18:48
- Kraid
Re : [résolu] Segment fault => SDL_ttf
le probleme vient de la lib freetype ( utilisée par SDL_ttf) , il ya un bug qui provoque une seg fault si il y a des espaces dans la chaine de caractères. Fait une recherche sur le net pour savoir quelle version utiliser. C'est assez courant comme problème. Ou alors, essaie les chained sans espaces
Hors ligne
#5 Le 10/02/2008, à 19:14
- berthel
Re : [résolu] Segment fault => SDL_ttf
oki je me renseigne
merci de ton aide
Hors ligne
#6 Le 10/02/2008, à 19:45
- berthel
Re : [résolu] Segment fault => SDL_ttf
je vient de voir une note dans adept manager qui dit
Note: FreeType 1 (libttf soname 2, Debian package libttf2) is obsolete. FreeType 2 (libfreetype soname 6, Debian packages libfreetype6 and libfreetype6-dev) has arrived. The FreeType 2 API is a lot simpler than the one in 1.x while being much more powerful. We thus encourage you to adapt your source code to it as this should not involve much work.
en gros il encourage a passer sous freetype 2 est ce mieux ?
sinon je vais devoir passer a freetype1 pour utiliser SDL_ttf ...
lequel est plus rapide et aléger pour le procésseur ?
en tout ca merci de m'éclairer
Hors ligne
#7 Le 10/02/2008, à 21:14
- Kraid
Re : [résolu] Segment fault => SDL_ttf
un petit tour sur la page de sdl_ttf:
http://www.libsdl.org/projects/SDL_ttf/
on apprend:
Requires:
The latest stable release of SDL 1.2, FreeType 2.0 or newer (except FreeType 2.1.3)
donc fatalement, tu passes a la plus récente version possible de freetype ( 2.3.5 il me semble)
pour alléger le processeur? t'es limite niveau puissance?
je ne pense pas qu'il doit avoir beaucoup de différence entre les deux
Hors ligne
#8 Le 10/02/2008, à 21:24
- berthel
Re : [résolu] Segment fault => SDL_ttf
bah heu niveau processeur heu je suis pas limite a se point mais bon pour des optimisation de code sa peu toujours être utile , lol
sinon bah y a toujours un segment fault même sans mettre d'espace dans le texte a afficher ...
et s'il faut la dernière version de freetype c'est bon alors d'o๠vient le problème?
j'ai peut être une mauvaise version de SDL-ttf j'intalle celle du site officiel pas celle de adept manager .....
je teste et si c'est sa a mort adept
Hors ligne
#9 Le 11/02/2008, à 08:17
- Kraid
Re : [résolu] Segment fault => SDL_ttf
sinon bah y a toujours un segment fault même sans mettre d'espace dans le texte a afficher ...
Vraiment? ca devient critique comme problème
je vais essayer ce code chez moi, parce que là ca m'inquiète
Hors ligne
#10 Le 11/02/2008, à 18:29
- _SamSoft_
Re : [résolu] Segment fault => SDL_ttf
Etant donné que je développe en C et avec la SDL un simulateur de vie, j'ai crée une fonction qui automatise l'affichage de texte. Un gars sur le net l'utilise déjà, ce fera 3
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
int writeTxt(SDL_Surface* screen, char *message, signed int x, signed int y, int size, SDL_Color color)
{
int rslt = 0;
if(message != NULL)
{
TTF_Font *myFont = NULL;
SDL_Surface* txt = NULL;
SDL_Rect position;
myFont = TTF_OpenFont("fonts/tempest.ttf", size);
if(myFont == NULL)
{
rslt = 1;
}
else
{
txt = TTF_RenderText_Blended(myFont, message, color);
position.x = x;
position.y = y;
SDL_BlitSurface(txt, NULL, screen, &position);
}
TTF_CloseFont(myFont);
SDL_FreeSurface(txt);
}
else
{
rslt = 1;
}
return rslt;
}
output.c et dans output.h:
#ifndef OUTPUT_H_
#define OUTPUT_H_
void writeTxt(SDL_Surface* screen, char *message, signed int x, int y, signed int size, SDL_Color color);
#endif /* OUTPUT_H_ */
Pensez à initialiser la SDL -> SDL_ttf -> afficher le texte -> liberer la surface -> fermer SDL_ttf -> fermer SDL -> retourner quelque chose -> be happy (Si tout est bon mea culpa, j'ai pas lu tout le code)
Sinon, moi j'utilise des espaces dans mes chaines de caractères et AUCUN problème.
Dernière modification par _SamSoft_ (Le 11/02/2008, à 18:35)
if(!physics)
/* nothing */
else
/* everything */
Hors ligne
#11 Le 11/02/2008, à 21:39
- berthel
Re : [résolu] Segment fault => SDL_ttf
merci _SamSoft_ pour ton code , sa peut toujour etre utile si SDL_ttf marche un jour chez moi , lol
sauf qu'il est encore perfectible (je chipote un peu la ), sa serai pas cool de rajouter un paramétre qui indiquerai le lieu de la police a utiliser ..... sa pourrait être utile pour automatiser encore plus ou pas si on utilise toujours la même police dans tout son programme ..... a voir ....
et tu utilise toujours blended et pourquoi pas solid ou autre ? un autre paramètre ? , lol sa risque de faire une longue liste de paramètre ...
a tu installer quelque chose de spécial pour que cela marche ?
la tu installer depuis les dépôts ou le site officiel ?
et oui même sans espaces sa marche pas , je vais essayer sans majuscule , on sait jamais . et j'essaye se soir (si j'ai le temps) de l'installer depuis le site officiel ...
EDIT :
petite découverte , si j'enlève ceci de mon code :
texte = TTF_RenderText_Solid(police, "hdthd", couleurNoire);
alors cela m'affiche "erreur de chargement de la police " .....
ce qui signifie que j'ai 2 problèmes non ?
==> un avec TTF_renderText_solid
==>l'autre avec TTF_openfont ? ( jai bien vérifier que le fichier .ttf était bien là)
Dernière modification par berthel (Le 11/02/2008, à 22:08)
Hors ligne
#12 Le 11/02/2008, à 22:52
- Kraid
Re : [résolu] Segment fault => SDL_ttf
c'est peut-être bien le même
si t'as police n'est pas ouverte alors TTF_RenderText_Solid plante
donc apparemment, ton programme plante sur l'appel de cette fonction avant que l'erreur s'affiche dans le terminal ( le buffer n'est pas "flushé" ( hmm terme technique?) tout de suite)
essaie soit d'ouvrir une autre police, soit de reduire la taille. as tu verifié a tout hasard si la casse est bonne dans le nom du fichier ( majuscules et minuscules identiques) ?
Hors ligne
#13 Le 11/02/2008, à 23:06
- berthel
Re : [résolu] Segment fault => SDL_ttf
ARf c'était juste sa ......... snif
aussi simple que sa , c'était juste la police qui est bugé ou je ne sait quoi car une autre police et tout de suite , sa marche ......
merci pour votre aides , merci beaucoup .......
ps : tu veut pas plutôt dire "flashé" ? flushé , je ne connais pas et la police est chargée dans le buffer du processeur , pas dans la mémoire vive ?
encore merci
Hors ligne
#14 Le 12/02/2008, à 11:33
- Kraid
Re : [résolu] Segment fault => SDL_ttf
et moi qui pensait qu'on était parti pour réécrire entièrement la SDL_ttf, je suis déçu
tu t'es fait prendre une fois, ca t'arrivera plus
et si t'as encore un problème n'hésite pas
ps: "flushé" comme faire un fflush() ou un cout.flush(), c'est demander au système de vider un buffer de caractère comme celui de la sortie standard et de les afficher. Comme tu le sais sans doute, un printf n'est pas toujours instantané. Mais je ne connais pas la traduction française:rolleyes:
Hors ligne
#15 Le 12/02/2008, à 13:19
- _SamSoft_
Re : [résolu] Segment fault => SDL_ttf
En C moi après chaque appel de fprintf(stdout, "mon texte"); (je préfère fprintf(stdout, "x"); depuis que j'ai vu les programmeurs de chez Pixar le faire ) je fais un :
fflush(stdout); En gros vider le buffer sortie !
Vérifie le path de ton ttf (j'ai pas compris, ton problème est résolu ? ) Je prend note et j'ajouterai en paramètre le path du ttf et je vais mieux gérer les erreurs (renvoyer une valeur quoi)
Bonne prog à tous (toutes) !
if(!physics)
/* nothing */
else
/* everything */
Hors ligne
#16 Le 12/02/2008, à 13:53
- Kraid
Re : [résolu] Segment fault => SDL_ttf
je ne sais pas si ta fonction d'affichage est très adéquate, elle ouvre en effet la police a chaque fois, ce qui n'est pas nécessaire, passe plutot en paramètre la TTF_Font déja ouverte au préalable. Ta fonction n'a pas vocation non plus à vérifier tous les paramètres.
et puis la différence entre un printf et un fprintf( stdout) ...
Hors ligne
#17 Le 14/02/2008, à 12:45
- _SamSoft_
Re : [résolu] Segment fault => SDL_ttf
Je prend note concernant le paramètre "font".
En effet, il n'y a pas de grandes différences m'enfin pour moi, c'est mieux de faire fprintf(stdout, "x"); au moins on est pas perdu quand on nous dis de tout mettre en sortie stderr
if(!physics)
/* nothing */
else
/* everything */
Hors ligne