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

Langage C++ Discussion :

OpenGL et allocation dynamique


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut OpenGL et allocation dynamique
    Bonjour à tous,

    Je viens de tomber sur un drôle de problème, et j'aurais aimé savoir si quelqu'un a déjà recontré ce cas avec une autre librairie.

    Voici un code que j'ai ramené au plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <iostream>
     
    int 
    main (int argc, char * argv[])
    {
    	unsigned int * a = new unsigned int[16];
     
    	for ( unsigned int i = 0; i < 16; i++ )
    		std::cout << i << " : " << (unsigned int)a[i] << std::endl;
     
    	return 0;
    }
    Si je le compile en tant que projet C++ simple, j'ai une série de zéros qui s'affichent, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    0 : 0
    1 : 0
    2 : 0
    3 : 0
    4 : 0
    5 : 0
    6 : 0
    7 : 0
    8 : 0
    9 : 0
    10 : 0
    11 : 0
    12 : 0
    13 : 0
    14 : 0
    15 : 0
    Mais si je rajoute au compilateur -lGL pour lier la bibliothèque d'OpenGL et sans rien modifier d'autre dans le code source, j'obtient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    0 : 841837922
    1 : 775106862
    2 : 923430771
    3 : 909193830
    4 : 1701013045
    5 : 758132784
    6 : 825386551
    7 : 1667642678
    8 : 808464486
    9 : 757953056
    10 : 808460400
    11 : 808466480
    12 : 807415856
    13 : 825244216
    14 : 892613664
    15 : 808530231
    Et c'est la que je commence à ne plus rien comprendre ...

    Donc j'ai un projet utilisant OpenGL, et là ou je pensais allouer des valeurs à 0, je me retrouve avec de larges buffers pleins de valeurs à la noix, ce qui m'embête légèrement. Je peux toujours remettre des boucles un peu partout, mais je trouve ça tout même bizarre.
    L'opérateur new n'est pas censé initialiser les valeurs a 0 en toutes circonstances?

    Je suis sur une debian 64, avec le dernier pilote nvidia du site proprio (sans quoi pas de 3D).

    Voila, celui qui a une idée

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    Salut,

    contrairement à d'autres languages C++ (tout comme C ) ne garantissent pas l'initialisation de la mémoire allouée sur le tas ou la pile, seules les variables statiques sont initialisées à 0,

    Cdt

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Salut,

    Comme l'a dit kessoufi, la mémoire alloué n'est pas initialisé. Elle vaut donc ce qu'il y avait dedans à ce moment là. Le fait que tu obtienne des zéros viens juste d'un gros coup de bol

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    Bon ben, je sais pas où j'ai pêché que new initialisait les valeurs a 0 alors... LOL

    Merci pour vos réponses.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Une initialisation est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int * a = new unsigned int[16]();
    C'est bien une paire de parenthèse vide qui est nécessaire et provoque une initialisation à 0 (ou appel du constructeur par défaut pour une classe). Pour un tableau tu ne peux mettre de valeurs : unsigned int * a = new unsigned int[16](0); => erreur

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    int 
    main (int argc, char * argv[])
    {
    	unsigned int * a = new unsigned int[16]();
     
    	for ( unsigned int i = 0; i < 16; i++ )
    		std::cout << i << " : " << a[i] << std::endl;
     
    	return 0;
    }
    On ne répétera jamais assez : std::vector à la place des allocations new[]/delete[] ... En plus tu peux initialiser avec une valeur spécifique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <vector>
     
    int
    main (int argc, char * argv[])
    {
    	std::vector<unsigned int> a(16,42);
     
    	for ( unsigned int i = 0; i < 16; i++ )
    		std::cout << i << " : " << a[i] << std::endl;
     
    	return 0;
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    Je ne connaissais pas les parenthèses vident avec l'allocation d'un tableau.

    Par contre, je ne pense pas que je vais pouvoir utiliser des std::vector partout. Parce que je dois créer des tableau de float (GLfloat pour être précis) et les fonctions de chargement d'OpenGL attendent des pointeurs du type "GLfloat *". J'ai pas vu de méthode comme pour std::string ou on sort un pointeur avec c_str() par exemple.

    Maintenant je penserais a std::vector dans tout les autres cas

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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