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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    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
    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 émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    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 confirmé
    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
    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 confirmé
    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
    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
    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.

  7. #7
    Membre confirmé
    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
    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

+ 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