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

C++ Discussion :

probleme sur les tableaux (dynamiques ou statiques) a deux dimensions


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut probleme sur les tableaux (dynamiques ou statiques) a deux dimensions
    Bonjour a tous,

    Je connais déjà bien le principe de l'allocation dynamique, mais je bute sur un probleme inconnu.

    Je veux créer un tableau a deux dimensions de façon dynamique. Il s'agit d'un tableau de GLFfloat (opengl, avec défini dans le header gl.h: typedef float GLfloat; ).
    Mon code est donc le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GLfloat **light_position;
    light_position=new GLfloat*[6]; 
    for(int i=0;i<6;i++){
        light_position[i]=new Glfloat[4];
    }
    mais ce code ne passe pas à la compilation. Après moultes essais, je retrouve un ancien source de TP ou je manipulait des tableau de la même façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int ** mat;
    //création de la matrice:
    		mat=new int*[largeur];
    		for(int i=0;i<=(largeur-1);i++){
    			mat[i]=new int[hauteur];
    		}
    je recopie le code, et là paf, rebelote, toujours la même erreur.
    Bizarre parce que mon code compilait sous visual c++ 6.0, et sous linux (gcc)

    Je parcours donc un peu le forum et la faq et je tombe sur ça:
    http://c.developpez.com/faq/c/?page=...bleau_2D_alloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* METHODE 1 */
    char **tab;
     
    /* Allocation de la 1er dimension */
    tab = malloc ( sizeof(*tab)  *  taille);
    /* Allocation des tableaux */
    for (i=0; i<taille; i++)
    {
       tab[i] = malloc ( sizeof(**tab) * taille2);
    }
    Je n'aime pas vraiment employer les malloc en c++ (le new est fait pour les fénéants après tout), et surprise.... ça ne fonctionne toujours pas -_-

    l'erreur me renvoie a la ligne du malloc (ou new dans els version c++):
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2040: 'tab' : 'int' differs in levels of indirection from 'char **'
    error C2440: 'initializing' : cannot convert from 'void *' to 'int'
    et pour ma premiere version, la même erreur:
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2040: 'light_position' : 'int' differs in levels of indirection from 'GLfloat **'
    error C2440: 'initializing' : cannot convert from 'GLfloat **' to 'int'
    Donc je ne sais vraiment plus quoi penser...
    Mes 2 hypotheses sont:
    - je ne suis vraiment bigleux, j'ai fait une erreur que je n'arrive pas a voir
    - mon compilo fait le difficile (visual c++ 2005).

    J'avais pensé a des solutions alternatives, excepté les vecteurs. En fait, le tableau que je veux créer n'est pas vraiment dynamique, mais je n'arrive pas a le remplir autrement. J'ai essayé différentes versions:

    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
     
    GLfloat tab[6][4];
    tab[i]= {x, x, x, x}; //ne compile pas
     
    GLfloat tab[6][4];
    GLfloat tab_2[4]={x, x, x, x};
    tab[i]=&tab_2[0]; //ne compile pas
     
    GLfloat tab[6][4]={
    {x,x,x,x},
    ...,
    {x,x,x,x}
    } //compile, mais ce n'est pas ce que je veux faire puisque le remplissage se fait après la déclaration.
     
    GLfloat tab[6][4];
    tab[0][0]=x
    ...
    tab[0][n]=x
    tab[n][0]=x
    ..
    tab[n][n]=x
    //compile aussi, mais je vais pas me tapper le remplissage cellule par cellule! OO
    je fais donc appel a vous, si quelqu'un peut m'aider a résoudre le probleme ou a me donner une autre solution

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Pour le moment, au niveau de la solution statique, la seule solution qui donne la "meilleure" erreur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GLfloat light_position[6][4];
    //...
    GLfloat light_position0[] = {x,x,x,x};
    light_position[0]=&light_position1;
    l'erreur suivante:
    cannot convert from 'GLfloat (*__w64 )[4]' to 'GLfloat [4]'

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    chez moi ton code sur les matrices marche parfaitement.
    t'avais quoi comme erreur ?
    t'as quoi comme machine ? 64 bits ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int largeur=5;
    int hauteur=10;
    int ** mat;
    //création de la matrice:
    mat=new int*[largeur];
    for(int i=0;i<=(largeur-1);i++){
    	mat[i]=new int[hauteur];
    }
    j'obtiens les erreurs suivantes à la compilation. (les autreserreurs decoulent des 2/3 premieres)
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2040: 'mat' : 'int' differs in levels of indirection from 'int **'
    error C2440: 'initializing' : cannot convert from 'int **' to 'int'
    There is no context in which this conversion is possible
    error C2059: syntax error : 'for'
    error C2143: syntax error : missing ')' before ';'
    error C2143: syntax error : missing ';' before '<='
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2143: syntax error : missing ';' before '++'
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2086: 'int i' : redefinition
    see declaration of 'i'
    error C2059: syntax error : ')'
    error C2143: syntax error : missing ';' before '{'
    error C2447: '{' : missing function header (old-style formal list?)
    Au niveau de la machine, oui c'est un proc athlon64 3400+, mais j'utilise un windows Xp 32bits
    Sinon, au niveau compilateur, ça compile très bien sous visual c++ 6.0 et linux, mais je travaille en ce moment sous visual c++ 2005... ça viendrait de là alors?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    rectification pour la version dynamique:
    je suis un GROS boulet.
    je n'étais dans aucune fonction donc normal qu'il fasse la gueule (j'ai mis mon code dans la partie déclaration des variables globales.
    (ça mérite 100 coups de fouets ça)
    J'ai honte de moi au possible, g bien passé 2 heures sur ce probleme, et posté un sujet inutile :'(
    Pour la version statique par contre ça ne marche toujours pas

    (je vais faire un edit du sujet pour éviter de me payer la honte, et ne mettre que le probleme du tableau statique)

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il n'est pas autorisé de mettre du code à la portée d'un fichier.
    Ton code ne peut donc pas compiler.
    De plus largeur et hauteur ne sont pas définies.

    Apprends à écrire un testcase.

    Ensuite ton code n'est bien sûr pas exception-safe et est mauvais, mais ça c'est autre chose.

    //compile aussi, mais je vais pas me tapper le remplissage cellule par cellule! OO
    Parce que y'a un moyen d'éviter ça peut-être ?
    C'est pas magique non plus l'informatique, il faut parcourir tout le tableau pour l'initialiser.
    Boost ftw

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par loufoque
    Il n'est pas autorisé de mettre du code à la portée d'un fichier.
    Ton code ne peut donc pas compiler.
    oui je viens de m'en rendre compte (cf mon poste plus haut)
    Citation Envoyé par loufoque
    De plus largeur et hauteur ne sont pas définies.
    c'étais juste pour l'exmple, j'ai boulié de le noter

    Citation Envoyé par loufoque
    Apprends à écrire un testcase.
    qu'est ce que tu entends pas là?

    Citation Envoyé par loufoque
    Ensuite ton code n'est bien sûr pas exception-safe et est mauvais, mais ça c'est autre chose.
    oui, je suis encore débutant, et il s'agit d'un code pour un TP. Et une exception sur une allocation de petite taille ça doit pas etre super courant non?

    Citation Envoyé par loufoque
    Parce que y'a un moyen d'éviter ça peut-être ?
    C'est pas magique non plus l'informatique, il faut parcourir tout le tableau pour l'initialiser.
    je veux dire que c'était contraignant au niveau du nombre de lignes a tapper. Plutot remplir ligne par ligne {x,..x,} que cellule par cellule.
    Le probleme encore est que le remplissage de cette façon ne peut se faire que lors de l'initialisation, par ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tab[]={0,1,...,10};
    jimagine quil n'y a pas de solution pour faire un truc que genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tab[4];
    tab={1,2,3,4};
    d'ou ta remarque

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ce que je te conseillerais c'est de faire des tableaux contigues et de faire une classe matrix qui te fournirait la fonctionnalité [][].
    tu pourrais faire en plus une initialisation comme tu le souhaites:

    int matrice[16] = {1,2,3,4,5,6,7,........};

    class Matrix44 {
    int _data[4*4];

    ...

    int* operator[] (int i) {
    return &data[i*4];
    }
    };

    voila a+ bon courage

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Loufoque (mais pourquoi d'ailleurs t'es provisoirement toléré ?) voulait dire a propos d'exception safe qu'il faut quand meme pouvoir liberer la memoire meme en cas d'exception.

    si tu encapsule ton tableau dans un objet, ca sera bon.

    sinon regarde du cote de auto_ptr mais cela ne marche pas pour les tableaux.

    a+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    déjà merci pour les réponses.

    Citation Envoyé par epsilon68
    Loufoque (mais pourquoi d'ailleurs t'es provisoirement toléré ?) voulait dire a propos d'exception safe qu'il faut quand meme pouvoir liberer la memoire meme en cas d'exception.

    si tu encapsule ton tableau dans un objet, ca sera bon.

    sinon regarde du cote de auto_ptr mais cela ne marche pas pour les tableaux.

    a+
    voilà pourquoi je veux à l'origine créer un tableau statique (du style tab[x][y]).
    En fait j'ai mal expliqué mon probleme:
    sous opengl je veux gérer une liste de lumieres (numerotés de 1 à 6), chacune ayant une position (4floats, x,y,z et w) et une direction (3float, x,y,z) modifiables.

    Le placement de ces lumieres se fait par l'appel d'une fonction opengl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void glLightfv(GLenum light,
        GLenum pname,
        const GLfloat * params)
    avec light le numero de la lumiere, pname le parametre (pour définir la posisiton ou la direction) et params la valeur du parametre

    pour le moment, j'ai pour chaque lumiere 2 tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    GLfloat direction1[]={x,x,x};
    GLfloat position1[]={x,x,x};
     
    GLfloat direction2[]={x,x,x};
    GLfloat position2[]={x,x,x};
    ...
    et j'aimerais plutot créer 2 tableaux, un pour chaque posisiotn de lumiere, lautre pour chaque direction.
    ce qui donnerais par exemple pour la position:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GLfloat light_position[6][4] = { 
    	{2.0, 2.0 ,2.0, 0.0},	//lumiere 1 (à l'infini):
    	{-2.0, -2.0, 1.0, 1.0},	//lumiere 2:
    	{1.0, 0.0, 4.0, 1.0},	//lumiere 3:
    	{2.0, -2.0, 1.0, 1.0},	//lumiere 4:
    	{3.0, -1.0, -1.0, 0.0},	//lumiere 5 (à l'infini):
    	{0.0, 2.0, 0.0, 0.0}	//lumiere 6 (à l'infini):
    };
    Le probleme c'est que je ne veux pas des valeurs en dur, mais des valeurs calculées, et mes tableaux sont utilisés dans le programme principal, par le main et d'autres fonctions (donc déclaré au debut du fichier).
    Et une fois déclaré, je ne peut plus le remplir de la même façon.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    l'astuce c'est de manipuler des objets qui sont capable de se transformer en tableau au moment venu...

    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
    class LightDir{
    	union {
    		struct { a,x,y,z; };
    		double _array[4];
    	};
     
            LightDir( double a, double x, double y, double z ) : etc...
    };
     
    LightDir lights[6];
     
    lights[0] = LightDir(0,1,2,5);
    lights[1] = LightDir(0,1,2,5);
    lights[2] = LightDir(0,1,2,5);
    lights[3] = LightDir(0,1,2,5);
     
    ....
    tu pourras utiliser plus tard lights[0]._array

    voila a+

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Loufoque (mais pourquoi d'ailleurs t'es provisoirement toléré ?)
    C'est un statut spécial que seuls peu d'élus ont.
    Boost ftw

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    merci pour tout

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

Discussions similaires

  1. [Langage] Probleme avec les tableaux dynamiques
    Par wawa84 dans le forum Langage
    Réponses: 7
    Dernier message: 19/11/2008, 17h18
  2. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 14h57
  3. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  4. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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