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

MATLAB Discussion :

Classes et pointeurs


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut Classes et pointeurs
    Bonjour,

    J'ai toujours utilisé Matlab pour des scripts bateaux (sans jamais utiliser de classes), et j'ai jamais réellement touché à la POO.

    Je développe un script pour simuler une régulation de température dans un bâtiment comportant une dizaine de zones. Pour faire simple et pas avoir 400 variables et un script imbuvable, je passe par des classes. Pour mettre à jour plusieurs valeurs d'un coup, je passe par une ligne du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Z11.data.temperature = Z11.data.temperature.setValue(20);
    Y a t'il une solution pour simplifier la ligne et faire directement, en passant par des pointeurs (qui ne semble pas exister sous matlab) ou autre?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Z11.data.temperature.setValue(20);
    Si ça peut aider, ma classe est définie comme suivant:

    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
    classdef cValue
    	properties
    		previous = [];
    		now = 0;
    		future = [];		
    		previousMaxSize = 0;		%	Taille maximale du vecteur des valeurs passées
    		previousCurrentSize = 0;	%	Taille actuelle du vecteur des valeurs passées
    		futureMaxSize = 0;			%	Taille maximale du vecteur des valeurs prédites
    		futureCurrentSize = 0;		%	Taille actuelle du vecteur des valeurs passées
    	end
     
    	methods
    		function obj = setValue(obj, val)			
    			obj.previousCurrentSize = min(obj.previousCurrentSize+1, obj.previousMaxSize);
     
    			for i=obj.previousCurrentSize:-1:2							
    				obj.previous(i) = obj.previous(i-1);				
    			end
     
    			obj.previous(1) = obj.now;			
    			obj.now = val;
     
    		end
    	end
    end
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Pour celà il faut que ta classe hérite de la classe handle, et tu peux faire ca de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    classdef cValue < handle
    ...
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Nickel, c'est exactement ce qu'il me fallait!

    merci

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Dériver de dynamicprops donne en général un classe plus flexible (avec propriétés dynamiques)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    Je reviens pour un problème que j'ai observé dans mon script. J'ai bien rajouté le " < handle" dans toutes mes classes, ce qui a résolut le problème du premier message.

    Par contre, quand j'affecte une valeur avec la fonction setValue(20), toutes les variables utilisant la classe cValue sont affectées.

    Par exemple:

    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
    >> Z11 = cZone;
     
    >> Z12 = cZone;
     
    >> Z11.data.temperature.now
     
    ans =
     
         0
     
    >> Z12.data.temperature.now
     
    ans =
     
         0
     
    >> Z11.data.temperature.setValue(20);
     
    >> Z11.data.temperature.now
     
    ans =
     
        20
     
    >> Z12.data.temperature.now
     
    ans =
     
        20
    La fonction Z11.data.temperature.setValue(20) affecte correctement la valeur 20 à Z11.data.temperature.now, mais Z12.data.temperature.now est aussi modifié...

    Des idées?

  6. #6
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    A tout hasard, Z11.data.temperature et Z12.data.temperature ne pointeraient-ils pas sur le même objet?
    Comment est construite ta classe cZone?

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par duf42 Voir le message
    A tout hasard, Z11.data.temperature et Z12.data.temperature ne pointeraient-ils pas sur le même objet?
    Comment ca?

    En les déclarants avec le code suivant, je créé deux variables séparées non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Z11 = cZone;
    Z12 = cZone;
    Ma classe cZone:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    classdef cZone < handle
    	properties
    		data = cData();
    		HVAC = cHVAC();
    		eclairage = 0;
    	end
    end
    Et cData, qui utilise cValue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    classdef cData < handle
    	properties
    		occupation = cValue();
    		temperature = cValue();
    	end
    end

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Ca marche correctement en ajoutant une initialisation de la classe lors de la création (après le bloc properties):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	methods
    		function obj = cZone()
    			obj.data = cData();
    			obj.HVAC = cHVAC();
    			obj.eclairage = 0;
    		end
    	end

  9. #9
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    C'est "intéressant" comme comportement. Quelle version de MATLAB utilises-tu?
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    La version 7.14 (R2012a) , donc avec un réel support des classes en comparaison avec d'autres versions plus anciennes.

  11. #11
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut properties ont un comportement statique
    Attention rien à voir avec la version de Matlab, les properties définies dans le bloc properties sont initialisées avec la même valeur, au moment ou la classe est chargée, donc indépendamment d'une instance.

    En général, ce sont des valeurs byvalue (comportement de matlab par défaut), donc les modifications seront bien distinctes sur chaque instance; mais ici, data et HVAC seront partagées par toutes les instances.

    La solution consiste effectivement à passer ces initialisations dans le constructeur plutôt que dans les properties (ou je les laisse à nan en général)

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Attention rien à voir avec la version de Matlab
    D'après les articles que j'ai trouvé, les classes ont été introduites sous matlab avec la version 2008a. Si j'avais eu une version antérieure je n'aurai pas cherché plus loin.

    Citation Envoyé par VV33D Voir le message
    La solution consiste effectivement à passer ces initialisations dans le constructeur plutôt que dans les properties (ou je les laisse à nan en général)
    Vu qu'une valeur par défaut est attribuée dans le bloc properties, je pensais l'initialisation optionnelle avec le constructeur. Mauvaise idée!

  13. #13
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    je pensais l'initialisation optionnelle
    Seulement si on dérive de dynamicprops plutot que de handle, et encore, il faut une syntaxe particulière pour le déclarer.

    Si j'avais eu une version antérieure
    Tu n'aurais même pas écrit classdef !

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Tu n'aurais même pas écrit classdef !
    Je fais mes scripts sous notepad++, puis je les exécute sur une machine distante, donc je peut écrire ce que je veut! Après que ça marche, c'est une autre histoire

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Tant que j'y suis, il est possible de rajouter des champs à la volée sur une classe, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zone.data.monNouveauChamp = maClasse

  16. #16
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Oui, c'est l'alternative à dériver de dynamicprops, et utiliser P = addprop(H,'PropertyName')

    Cela dit, attention aux fonctions qui utilisent setfield ou subsref sur ton instance. Dans ce cas, il peut être prudent de surcharger subsref/subsasgn

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 74
    Points : 114
    Points
    114
    Par défaut
    Merci, ça marche parfaitement!

    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
    >> Z = cZone;
     
    >> Z.data.addprop('test');
     
    >> Z.data.test = cValue;
     
    >> Z.data.test
     
    ans = 
     
      cValue handle
     
      Properties:
                   previous: 0
                        now: 0
                     future: 0
            previousMaxSize: 0
        previousCurrentSize: 0
              futureMaxSize: 0
          futureCurrentSize: 0
                      total: 0
                        qte: 0
     
      Methods, Events, Superclasses
     
    >>

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

Discussions similaires

  1. class et pointeur
    Par loisir1976 dans le forum Débuter
    Réponses: 1
    Dernier message: 04/04/2009, 22h26
  2. Pb avec classes et pointeurs
    Par Fahmi06 dans le forum C++
    Réponses: 3
    Dernier message: 19/02/2008, 17h39
  3. [POO] Classe avec pointeurs de classes
    Par dridri dans le forum Langage
    Réponses: 3
    Dernier message: 15/02/2008, 17h53
  4. Problèmes avec classes et pointeurs
    Par Anas1984 dans le forum C++
    Réponses: 2
    Dernier message: 02/11/2006, 12h49
  5. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57

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