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 :

fonction imbriquée "mysubfun1" ne "voit" plus variable déclarée dans fonction mère myfun1


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut fonction imbriquée "mysubfun1" ne "voit" plus variable déclarée dans fonction mère myfun1
    Salut,


    j'ai un code du type:

    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
     
    function myfun1
    %%fonction quelconque
    ...
    var1=12345;
    ...
    %exécution de la fonction imbriquée mysubfun2
    mysubfun2;
    ...
     
    %code des fonctions imbriquées de myfun1. il y a deux fonction imbriquées
     
    function mysubfun 1
    disp('et le résultat est:')
    2*var1
    end
     
    function mysubfun2
    myfun2(...,@mysubfun1,...);
    end
    end
    Dans un autre fichier m

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function myfun2
    %grâce au pointeur vers mysubfun2 entré en paramètre lors de l'appel de myfun2
    % ce pointeur est connu de la fonction myfun2
    feval(@mysubfun1)
    end

    Mon problème est le suivant:
    Lors de l'exécution du programme, matlab renvoit une erreur:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ??? Undefined function or variable "var1".
     
    Error in ==> myfun1>mysubfun1 at 55
            var1
     
    Error in ==> myfun2 at 135
    feval(pointerToMysubfun1);
     
    Error in ==> myfun1>mysubfun2 at 98
                myfun2(...,@mysubfun1,...);
     
    Error in ==> myfun1 at 42
                mysubfun2


    C'est à dire que la fonction imbriquée mysubfun1 ne "voit" plus la variable var1 qui est pourtant déclarée dans la fonction mère myfun1.
    1) est-ce que cela est normal?
    2 est-ce que cela est du au fait que la fonction imbriquée mysubfun1 est appelée de l'extérieur de myfun1 (par myfun2) et donc les variables internes de myfun1 ne sont plus vues par la fonction imbriquée de myfun1 : mysubfun1?
    3) comment résoudre le problème, à savoir que la variable var1 soit "vue" par mysubfun1 et déclarée dans la fonction mère myfun1?

    merci d'avance pour vos réponses (surtout la question 3)

  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,

    Je sais pas si c'est la source de ton problème, mais pourquoi utiliser FEVAL? L'intérêt d'un handle de fonction est justement de se passer des eval:

    Sinon, présenté comme ca ton code à l'air assez tordu Y a-t-il une bonne raison pour appeler à partir de ta fonction une fonction dans un autre fichier qui va appeler une fonction de ton premier fichier?

    Bonne apm,
    Duf
    Simulink & Embedded Coder

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

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut
    salut duf42

    merci d'essayer de répondre
    mon code, il a l'air tordu parce que je l'ai simplifié (oxymore ) Les fonctions sont bien plus compliquées en fait.

    tu as peut-être raison pour feval. Mais je crois pas que ca résout mon problème.

    En revanche, j'ai une piste.
    Un précédente version du programme fonctionnait quand la fonction externe myfun2 était appelée depuis la fonction mère myfun1, sans que la foonction imbriquée mysubfun2 intervienne. La source de l'erreur serait donc que c'est une fonction imbriquée, dont les variables ne sont pas visibles par le autres fonctions imbriquées, qui appelle myfun2 qui appelle à son tour la fonction imbriquée mysubfun1.

    Mais ca ne résout quand même pas le problème, à savouir que numElem soit reconnue par mysubfun1.

    J'ai essayé de déclarer var1 comme une variable de type persistent, mais ce ne sert à rien pour l'instant car le signal d'erreur reste le même.

    une idée?

    merci

  4. #4
    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
    As-tu essayé en déclarant le handle de ta fonction imbriquée dans ta fonction principale, un truc du genre:
    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
    function myfun1
    %%fonction quelconque
    
    myfcnhdl = @mysubfun1;
    
    ...
    var1=12345;
    ...
    %exécution de la fonction imbriquée mysubfun2
    mysubfun2;
    ...
    
    %code des fonctions imbriquées de myfun1. il y a deux fonction imbriquées
    
    function mysubfun 1
    disp('et le résultat est:')
    2*var1
    end
    
    function mysubfun2
    myfun2(...,myfcnhdl,...);
    end
    end
    Simulink & Embedded Coder

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

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut
    oui, c'est d'ailleurs comme ca que le pointeur est transmis à la fonction externe myfun2.
    le pointeur de mysubfun1est enregistré dans la nesting functionmyfun1 . Puis il est transmis à myfun2 à partir de la nested function mysubfun2.

  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
    Je pense qu'il faudrait que tu nous montres plus de code parce que juste avec les éléments que tu as donné ca ne pose aucun problème (je viens juste de tester), il doit donc y avoir autre chose...
    Simulink & Embedded Coder

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

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut résolution
    Ca Marche!!

    en fait, déclarer la variable var1 comme "persistent" fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    myfun1
     
    persistent var1
    ...
     
    <div style="margin-left:40px">function ...
     
    ...
     
    end</div>end
    mais il ne faut pas oublier de réinitialiser tous les fichiers mis en jeu après la modification du programme. C'est à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    clear myfun1.m myfun2.m
    %relancer le calcul
    myfun1
    Finalement, je crois bien que si le pointeur d'une nested function est transmis à uen fonction externe à partir d'une sconde nested function, les variables déclarées dans la fonction principale (qui englobe les deux nested functions sus-évoquées) ne sont plus "vues" par la nested function, lorsque celle-ci est appelée par la fonction externe (à laquelle est transmis le pointeur de la nested function). C'est pourquoi il est important de déclarer les variables comme "persistent", afin qu'elles soient vues d'un appel à l'autre.

    tchaô
    oodbae

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

Discussions similaires

  1. [Google Maps] Récupérer variable dans fonction imbriquée
    Par Gentletid dans le forum APIs Google
    Réponses: 4
    Dernier message: 07/04/2012, 02h47
  2. Incrementation variable php dans fonction JS
    Par Emilie34 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 19/04/2010, 13h18
  3. Problème dans fonctions imbriquées !
    Par Truth dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 25/06/2008, 08h13
  4. [MySQL] Problème de syntaxe avec variable utilisée dans fonction PHP et MySQL
    Par redvivi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/03/2008, 21h07
  5. [PHP-JS] pb de variable php dans fonction Js
    Par logone dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/06/2006, 23h20

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