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 :

Matrice dans un vecteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut Matrice dans un vecteur
    Bonjour à tous,

    Dans mon programme, je remplis, pour une image donnée, une matrice allouée dynamiquement. Cette matrice est déclarée à l'extérieur et remplie à l'intèrieur d'une fonction.

    'height' et 'width' sont les dimensions de mon image.
    Je ne les connais pas à l'avance puisque les images changent régulièrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int **Img;
    Img = (int**)malloc(height*sizeof(int*));
    for (int i = 0; i < height; ++i)
    {
            Img[i] = (int*)malloc(width*sizeof(int));
    }
    Cette facon de faire fonctionne pour une seule image.

    A présent, je voudrai réaliser ceci pour un nombre donné d'images, mais dont les dimensions sont identiques.

    J'aimerais faire quelque chose dans le genre:
    Une déclaration en amont, en attente de la taille exacte du nombre d'image (NbImg) et des dimensions de l'image (Width, Height).

    Je ne connais le nombre d'image qu'une fois les images chargées.
    donc comment reserver dans mon vecteur NbImg 'emplacements' de dimensions Width*Height, pour la matrice?

    mais je ne sais pas comment m'y prendre.

    Est ce que quelqu'un pourrait m'aider ?
    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ouch... int**, malloc... tu es sur que c'est du C++ que tu veux faire et pas du C

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut
    je suis pas tres bon en C++.
    ca donnerait quoi une déclaration de matrice sans malloc ?

    je vois pas comment faire avec du 'new'

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut
    j'aurais appris un nouveua truc aujourd'hui en C++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int **mat;
    int L = 5;
    int C = 7;
    mat = new int*[L];
    for(int i=0;i<L;i++)
    {
        mat[i] = new int[C];
    }
    Ca a l'aire de fonctionner.

    Mais pour mon problème, tu as une idée pour mettre ca dans un vecteur ?

  5. #5
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Juste comme ça, indépendamment de la question C ou C++, pourquoi n'alloues-tu pas un tableau de height * width int (plutôt qu'un tableau de pointeurs vers des tableaux d'int) ?

    Voici un petit exemple de code avec new :
    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
    typedef int pixel ; // plus lisible et plus facile à faire évoluer
     
    void treat_pixel ( pixel & p )
        {
        p = 123 ;
        }
     
    void foo ( int height , int width )
        {
        pixel * image = new pixel [height*width] ;
     
        for ( int y = 0 ; y < height ; ++y )
            for ( int x = 0 ; x < width ; ++x )
                treat_pixel( image[y*width+x] ) ;
        }
    Mais attention, on est encore loin du c++ élégant utilisant la stl...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut
    Ok,


    Et si je veux stocker cette matrice comme tu me proposes pour chaque image que j'ai.

    Je présente mieux la situation. je suis sous QtCreator avec un mainwindow.h
    je voudrais y déclarer le vector, ou autre qui contiendra toutes mes matrices.

    et dans le mainwindow.cpp, lors de l'appel d'un slot, d'une fontion; je l'initialise.

    Ca se présente comment ?

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    je suis pas tres bon en C++
    Donc fais au plus simple.

    Ca a l'aire de fonctionner
    L'expression exacte est : "ça tombe en marche"...


    Pour le problème des conteneur en 2D, c'est un problème régulièrement abordé sur le forum, un petite recherche pourra t'aider. Pour résumer, l'idée est d'utiliser un vector simple de taille width*height et d'accéder aux éléments avec () :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T& operator() (int i, int j) { return elems[i+j*width]; }
    (remarque : après relecture, c'est la solution que tu proposes presque Captain'Flam, mais en utilisant vector)

    Si tu débutes en C++, prend comme règle de base : "interdiction d'utiliser malloc, free et new[]". Tu verras plus tard quand enfreindre ces règles.

    Tu peux regarder par exemple la classe DynamicArray2D de QExtend (je viens de faire le commit pour te montrer l'idée général, le code, n'est pas encore validé, ne fait pas un copié-collé)

    Au finale, ton code doit se structurer de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MatriceAlloueeDynamiquement 
    {
       int width;
       int height;
       std::vector<int> elems; // tu peux aussi mettre int en paramètre template
    };
     
    class MonConteneurDImage 
    { 
       std::vector<MatriceAlloueeDynamiquement> elems; 
    };

    Autre question : si tu utilises Qt, pourquoi ne pas utiliser QImage ? (ou QPixmap ou autre)

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

Discussions similaires

  1. [Débutant] Ecriture dune matrice avec 2 colonnes dans un vecteur colonne
    Par abel413 dans le forum MATLAB
    Réponses: 12
    Dernier message: 27/06/2013, 10h35
  2. [Débutant] afficher les valeurs d'une matrice dans un vecteur ?
    Par Imène_23 dans le forum MATLAB
    Réponses: 3
    Dernier message: 21/08/2011, 12h39
  3. Stockage diagonale de matrice dans un vecteur
    Par ClaireA dans le forum Fortran
    Réponses: 8
    Dernier message: 18/11/2009, 14h16
  4. Réponses: 12
    Dernier message: 17/05/2009, 15h21
  5. Réponses: 14
    Dernier message: 28/07/2006, 10h20

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