IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[C] Pointeurs de GLubyte * et pointeurs de unsigned int **


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut [C] Pointeurs de GLubyte * et pointeurs de unsigned int **
    Bonjour a tous

    Je manipule des pointeurs de type unsigned int ** et GLubyte *

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unsigned int * * firstTet;
    	firstTet=malloc(nbPass*sizeof(*firstTet));
    	for(unsigned int i=0;i<nbPass;i++)
    		firstTet[i]=malloc(nbPass*sizeof(*(firstTet[i])));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GLubyte * data;
    	for(j=0;j<(*nbPass)&&again;j++)
    {
    data = (GLubyte *)firstTet[j];
    		glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
    		glReadPixels(0, 0, W, H,GL_RGBA,GL_UNSIGNED_BYTE,data); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(unsigned int i=0;i<nbPass;i++)
    		free((firstTet)[0]);
    	free(firstTet);
    or il se trouve que le GLubyte fait exactement un octet tandis que l'unsigned int en fait 4. Et j'écrit systématiquement quatre composante d'un octet.
    Je peut accéder aux élément a travers firstTet ou data sans le moindre problème ( et le données sont bien évidemment valide.

    Cependant le code ci dessus me fait une :
    *** glibc detected *** ./vr: free(): invalid next size (fast): 0x0000000001bc8620 ***

    si je commente le glReadPixels, plus de problèmes, mais évidemment je n'ai plus aucune données.
    si je commente les free, plus d'erreur, mais bien évidement une grosse fuite de mémoire.

    je ne saisis pas le problèmes, j'ai hésité a poster en openGL mais je crois qu'il s'agit plus d'un problème concernant les pointeurs.

    De la même manière, peut-on caster un pointeur de unsigned int en un pointeur de char en faisant attention a ce que l'on fait....?

  2. #2
    Membre éprouvé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2009
    Messages : 162
    Points : 1 228
    Points
    1 228
    Par défaut
    Citation Envoyé par GloW_on_dub Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unsigned int * * firstTet;
    	firstTet=malloc(nbPass*sizeof(*firstTet));
    	for(unsigned int i=0;i<nbPass;i++)
    		firstTet[i]=malloc(nbPass*sizeof(*(firstTet[i])));
    Pas de problème jusqu'ici, mais je trouve la version suivante plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unsigned int * * firstTet;
    	firstTet=malloc(nbPass*sizeof(unsigned int *));
    	for(unsigned int i=0;i<nbPass;i++)
    		firstTet[i]=malloc(nbPass*sizeof(unsigned int));
    Citation Envoyé par GloW_on_dub Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GLubyte * data;
    	for(j=0;j<(*nbPass)&&again;j++)
    {
    data = (GLubyte *)firstTet[j];
    		glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
    		glReadPixels(0, 0, W, H,GL_RGBA,GL_UNSIGNED_BYTE,data); 
    }
    Je ne connais pas OpenGL mais il me paraît bizarre de stocker un unsigned int pour des données occupant un octet (puisque GLubyte pointe sur un octet). A moins que GLubyte pointe sur un tableau d'octets mais dans ce cas est-on sûr que c'est bien 4 octets (taille a priori d'un unsigned int) ? La constante GL_UNSIGNED_BYTE a-t-elle une influence ici ?

    Citation Envoyé par GloW_on_dub Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(unsigned int i=0;i<nbPass;i++)
    		free((firstTet)[0]);
    	free(firstTet);
    Ne faudrait-il pas écrire plutôt : free(firstTet[i]), plutôt que 0 ?

    Citation Envoyé par GloW_on_dub Voir le message
    De la même manière, peut-on caster un pointeur de unsigned int en un pointeur de char en faisant attention a ce que l'on fait....?
    Bien sûr, le type d'un pointeur en C n'est utile au compilateur qu'en trois occasions :
    • lors du déréférencement : *p récupère un nombre d'octets égal à sizeof(*p) ;
    • lors de l'arithmétique sur les pointeurs : p + i ajoute à p i*sizeof(*p) ;
    • lors de l'indexation, qui combine un peu les deux cas ci-dessus : p[i].


    Donc si on transforme un pointeur int* en char* c'est par exemple pour ne récupérer que le premier octet d'un int, ou pour parcourir l'int octet par octet (attention, ce n'est pas portable...)
    Méfiez-vous des programmeurs qui portent des tournevis ! (Dijkstra)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Je m'en suis sorti en allocant que des char ** et des char *.

    Ensuite je ne faisait que lier les unsigned int ** a mon char **.

    Le GLubyte et le char sont exactement la meme chose , quand a l'ecriture des 4 composantes, je me suis assuré que les octet etait bien ecrit les uns apres les autres.

    merci d'avoir noté l'erreur [i] a la place de [0] qui etait un test oublié.

Discussions similaires

  1. pointeur de methode vers pointeur de fonction
    Par yvesall dans le forum GTK+
    Réponses: 1
    Dernier message: 19/11/2008, 17h23
  2. Réponses: 3
    Dernier message: 29/07/2008, 09h56
  3. Réponses: 9
    Dernier message: 07/07/2008, 11h43
  4. pointeur vers tableau de pointeurs
    Par Michel_57 dans le forum C++
    Réponses: 6
    Dernier message: 09/11/2007, 21h41
  5. Réponses: 10
    Dernier message: 03/02/2005, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo