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 :

float* -> float[][4]


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut float* -> float[][4]
    Bonjour,

    J'ai une fonction d'API qui attend en paramètre un float[][4].

    Je lui envoie un pointeur float*, et Visual C++ m'envoie bouler :
    impossible de convertir le paramètre 1 de 'float *' en 'double [][4]'

    Y aurait-il quelque chose qui m'a échappé ?

    Merci.

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Les types sont incompatibles entre eux !
    Un float* n'a rien à voir avec un float[][4] !

    Exemple d'un code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void fonction (float test[][4])
    {
    	std::cout << "fonction" << std::endl;
    }
     
    int main()
    {
    	float var[2][4];
    	fonction(var);      
    }

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Le problème avec ton code est que je ne connais pas la taille d'une des dimensions du tableau lors de la déclaration. Je dois donc utiliser des pointeurs.

    Comment devrais-je donc déclarer et allouer mon pointeur pour qu'il corresponde à un tableau bidimensionnel ?

    Merci.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Tu peux faire quelque chose comme:
    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
    #include <iostream>
     
    using namespace std;
     
     
     
    void test(float tab[][4])
    {
     
      cout << tab[5][3] << endl;
     
      return;
     
    }
     
     
    int main(void)
    {
     
      float (*tab) [4]=NULL;
     
      tab=new float [10][4];
      tab[5][3]=12;
      test(tab);
      delete tab;
     
      return 0;
     
    }

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Merci !

    Et pour la ligne suivante :

    y a-t-il moyen de déclarer une variable membre float*, et de retomber par la suite ce que tu m'as suggéré par une affectation qui précise le type du pointeur ?

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Tout ceci est du C.

    En c++, on utilisera une classe/structure et et conteneur. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct QuatreFloat
    {
        float tab[4];
    };
     
    std::vector<QuatreFloat> monTableau;
    Ca peut paraitre plus compliqué, à premiere vue, qu'un tableau "C style" à 2 diñension , mais en fait le c++ fourni tant d'outil pour manipuler une telle structure qu'au final l'utilisation est plus simple, plus sure, souvent plus rapide, etc.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ouaip, mais la fonction de l'API que j'utilise demande un float[][4] (alors que c'est une API C++...).

    Si tu veux déplacer ma question dans la section du C, je n'y verrai aucun inconvénient.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par oodini Voir le message
    Merci !

    Et pour la ligne suivante :

    y a-t-il moyen de déclarer une variable membre float*, et de retomber par la suite ce que tu m'as suggéré par une affectation qui précise le type du pointeur ?
    Je n'ai pas bien compris ce que tu veux faire, pourrais-tu donner un exemple.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je crois que j'ai trouvé mon bonheur sur la page suivante :

    http://c-faq.com/aryptr/ary2dfunc3.html
    (notamment le lien en bas de page)

    Je suis en train d'appliquer ce qui est expliqué, et j'arrive à quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float **mCVs;
    mCVs = (float **)malloc(rows * sizeof(float *));
    for(int i = 0; i < rows ; i++)
    	mCVs[i] = (float *)malloc(4 * sizeof(float));
    Je devrais ensuite pouvoir envoyer mCVs en tant que paramètre d'une fonction qui attend un float[][4].

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Sauf que c'est complètement du C, et surtout ça ne donne pas un tableau de tableaux mais un tableau de pointeurs vers des tableaux.

    Absolument pas ce qu'il faut pour une fonction demandant un float (*)[4].

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je propose:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef float QuatreFloat[4];
    std::vector<QuatreFloat> monTableau;
     
    //Et pour montrer que ça marche,
    //cette ligne devrait compiler:
    float (*ptr)[4] = &monTableau[0];
    Ainsi tu profites de la fonctionnalité des vecteurs et tu as vraiment un tableau de float[4]...

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par oodini Voir le message
    Ouaip, mais la fonction de l'API que j'utilise demande un float[][4] (alors que c'est une API C++...).
    Une API C++ prend cette chose en paramètre ? Je demande à voir !

  13. #13
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Je viens bien comprendre que l'API demande un float [][4] sortit d'on ne sait où mais de là à utiliser des mallocs ...


  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je confirme.
    La seule raison qui pousserait à utiliser malloc() serait que la bibliothèque fasse un free() sur le pointeur passé. Et ce serait une mauvaise raison, car toute resource allouée par un module doit être désallouée par le même module.

  15. #15
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Oui, tout ça est particulièrement sale...

    On peut savoir quelle API demande ça ?

  16. #16
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Des noms, des noms!!!



    Citation Envoyé par oodini
    Si tu veux déplacer ma question dans la section du C, je n'y verrai aucun inconvénient.
    Bah je ne sais pas trop... si c'est une API c++...

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par poukill Voir le message
    Oui, tout ça est particulièrement sale...

    On peut savoir quelle API demande ça ?
    Il s'agit d'Autodesk Maya, dans la classe MPointArray :
    http://www.kxcad.net/autodesk/maya/M...ointArray.html
    Comme vous pourrez le voir, le tableau passé en paramètre est destiné à être rempli par les fonctions (par get(), par exemple).

    Le but est de transformer ce tableau d'instances de classe MPoint (4 coordonnées) en un tableau unidimensionnel de flottants.

    Ne leur jetez pas la pierre : je dois justement envoyer toutes ces données à une autre API, qui est C, celle-là...

  18. #18
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ouais m'enfin un tableau de points, je l'aurai plutôt écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< std::pair<T, T> > m_TableauPoints;
    L'interface n'est quand même pas top top... Après si ça convient, tant mieux...

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je ne me souviens pas avoir vu une seule fois dans cette API une quelconque dépendance à la STL. Sans doute un choix politique...

    Par ailleurs, comme je dois envoyer les données à une API C, passer par la STL m'obligerait à dupliquer les données. Elles seraient donc présentes 3 fois en mémoire :

    1 - Dans la scène Maya
    2 - Dans la structure de données utilisant la STL
    3 - Dans l'espace mémoire que j'envoie à l'API C

    La RAM étant un problème crucial dans les scènes 3D, ce n'est pas plus mal de bosser sur ces structures de données primitives...

Discussions similaires

  1. Problème float java à float sql
    Par littlebear dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 28/03/2012, 18h39
  2. Conversion Float en float
    Par RouRa22 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/07/2009, 15h00
  3. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  4. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38
  5. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32

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