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 :

Tableau semi dynamique n lignes, 2 colonnes


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 42
    Points
    42
    Par défaut Tableau semi dynamique n lignes, 2 colonnes
    Bonjour,

    J'essaie depuis plusieurs heures toutes les solutions possibles pour réaliser un simple tableau dynamique n lignes, 2 colonnes (ça doit pourtant pas être si compliqué non?)

    pour l'instant dans le header j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      std::vector <float> m_crosserPos[2];
    constructeur: rien concernant ce tableau

    et dans une fonction qui ne s'exécute qu'une fois, des que la dimension voulue (pour n) est connue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_crosserPos.push_back(-1,-1);  // pour l'initialisation, est effectuée dans une boucle n fois.
    et pour cette ligne j'ai essaye un tas de truc, sans supprimer l'erreur comme quoi je lui donne pas ce qu'il attend

    j'ai pas mal cherche mais rien trouve qui réponde vraiment à ça, ( je débute en c++, donc j'ai peu être mal cherché).

    Si quelqu'un a la solution ce serait sympa ça m'économisera du temps

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector <float> m_crosserPos[2];
    déclare un tableau de deux vecteurs de float...
    Pourquoi créer ton type d'élément avec float éléments nommés (qu'on sache ce qu'on manipule):
    test.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Point2D{
    public:
    float x,y;
    Point2D(float pX,float pY);
    };
    test.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Point2D::Point2D(float pX,float pY):x(pX),y(pY){}
    std::vector<Point2D> m_crosser_pos;
     
    m_crosser_pos.push_back(Point2D(-1,-1));

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 42
    Points
    42
    Par défaut
    Ok Merci,
    je viens de comprendre pourquoi ca ne marchait pas (je voulais declarer un vecteur de 2 float, et pas 2 vecteurs de 1 float), d'ailleurs comment je fais?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      std::vector <float[2]> m_crosserPos;
    comme ca?

    Et j'ai un autre probleme avec ta solution, je souhaite declarer m_crosserPos dans le header aussi, pour ne pas perdre les donnees entre 2 executions du .cpp sauf que ca m'oblige a creer un autre fichier header a cote juste pour le point2D non? (si oui, on a pas une solution pour eviter ca?).

    dsl pour les erreurs je suis sur un clavier qwerty et c'est pas facile, d'ailleurs d'ou sortent les accents sur mon premier post, c'est automatique la correction, ou les moderateurs les rajoutent gentiment?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    salut,
    le layout des fichiers dans mon exemple était juste pour illustrer les déclarations et appels...
    Maintenant, il est recommandé de découper:
    • point2D.h pour déclarer le point2D (tu peux aussi utiliser un vecteur de float[2], je pense, mais à mon sens c'est moins clair que des types nommés, avec des membres nommés)
    • <nom_explicite>.h pour déclarer ton std::vector<Point2D>. Il peut être global, mais ce n'est généralement pas recommandé car ça peut générer des effets de bord difficiles à suivre...tu as alors deux choix pour avoir une "persistence":
      • point de vue orienté objet: tu définis un concept de type contenant cet état persistant. Ton initialisation est une fonction membre de cette classe, qui rend différents services en utilisant ces données
      • point de vue orienté procédure: une fonction appelante de plus haut niveau déclare le vecteur, qui lui est alors local, et est passé en argument à la fonction d'initialisation et à diverses fonctions qui utilisent le contenu du vector

      A toi de voir ce qui correspond à ton cas (difficile de savoir d'après ce que tu montres)

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Concernant les fichiers cpp:
    un point2D.cpp pour définir le constructeur (qui allège sérieusement l'écriture du push_back)
    un cpp avec la main et éventuellement, et éventuellement des fonctions appelées (à redécouper éventuellement si ça croit en volume)

    La multiplication des headers n'a aucun impact puisque les include sont automatiquement suivis.
    avoir plusieurs cpp nécessite une commande pour la compilation de chaque + une commande pour le link (automatisable avec divers outils, ou à la rigueur avec un script shell)

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 42
    Points
    42
    Par défaut
    Merci pour les info, et je constate que mon niveau en c++ ne doit pas arriver a la chaussette du tien, (tout depend de la taille de la chaussette me diras-tu ) ok j'arrete

    donc pour info c'est un programme en Qt pour afficher un graphique de donnees, je suis arrive 1 mois apres qu'un gars(largement plus performant que moi heureusement) avait deja fait beaucoup de travail (je vais pas te sortir tout le code ce serait bcp trop long et inutile), je realise dessus des fonctions genre zoomer, deplacer graphique, ... Actuellement j'avais fait une fonction ou l'operateur pouvait rajouter une croix sur le graphique lui permettant de connaitre les valeurs x/y du point. Sauf que jusqu'a present les coordonnees etaient retenues en pixels (QPointF) et lors du zoom ou du deplacement le point etait fixe sur l'ecran et pas sur le graphe. Chose que je desire donc faire et je me suis dit que c'etait long de tout recalculer lors du deplacement (chercher equivalent actuel des pixel , et refaire en sens inverse pour avoir la nouvelle position en pixels), d'ou le vecteur de 2 float pour retenir les donnees directement. mais si je garde la solution vecteur de 2 float j'ecrit quoi dans push_back? (apres avoir perdu bcp de temps dessus je veux bien savoir ce que j'avais oublie)

    a noter le main actuel ressemble a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mainwindow.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      MainWindow w;
      w.show();
     
      return a.exec();
    }
    donc taille ridicule, tout est repartit dans une bonne cinquantaine(j'ai pas compte) d'autres .h et .cpp

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Visiblement, pas de manière simple (car pour être utilisé avec un vector, un type doit par exemple être copiable simplement, et avec les tableaux ce n'est pas évident).
    Finalement, la défintion d'un type nommé pour tes éléments est:
    • plus simple
    • plus claire (les noms permettent d'explciciter la nature des données au lieu de laisser des listes de float ambigües)

    conclusion: pourquoi s'en priver?
    surtout qu'étant déjà dans un projet complet, ce n'est pas un header et un cpp de plus ou de moins qui vont t'étouffer...
    je t'encourage à diviser ton code en fichiers:
    => un header par type, +/- ce qui 'va avec' la définition d'un type donné
    => un cpp par ensemble cohérent (des fonctions complémentaires, les fonctions membres d'un type, ...)
    ça te semble peut-être plus compliqué à l'heure actuelle, mais au moment de se relire, des fichiers de taille réduite, avec un contenu cohérent et un nom bien choisi (justement parce que le contenu du fichier se limite à un tout cohérent au lieu d'une liste à la Prévert...donc on peut facilement mettre un nom dessus) auront un très bon impact sur ta consommation d'aspirine, crois moi

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    std::vector de std::pair ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 42
    Points
    42
    Par défaut
    bon j'ai résolu mon problème (j'ai commencé a faire ce qu'avait dit therwald et c'est une très bonne idee (merci encore) et me suis rendu compte en cours de route qu'un vector simple me permettait de stoker tout ce que je voulais plus simplement donc plus de pb. même si la solution était très bien therwald!

    sinon merci aussi pour cette nouvelle possibilité, je connaissais pas std::pair même si j'en ai pas eu besoin.

    désolé du dérangement, parfois je suis long à la détente

    (et j'ai retrouvé mon clavier azerty avec accents!^^)

    je met le sujet résolu.

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

Discussions similaires

  1. JTable dynamique en ligne et colonne
    Par morind79 dans le forum Composants
    Réponses: 1
    Dernier message: 23/03/2013, 23h07
  2. Réponses: 2
    Dernier message: 04/11/2010, 17h42
  3. Tableau croisé dynamique : données sur 2 colonnes
    Par damsmut dans le forum Excel
    Réponses: 2
    Dernier message: 23/09/2008, 14h55
  4. Réponses: 17
    Dernier message: 26/04/2007, 10h57
  5. Insertion dynamique de lignes en colonne dans un tableau
    Par lodan dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/03/2007, 07h18

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