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 :

Attribution de valeur à une matrice


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut Attribution de valeur à une matrice
    Bonjour,

    Prenons un proto d'une fonction x suivante :
    void x(bool (*b)[2]);
    Or lorsque j'appel cette fonction comme suit j'ai une erreur à la compilation:

    x({{true,true},{true,true}});
    Je pensais utiliser une variable bool[2][2] intermédiaire mais je me confronte à un problème :

    bool b[2][2] = { {true,true},{true,true} }; // Ceci marche très bien

    b = { {true,true}, {true,true} }; // Ceci en revanche ne compile pas
    Donc pourrais-je savoir si il y a un moyen pour définir la valeur de ce tableau, sachant que bon la solution alternative trouvée m'ennuie un peu du fait que l'appel à la fonction x serait répétée une dizaine de fois d'affilée et donc ça nécessiterait 10 variables différentes. Je cherche donc une solution qui me permettrait d'éviter le for(int i=0;i<2;i++) for(int j=0;j<2;j++) b[i][j] = true; (d'autant plus que là j'ai utilisé des valeurs d'exemple, ce qui signifirait à devoir écrire quatre lignes...

    En vous remerciant.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool b[2][2] = { {true,true},{true,true} }; // Ceci marche très bien
    OK :Il s'agit là de l'initialisation d'un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b = { {true,true}, {true,true} }; // Ceci en revanche ne compile pas
    Normal : b est un tableau et il est IMPOSSIBLE d'avoir b = qq chose : l'identificateur d'un tableau N' EST PAS une lvalue. Autrement dit , il ne représente pas un objet mais une valeur (l'adresse du premier objet du tableau (pour simplifier, car il y a à considérer le type de cette valeur))
    Pourquoi ne pas modifier cette fonctionen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void x(bool , bool, bool ,bool );
    ce qui permet d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x(true,true,true,true);

  3. #3
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    J'y ai pensé, mais j'ai simplifié.

    Cette fonction x, c'est le constructeur d'un objet et il y a déjà un petit paquet d'arguments, en outre, pour simplifier j'ai mis bool[2][2] mais en réalité c'est bool[4][4], donc comprends un peu mon emmerdement:).

    C'est quand meme ennuyeux de pas pouvoir réinitialiser et redéfinir un tableau, que je puisse eviter d'avoir dix variables bool (*)[4] où ça appel dix fois x().

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Cette fonction x, c'est le constructeur d'un objet et il y a déjà un petit paquet d'arguments, en outre, pour simplifier...
    C'est vrai que ce n'est pas cool.
    Tes 16 valeurs booléennes sont utilisées comment dans ton constructeur ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Tout simplement attribuée à une variable (*bool)[4] :)

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tout simplement attribuée à une variable (*bool)[4] :)
    Non, (bool*)[4] ?? mais je suppose que tu fais une COPIE de ces paramètres dans des données membres style bool [4][4] ou bool [16] ou .., mais pas des copies de pointeurs

  7. #7
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Oui pardon bool (* )[4].

    ben pour le moment j'utilisais des b = b1 quoi, mais bon si il faut faire du membre à membre... c'est emmerdant quand meme :/

    En tous cas tu me conseilles de prendre quoi comme solution au final pour avoir dans la classe un tableau à deux dimensions 4*4 en passant par le constructeur pour attribuer la valeur aux membres du tableau sachant qu'une dizaine d'instance de cette classe va etre faite (avec des valeurs différentes pour bool[4][4] bien sur) ?

  8. #8
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    pour le moment, c'est juste une copie de pointeur que tu fait, ça peut être très dangeureux et mener à des pointeurs fantômes ou à des fuites de mémoire, ou des delete dans la pile, enfin... plein de truc chelou quoi...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Peut être peux tu modifier ton constructeur x :: x(...). Il pourrait prendre prendre comme argument une valeur du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x(....., true00 | true 01 | true10,...)
    pour signifier l'équivalent de b[00] et b[01] et b[10] à true;
    après des
    #define true00 1
    #define true01 2
    #define true02 4
    #define true03 8
    #define true10 16
    pour clarifier l'écriture et décoder ce paramètre dans le constructeur pour initialiser correctement les données membres de l'objet x

  10. #10
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Mouais ça devient cependant lourd car si j'ai bien compris ton raisonnement il me faut 16 defines ? et meme le double si je mets les false??.

    C'est quand meme lourd à vrai dire je me demande si je vais pas tout simplement mettre 16 arguments au constructeurs, après tout je l'appel que lors du lancement de l'application donc bon..

  11. #11
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    pas le double pour les false, parce que les true que tu ne spécifie pas sont à false par défaut ensuite tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B[0][1] = (values & true01) == true01;
    mais c'est effectivement un peu lourd :\

    le plus simple est, je pense, une boucle qui copie tes valeurs
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  12. #12
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    oui sauf que les valeurs ne sont pas mis dans un ordre précis, j'ai dix instances de la classe avec à chaques fois le tableau de booléens 4x4 qui varie donc bon...

  13. #13
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    d'où : le plus simple est de faire une matrice intermédiaire et d'en faire ensuite une copie en profondeur...

    à la limite, tu pourrais même faire une classe intermédiaire qui te permettrait de faire passer ta matrice...

    tu le ferais genre comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x(......, bool_4_4_matrice(val00, val01, val10, val11), .......);

    Comme ça tu pourras même stocké simplement une bool_4_4_matrice dans ta classe plutôt qu'un pointeur

    bien sûr il te faudra penser à définir les constructeurs de copie, et opérateur = pour ta classe bool_4_4_matrice sinon, gare aux pointeurs fantômes :S
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  14. #14
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ...ton raisonnement il me faut 16 defines ? et meme le double si je mets les false??.
    Swoög:
    pas le double pour les false, parce que les true que tu ne spécifie pas sont à false par défaut
    Bien sur!
    C'est pas leger-leger d'accord, mais ce n'est pas loud-lourd : on n'est pas à une dizaine de lignes près (en plus non executables). D'un point de vue d'appel du constructeur, c'est plus léger que le passage de 16 arguments supplémentaires. Si tu veux pouvoir spécifier directement les valeurs, c'est peut être le moins contraignant.
    A ta place, je stockerai sans doute cette donnée sous la forme d'un int et je surchargerai un opérateur [][] pour y accéder
    oui sauf que les valeurs ne sont pas mis dans un ordre précis
    peu importe
    Swoög :
    dans ta classe plutôt qu'un pointeur
    Je crois que nous sommes d'accord que le stockage d'un pointeur est à exclure

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2013, 16h38
  2. [Débutant] Ajouter des valeurs à une matrice (en conservant la matrice de base)
    Par nilsmatlab dans le forum MATLAB
    Réponses: 38
    Dernier message: 17/06/2011, 18h27
  3. [AC-2007] Attribution de valeurs à une zone de texte
    Par glooping dans le forum IHM
    Réponses: 6
    Dernier message: 14/09/2009, 15h11
  4. Attribution de valeur à une variable
    Par zed80 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/03/2009, 09h23
  5. valeurs propres d'une matrice et vecteurs propres
    Par la_fantomas dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/05/2005, 15h35

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