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 :

Récuperer une même variable depuis plusieurs fonctions


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut Récuperer une même variable depuis plusieurs fonctions
    Bonjour à tous,

    J'ai deux fonctions distinctes faisant différents calculs en traitement du signal... Ce que je faisait est que j'enregistrais les résultats de chacun des blocs dans un fichier XML. Hors je ne dois en fait avoir qu'un seul fichier pour pouvoir le passer à ma GUI.

    Du coups j'ai fais un main.m appelant mes deux fonctions et je veux donc enregistrer toutes mes variables à la fin de ce script dans un seul fichier XML. hors lorsque je fais mon code j'obtiens l'erreur "metric undefined"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function main(wave,A,B,C)
     
    function1 (wave,A,B);
    function2(wave,C);
     
    xml_save('measures.xml', metric)
     
    end
    Car j'ai définit mes mesures comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    metric.result= lvl;
    metric.result.delta1 = deltaf1;
    metric.result.delta2 = deltaf2;
    metric.result.delta3 = deltaf3;
    metric.result.delta4 = deltaf4;
    metric.result.time = timing;
    Avec la première mesure dans la fonction 1 et les autres dans la fonction 2.

    Comment puis je faire pour qu'il aille directement chercher mes valeurs dans chaque fonctions depuis mon main ??

    Merci d'avance !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Le problème viens du fais que lorsque j’exécute mes scripts dans mon main, il ne garde pas les variables en mémoire... Je ne peux donc pas récupérer les valeurs de mes variables pour les enregistrer dans le fichier XML car elle ne sont pas accessibles directement depuis mon main ! Any idea pour y accéder ?

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    salut

    pour y acceder tu peux :
    - utiliser des points d'arrêt dans ton main
    - transformer ton main (fonction) en script
    - sauvegarder le contexte dans un .mat avec la fonction save
    ...

    bien sur les outils de débogage (points d'arrêt) restent la meilleure solutions
    Fabien

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Pour moi les points d'arrets n'ont vocation qu'a être utilisés pour du débogage... Je me trompe ? Du coups je ne vois pas en quoi les utiliser réglerai mon problème ...

    L'utilisation d'un script marcherai mais je dois entrer des variables d'entrées dans mes fonctions du coups je suis obligé d'utilisé la commande "fuction()" .
    Ou est ce que j'ai loupé un truc ?

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    bon, bein je crois que je n'avais pas compris la question ...
    si je la comprend mieux maintenant, je te suggérerais de rajouter ta structure résultat en entrée/sortie de chaque fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function main(wave,A,B,C)
     
    metric = struct;
    metric = function1 (wave,A,B,metric);
    metric = function2(wave,C,metric);
     
    xml_save('measures.xml', metric)
     
    end

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Par contre je me pose une question... Lorsque j'ajoute "metric" en input de ma fonction je suis donc obligé de la précisé non ? Car lorsque je run ma fonction main il me dit:
    error: value on right hand side of assignment is undefined
    Il me pointe ça sur la ligne ou j'appelle ma première fonction et ne prend donc pas en compte
    metric= struct;

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    oui bien sur
    tu peux par contre la rendre optionnelle (cf narginchk, nargin, varargin ...)

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Ok, par contre je suis un peu un "noob" des vargin et compagnie ... Je dois bien l'utiliser bien avec des bornes c'est ça ?

    Donc si je spécifie cela
    minargs=3; maxargs=4;
    si je ne spécifie que 3 arguments sur les 4 de ma première fonction, ça devrai passer si j'ai bien compris... que je spécifie par la suite dans :
    narginchk(minargs, maxargs)
    Cependant quand je fais ça il reconnait pas varargin... Je l'utilise de cette manière

    function1 (wave,A,B,metric,varargin);
    C'est bien la bonne méthode non ?

  9. #9
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    il y a deux méthodes (que tu mélange un peu là) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function1 (wave,A,B,metric)
    narginchk(3,4);
    if nargin < 4
      metric = [];% valeur par defaut
    end
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function1 (wave,A,B,varargin)
    narginchk(3,4);
    if numel(varargin) >= 1
      metric = varargin{1}; % on récupère la valeur passée en paramètres
    else
      metric = [];% valeur par defaut
    end
    la première méthode est plus adapté dans ton cas
    la seconde est utile quand plusieurs paramètres sont optionnels
    dans ce cas, on fonctionne souvent par paire d'arguments avec un parseur, comme beaucoup de fonction matlab

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Pour moi ça ne peut pas marcher... Matlab étant séquentiel il affiche directement l'erreur après avoir rencontré l'appel de la fonction et ne regarde même pas le nargin, il affiche donc:
    error: value on right hand side of assignment is undefined
    Ou alors j'ai mal compris un truc...

    Car c'est ce qui se passe lors de l’exécution de mon code :
    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
    function main(wave,A,B,C)
     
    metric = struct;
    metric = function1 (wave,A,B,C)
    narginchk(3,4)
    if nargin < 4
      metric =[];
    end
     
    metric = function2  (wave,A,B)
    narginchk(2,3)
    if nargin < 3
      metric =[];
    end
     
    xml_save('measures.xml', metric)
     
    end

  11. #11
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    Citation Envoyé par Lord Bouillon Voir le message
    Ou alors j'ai mal compris un truc...
    je te confirme !

    met ton code en entier stp ...

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    C'est le code entier que je t'ai passé dans mon poste précédent. La première fonction calcule une métrique et la deuxième quatre. Le fichier XML est sensé récupérer toutes les valeurs du coups ...

  13. #13
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    ce que tu as passé ne risque pas de marcher ni de générer l'erreur que tu mentionne!!!
    ensuite ou sont les définitions de tes fonctions fonction1 et fonction2 ??
    c'est ces définitions que tu devrais mettre les indications que je t'ai donné !!! et non dans le corps de main !!

    fab

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Ah oui !! My bad sur ce coups ! Mais du coups je me posait la question, plutot que d'introduire ma structure que je n'utilise potentiellement pas, pourquoi ne pas faire un return et essayer de récupérer dans mon main les valeurs des mesures ? Si j'arrive à avoir acces à mes variables c'est tout gagné je n'ai plus qu'à faire ma structure dans mon main et save en XML nan ?

    voici précisément la définition de mes fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function SNR = snrCalc (wavFile,tStart,tStop,metric)
    body
    end
    Et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [deltaf1,deltaf2,deltaf3,deltaf4,tRamp] = DriftCalc(wavFile,frameSt)
    body 
    end
    Cependant avec ce formatage ça ne fait que me retourner en mode printf mes valeurs mais elles ne sont pas accessible, d'ou ma question sur le return...

  15. #15
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    la bonne manière de faire est celle que je t'ai indiquée
    si les sorties supplémentaires apparaissent en mode fprintf sur la console, il suffit de terminer la ligne d'appel à ta fonction par un ";" : il sert à cela
    ensuite une fois le prototype de ta fonction définie avec ses sorties, il faut les affecter à des variables pour qu'elle deviennent accessible !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function main(wave,A,B,C)
    ...
    % appel de la fonction et stockage de SNR
    SNR = snrCalc (wavFile,tStart,tStop);
    ...
    enfin "return" ne sert qu'à sortir prématurément d'une fonction !! l'appel à "return" ne change rien à l'accessibilité des variables internes à la fonction appelée

    prend le temps de tout bien relire ce post, tu as tous les éléments

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 39
    Points
    39
    Par défaut
    Super merci tout marche comme je veux ! Je me suis embrouillé avec les structures et l’accessibilité de mes variables... Je faisais n’importe quoi en fait

    Merci beaucoup pour l'aide fab

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

Discussions similaires

  1. [DATA] Répéter une même opération sur plusieurs variables
    Par Elsa.b dans le forum SAS Base
    Réponses: 5
    Dernier message: 16/06/2015, 14h41
  2. Problème pour passer une variable sur plusieurs fonctions
    Par pierre3401 dans le forum Général Python
    Réponses: 3
    Dernier message: 13/11/2013, 11h14
  3. Plusieurs valeurs d'une même variable : colonnes
    Par derfer dans le forum Débutez
    Réponses: 4
    Dernier message: 02/12/2012, 18h24
  4. Utilisation d'une même variable dans différents fonctions de Callback
    Par houjuventini dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 16/11/2007, 08h58
  5. [Débutant - Avis] même variable dans plusieurs pages...
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 16/12/2004, 22h50

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