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

Langage Perl Discussion :

Modification de tableau en attribut d'objet


Sujet :

Langage Perl

  1. #1
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Modification de tableau en attribut d'objet
    Bonjour,

    Je dispose d'un objet avec un attribut BESOINS qui est un tableau de 4 valeurs.
    Quand j'effectue une action sur cet objet, je dois modifier ce tableau et lui ajouter une liste modificative, terme à termes.

    Exemple :
    BESOINS = (10, 0, 6, 5)
    Liste modificative de mon action : (-8, +4, +1, +1)
    Besoins après action : (10-8 , 0+4, 6+1, 5+1) = (2, 4, 7, 6)

    deux questions :
    * Existe-t-il un autre moyen, plus élégant, qu'une boucle et d'une addition simple terme à terme pour faire ça? ou un module quelconque sur des opérations avec des matrices existe? (dans ce cas, pas sur que ce soit fondamentalement plus efficace...?)
    * Surtout, je me pose la question de l'accès à ce tableau. Je m'y connais très peu en POO ; naïvement je me dis que $this->{BESOINS} renvoie la référence, et non le tableau, si? Dois-je systématiquement récupérer la référence de ce tableau, la modifier, et refaire pointer vers ma nouvelle liste?
    Genre pour le moment j'ai un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $this -> {BESOINS} = ajoute ($this -> {BESOINS} , @liste_modificative) ;	
     
    sub ajoute{
    	my ($ref, @valeurs) = @_ ;
    	my @temp = @$ref ;
    	for ($i = 0, $i<@temp , $i++){$temp[$i]+=$valeurs[$i]}   #la fameuse boucle, sujet de ma première question ;)
    	$ref = \@temp ;
    	return $ref ;
    }
    Et je trouve ça un peu moche... !
    D'avance merci pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Pour ta première question, oui il y a moyen de faire autrement, mais ça reviendra au même, en définitive il y aura une boucle, même si elle est sous-jacente.

    Sinon, on peut modifier directement un tableau avec la référence. Voici un exemple sous le debugger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      DB<1> $tab_ref = [1, 2, 3, 4]; # référence à un tableau anonyme
     
      DB<2> $_++ for @$tab_ref; # modification du tableau en passant par la référence
     
      DB<3> x \$tab_ref;
    0  REF(0x302ef598)
       -> ARRAY(0x3002a088)
             0  2
             1  3
             2  4
             3  5
    Cela dit, en programmation orientée objet, il est généralement très mauvais d'accéder directement aux objets, même si c'est techniquement possible. Il faut passer par des méthodes. (A moins bien sûr que tu ne sois en train d'écrire une méthode, tu n'en dis pas assez...)

  3. #3
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci !
    Oui oui, "ajoute" est une fonction que j'ai extraite d'un bout de méthode.


    Ca veut dire que je dois pouvoir faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach $niveau (@{$this -> {BESOINS}} {$niveau += $liste_modificative[$i]} ;
    avec la boucle qui va bien sur $i ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    En principe, tu peux remplacer la fonction ajoute de ton premier post par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub ajoute{
    	my ($ref, @valeurs) = @_ ;
    	# my @temp = @$ref ;
    	for ($i = 0, $i<@$ref , $i++){
    		$$ref[$i] += $valeurs[$i]; 
    	}
    	return $ref ;
    }
    (Mais je ne peux pas tester, n'ayant pas tes données.)

    Tu peux aussi sans doute mettre la boucle for directement dans le code, sans avoir besoin d'appeler une autre fonction.

  5. #5
    Membre à l'essai Avatar de myspanique
    Femme Profil pro
    Prof de maths + Stagiaire en informatique
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prof de maths + Stagiaire en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Tu peux aussi sans doute mettre la boucle for directement dans le code, sans avoir besoin d'appeler une autre fonction.
    C'est déjà le cas, en fait. Mon explication était pas très claire, mais j'ai juste extrait ce bout de code du contenu de ma méthode

    Merci en tous cas, le temps de mettre en place tout mon système , et je teste ça !

Discussions similaires

  1. Tableau de valeur remplaçant attribut d'objet
    Par FloCAD dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 07/08/2015, 00h44
  2. [POO] Tableau en attribut d'un objet
    Par Gaetch dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2010, 13h50
  3. Pb lors de modification de valeur d'attribut d'une classe.
    Par cecileWaseda dans le forum C++Builder
    Réponses: 4
    Dernier message: 04/08/2006, 23h19
  4. Réponses: 4
    Dernier message: 20/07/2006, 10h35
  5. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45

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