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

OpenGL Discussion :

const char / const charGL / char / string ?


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut const char / const charGL / char / string ?
    Bonjour !

    j'essaye d'écrire une classe pour créer des objets openGL et je buttes sur la gestion des chars pour les shaders.

    par la suite il faudra que je crées un module dans le programme pour éditer les shaders.

    d'où une première vraie question: utiliser les char, ou utiliser les string pour cet éditeur de texte à fabriquer ? si c'est du string, je suppose qu il faudra utiliser c.str() pour le convertir ?

    deuxième question, plus à voir avec le C++, je n'arrive pas à placer mon texte en char,
    j'ai en retour compilateur :

    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
    18
    19
     
    In file included from C:\redKAT\REDKAT\main_redKAT.cpp:23:0:
    ..\REDKAT/Surfaces.cpp: In member function 'void Surfaces::fill_shader_code(char*, GLenum)':
    ..\REDKAT/Surfaces.cpp:87:48: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
             sprintf(m_vertex_shader_code,shadercode);
                                                    ^
    In file included from ..\REDKAT/utility_log.cpp:2:0,
                     from C:\redKAT\REDKAT\main_redKAT.cpp:21:
    c:\mingw\include\stdio.h:280:37: error:   initializing argument 1 of 'int sprintf(char*, const char*, ...)' [-fpermissive]
     _CRTIMP int __cdecl __MINGW_NOTHROW sprintf (char*, const char*, ...);
                                         ^
    In file included from C:\redKAT\REDKAT\main_redKAT.cpp:23:0:
    ..\REDKAT/Surfaces.cpp:90:50: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
             sprintf(m_fragment_shader_code,shadercode);
                                                      ^
    In file included from ..\REDKAT/utility_log.cpp:2:0,
                     from C:\redKAT\REDKAT\main_redKAT.cpp:21:
    c:\mingw\include\stdio.h:280:37: error:   initializing argument 1 of 'int sprintf(char*, const char*, ...)' [-fpermissive]
     _CRTIMP int __cdecl __MINGW_NOTHROW sprintf (char*, const char*, ...);
    J'en déduis que je ne comprends pas trop la différence char et const char, et ce qu'il faut que je fasse.

    Voilà le .hpp:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    class Surfaces
    {
    public://fonction membres allias méthodes
     
        void fill_shader_code(char *shadercode, GLenum shader_type);//remplissage du string du shader
     
        void init_shaders();//creation des vertex et fragment shaders
     
        void compile_attach_shaders();
     
        void create_program();
     
     
    private://variables membres allias attributs
     
    int m_ID;//ID by calling constructor and destructor
     
    std::string m_name; //name of the shape, user define
     
    int m_nb_vert;//number of vertices for the shape
    vector<Vertex> m_vertex; //vertex x y z, see struct vertex
     
    GLuint m_VAO;//Vertex array object
    GLuint m_VBO;//Vertex buffer object
     
    GLuint m_program;
     
    GLuint m_VS;
    GLuint m_FS;
     
    const char* m_vertex_shader_code; 
    const char* m_fragment_shader_code;
     
    float m_color[4];//r v b a
    float m_pos[3];//x y z
     
    };
    et le fichier cpp:

    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
     
    void Surfaces::fill_shader_code (char *shadercode, GLenum shader_type)
    {
        switch(shader_type)
        {
        case GL_VERTEX_SHADER:
            sprintf(m_vertex_shader_code,shadercode);
        break;
        case GL_FRAGMENT_SHADER:
            sprintf(m_fragment_shader_code,shadercode);
        break;
        default:
        break;
        }
    }
    Voilà ! quelqu'un peut il m'éclairer ? merci !!!

  2. #2
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    J'essaye personnellement de toujours cacher les char* autant que possible. Autant faire du C++, autant utiliser les string, beaucoup plus sécurisés et souples. Du coup oui, c_str().

    char* tout seul c'est un pointeur que tu peux éventuellement balader. Quand tu crée un tableau de char, il pointe sur la première case de ce tableau, et si tu l'incrémentes ou le décrémente, il se balade dans le tableau (ou n'importe ou, si tu fais n'importe quoi ). En déclarant un const char*, tu interdis à l'utilisateur (= toi et ceux qui peuvent utiliser la classe ou fonction) de le balader. C'est plus safe. Disons qu'à moins de faire des choses bien particulières (genre faire une recherche de caractère dans un tableau de char, et encore, comme dis plus haut, y a string qui fait ça très bien, alors pourquoi mettre les mains dans le cambouis ?) c'est un peu la règle, le const char*.

    Une autre règle, c'est qu'une fois qu'un truc est constant, bah faut que tout ceux qui l'utilisent respectent le contrat. Un const char* peut pas être utilisé là ou un char* est attendu, sinon le contrat est violé (y a bien moyen via un cast mais là on rendre dans le monde du code super-dégueu).

    Pour ton code, le mieux c'est que tu passes tout en string(). Tu l'as dit toi même, tu fais du C++, pas du C. Ça t'évite de jouer avec sprintf() et du coup tu peux faire une simple copie de string.
    A la fin, il faudra que tu fasses un c_str() dans la méthode OpenGL (glShaderSource() si je ne m'abuse), puisque OpenGL est écrite en C.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    ok ! merci beaucoup !

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

Discussions similaires

  1. const char *tab Vs char const *tab
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 29/03/2011, 18h40
  2. parametre (char const *) d'une fonction
    Par Mokhtar BEN MESSAOUD dans le forum Débuter
    Réponses: 12
    Dernier message: 27/02/2008, 13h44
  3. le type const char* const * et fltk en toile de fond
    Par dambriscard dans le forum C++
    Réponses: 4
    Dernier message: 04/07/2007, 16h18
  4. Réponses: 13
    Dernier message: 02/04/2007, 11h04
  5. Réponses: 3
    Dernier message: 25/10/2006, 22h54

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