CHARGEMENT DES TEXTURES EN OPENGL

shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014 - 19 janv. 2010 à 17:38
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014 - 25 janv. 2010 à 22:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51139-chargement-des-textures-en-opengl

shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
25 janv. 2010 à 22:43
concernant le point (2), il ne faut normalement pas inclure des fichiers .c mais des fichiers .h contenant le prototype des fonctions présentes dans le .c

en faisant cela, la ligne 163 n'est certainement pas une ligne du fichier main mais une ligne du fichier résultant des "include" + le main
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
25 janv. 2010 à 22:27
tu veux dire que tu as fais :
SDL_Surface **images {NULL}, *surface_d_accueil NULL;
//Allocation dynamique de la taille du tableau de surfaces
images = (SDL_Surface **)malloc((nombre_de_textures) * sizeof(SDL_Surface*));

Quand j'ai cherché de la doc sur le comment utiliser la fonction malloc je suis tombé la dessus :

http://forum.hardware.fr/hfr/Programmation/C-2/cast-malloc-faire-sujet_33909_1.htm

et d'autre part on crée un tableau de surface : images est donc effectivement de type SDL_Surface **, mais chaque élément du tableau que l'ont va créer avec malloc est de type SDL_Surface*.

Donc si tu veux caster malloc tu peux faire la chose suivante :
SDL_Surface **images {NULL}, *surface_d_accueil NULL;
//Allocation dynamique de la taille du tableau de surfaces
images = (SDL_Surface *)malloc((nombre_de_textures) * sizeof(SDL_Surface*));

Et pour ce qui est de la fonction main ? Comme dit il y a 150 lignes, tu as rajouté 4 lignes d'include, ça nous amène a 154, alors pourquoi ton compilateur te dit il qu'il y a une erreur à la ligne 163 ? Tu as rajouté quoi d'autre ?
shorzy Messages postés 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013
25 janv. 2010 à 22:00
J'ai Ajouté les :
#include ...

Ha et j'ai aussi du ajouter
(int*) et (SDL_Surface**)
aux instructions malloc.

Apparement aucun de vous

????????????????????????????????????????
Pourquoi???????????

Salutations
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
25 janv. 2010 à 15:49
Si j'ai bien compris il te dit qu'il y à une erreur à la ligne 163 dans le main ?

T'as rajouté autre chose que les includes ? parce que le fichier main.c ne fait que 150 lignes
shorzy Messages postés 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013
25 janv. 2010 à 13:20
Salut les Garcs
(Je présise que j'arrive sur la Pointe des Pieds !!)

Je ne veux pas me faire Insulter dans tous les Sens, mais J'ai des Problème de Compilation.

(Code::Block)

(1)
J'ai Installé la SDL (que je n'avais pas) pour compiler ton Code.




(2)
Il faut ensuite que j'ajoute : (dans main)
#include "initialisation_structure_evenements.c"
#include "initialisation_OpenGL.c"
#include "chargement_des_textures.c"
#include "fonction_gestion_des_evenements.c"
pour pouvoir Compiler (?!)

(3)
Il me Reste une Erreur :
C:\main.c|163|error: expected `}' at end of input|



A)
A Quoi (3) est du ???

B)
Existe t il une Ligne de Cde au Compilo pour Evité (2)

Merci.
++
Gilliard Messages postés 5 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 27 février 2009
21 janv. 2010 à 09:47
Eh cool les gars, le but n'est pas de faire un combat verbal !
Bien sûr, un programme ne devrait jamais planter, d'accord. Mais qui a déjà rencontré même un professionnel qui n'oublie pas de traper un problème quelconque ? En tout cas pas moi, et ça fait 34 ans que je programme. Et faire un programme vraiment "fail-safe", ça demande beaucoup de temps ... c'est ce qui différencie (enfin, devrait différencier) un programme commercial d'un "bout de code" proposé par un amateur sur un forum.
Ceci dit, en effet, l'amateur devrait aussi récupérer au moins les cas qu'il a détectés.
(A propos, moi, je met toujours un "default" après le dernier "case" d'un "switch" ... ne serait-ce que pour le jour où je modifie mon programme sans me souvenir des détails !)
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
20 janv. 2010 à 19:02
Tu sais je suis pas idiot, quand tu m'as dis la première fois qu'il fallait gérer les erreurs j'avais compris, j'ai même mis à la fin de mon post :

"je vais faire en sorte que cet outil soit le plus pratique possible."

Puis tu reviens passer une couche, en citant le code rectifié en plus, et en me disant qu'il ne faut pas laisser planter...

Ce n'est pas moi qui te prends de haut, je ne te prends pas pour un abruti, je t'ai écouté et j'ai rectifié la fonction en conséquence !!
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
20 janv. 2010 à 18:36
hé ho du calme gamin, premièrement je ne fait que répondre à ton commentaire
si c'est pour me prendre de haut, à l'avenir je te laisserai te débrouiller tout seul
d'ici là, apprends à programmer correctement
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
20 janv. 2010 à 15:21
Dis moi, tu le fais exprès là ?

T'as pas vu la modif ?

Petit récapitulatif rien que pour toi :

19 janvier 2010 23:36:49 :
MODIF : la fonction ne génère plus d'erreur de segmentation si on ne l'utilise pas correctement. Vous pouvez maintenant même enlever le fichier texte ou mettre des noms qui n'ont aucun rapport avec les images que vous voulez chargez. Ceci dit, il est quand même plus naturel de n'envoyer que les paramètres nécessaires à la fonction.

La prochaine fois regarde un peu avant de commenter.
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
20 janv. 2010 à 14:52
le code que tu donnes ne plantera pas car... il ne compilera pas
IMG_Load attend un paramètre de type "const char*" pas un "int"

le problème n'est de toute façon pas IMG_Load
cette fonction ne plante pas, si l'image n'existe pas ou si le paramètre est invalide elle retourne NULL

le pire c'est que tu le gère dans ton programme :
# if(images[i] != NULL)
# {
# printf(" texture chargée\n");
# numero_de_texture_valide[i] = 1;
# }
# else{printf(" problÚme de chargement de texture\n");}

sauf que printf ne suffit pas
si image[i] est laissé à NULL il faut le gérer
ou alors quitter le programme si une texture ne peut être chargée
mais pas le laisser planter
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2010 à 22:34
Si je te suis alors ce n'est pas normal que ce code plante :

int a = 0;
images[i] = IMG_Load( a );

??

La fonction que j'ai codé est un outil, ce n'est de loin pas une application finale, et comme tout outils il y a une notice d'utilisation. Ne pas mettre de tournevis dans une prise électrique, ne pas mettre de chat dans le micro onde...

Je ne suis pas un professionnel en programmation, je le reconnais (c'est d'ailleurs pour ça que ce code se trouve en section débutant), mais je vais faire en sorte que cet outil soit le plus pratique possible.
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
19 janv. 2010 à 21:57
je ne dois pas bien parler français alors je me répète autrement : une application NE DOIT PAS PLANTER
il faut GERER les erreurs, pas laisser des erreurs de segmentation en disant c'est normal il y a une contrainte à respecter
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2010 à 18:27
Si jamais les messages d'erreurs affichés ne sont pas ceux que j'ai cité je veux bien un copie.
Jackyzgood Messages postés 26 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2010 à 18:10
L'application fonctionne très bien, en l'exécutant en mode console vous pourrez voir ou se situe le problème. J'ai placé pas mal de printf pour connaitre l'avancement des différentes étapes.

En temps normal, la console doit vous renvoyer le message suivant :

nombre de textures : 3
rouge.jpeg texture chargée
bleu.jpeg texture chargée
vert.jpeg texture chargée
largeur totale arrondie : 256.000000
hauteur max : 64.000000 resultat : 64.000000
hauteur totale arrondie : 64.000000

Vous avez donc le nombre de lignes dans le fichier, les noms des images et si le chargement s'est bien déroulé, et la taille de l'image d'accueil, qui ne pose pas de problème tant qu'elle ne dépasse pas 8192 x 8192

***************************************************************

En cas de problème la console vous renvoie la chose suivante :

nombre de textures : 4
rouge.jpeg texture chargée
bleu.jpeg texture chargée
vert.jpeg texture chargée
problème de chargement de texture
Erreur de segmentation

On voit très bien que la fonction va chercher à lire 4 textures, or il n'y a que 3 noms dans le fichier, la dernière image ne pouvant être chargé (car aucune image ne porte ce nom là) elle produit une erreur de segmentation et le programme s'arrête.

Je vous rappel ceci :

-La seule contrainte sur le fichier .txt est qu'il ne doit pas contenir de ligne vierge, même pas à la fin du fichier, car sinon il la lira et ne trouvera pas de fichier correspondant => plantage.
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
19 janv. 2010 à 17:38
une application qui plante ? 0/10
tester la présence d'un fichier c'est pas possible ?
l'échec de l'ouverture ?
ou tout simplement savoir qu'une chaine est vide ?
je ne vais pas noter pour pas paraitre méchant ^^

concernant la taille maximale de texture, un petit "glGetIntegeri" avec pname=GL_MAX_TEXTURE_SIZE et tu connaitras la taille maximale de texture que tu peux générer
par contre ça ne devrai pas planter, tester l'échec de création de la texture c'est aussi possible
Rejoignez-nous