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 :

Exécution d'un script dans une fonction contenant une autre fonction


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut Exécution d'un script dans une fonction contenant une autre fonction
    Bonjour,

    Je souhaite exécuter un script 'mon_script' dans une fonction 'ma_fonction' qui ressemblent à :

    Contenu de mon_script.m
    Contenu de ma_fonction.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [o] = function ma_fonction(i)
    mon_script
    end

    Le problème est que lorsque j'exécute la fonction "ma_fonction(123)" j'ai l'erreur :
    Attempt to add "A" to a static workspace.
    See MATLAB Programming, Restrictions on Assigning to Variables for details.
    Le script a été généré automatiquement et contient une foultitude de variables dont j'ai absolument besoin dans ma fonction. Je veux donc exécuter le script (de préférence sans le modifier ) pour récupérer les variables dans ma fonction. Est-ce possible ?

    Cordialement,

    ps: ça m'agace de ne pas savoir gérer les workspaces correctement... je pense que la réponse à cette question sera déjà géniale, mais si vous avez des tutos expliquant leurs fonctionnement/utilisation un peu plus en profondeur, je serais preneur... parce que la doc matlab n'est vraiment pas fournie, ils cachent bien leur poussin
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    marrant, chez moi ca marche bien

    en gros une fonction a son propre workspace, qu'elle détruit à la fin
    un script s'execute dans le workspace courant, soit le workspace 'base' si tu le lance de la command window, soit le workspace de la fonction si tu le lance depuis la fonction

    tu dois avoir un souci ailleurs

    mon code :
    la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function [ output_args ] = myfun( input_args )
    script;
    output_args = A*input_args;
    end
    le script
    et quand j'exécute depuis la commande window :
    j'obtiens bien :

  3. #3
    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,

    Déjà le code que tu nous as mis ne fonctionne pas puisque la déclaration de la fonction est fausse (inversion entre le mot-clé function et la sorties):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function [o] = ma_fonction(i)
    Ensuite, est-ce que tu nous as bien mis le contenu complet de ton fichier .m et est-ce que par hasard ta fonction ne serait-elle pas une fonction imbriquée (Nested function)?

    Duf
    Simulink & Embedded Coder

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

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Je ne peux pas poster les fonctions que j'ai codé telles quelles (conf.). J'ai donc donné la structure que je pensais être problématique sans avoir réellement vérifié, je le confesse... désolé

    Je vérifie tout ça et vous tient au courant.

    [EDIT] effectivement j'ai du mal formuler le problème... désolé. Je re-étudie la question pour la reposer correctement. Désolé pour le temps que j'ai fait perdre

    ==> Lefab : j'approuve ce que tu as dit
    ==> Duf : j'ai écrit ça directement sur le site et je me plante toujours dans l'ordre... et je ne peux pas faire de copier coller car je travaille sur un poste distant pour matlab... bref --> donc j'approuve aussi
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  5. #5
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Attempt to add "A" to a static workspace.
    See MATLAB Programming, Restrictions on Assigning to Variables for details.
    Une fonction qui contient une sous-fonction (voir code ci-dessous) a un workspace statique, cad dans lequel on ne peut pas rajouter une variable qui n'y est pas déclarée à la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function X = A(Y)
    ...
    ...
        function X = B(Y)
        ...
        ...
        end
    end
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  6. #6
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    L'erreur est bien celle que j'ai copiée par contre... A part que la variable affichée ne s'appelle pas "A" mais ça n'a pas d'importance.

    ==> Ol : je le sais bien... là je ne comprends pas pourquoi j'ai cette erreur et je ne peux pas poster le code. J'essaye d'extraire le pb de son ensemble pour bien le poser.

    Ce qui me paraît bizarre, c'est que j'ai pourtant bien l'impression que le problème est là : j'appelle un script dans une fonction, et lors de l'appel de la première ligne du script (qui ne fait que déclarer des variables), ça plante (d'ailleurs c'est la déclaration de la première variable qui plante)...

    EDIT:
    Et l'erreur est bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Attempt to add "nX" to a static workspace.
    See MATLAB Programming, Restrictions on Assigning to Variables for details.
    [EDIT2]:

    Bon....


    J'ai compris d'où viens le problème, et c'est vraiment vraiment bizarre... Vous vous rappelez de ce vieux post pourri qui traitait de la POO sur matlab ? Bah c'est ce que je suis en train de faire... en utilisant un script pour déclarer certaines variables.

    Sur le principe ça ne devrait pas poser de problème... sauf que, par exemple, si on crée un script de merde :

    "script_de_merde.m"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    % script de merde
    nX = 0;
    et une classe l'appelant :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function [this] = Charger_Modeles(varargin)
        fichier = 'init_EC_225_03_Vh_000_250';
    
        this = struct(...
            'vitesse',          @getSystHelicoVitesse);
    
        %% CONSTRUCTEUR
        if mod(nargin, 2) == 1
            error('Mauvais format en entree : admet uniquement des couples (propriete, valeur).')
        else
            inputs = varargin;
            while length(inputs) >= 2
                prop = inputs{1};
                val  = inputs{2};
                inputs = inputs(3:end);
                switch lower(prop)
                    case 'fichier'
                        fichier = val;
                    otherwise
                        error(['The property "' num2str(prop) '" is not supported.'])
                end 
            end
            script_de_merde
    
        end
    
        %% ACCESSEURS
        function out = getSystHelicoVitesse(Vh)
            for k = 1:step:KMAX
                if vitesse_avancement(k) == Vh
                    kChoisie = k;
                end
            end
            if kChoisie == 0
                error('Vitesse non disponible')
            else
                out = EC225_03{kChoisie};
                kChoisie = 0;
            end
        end
    
    end
    faites, F5, vous verrez, ça ne marche pas...

    Par contre, si on supprime les dernières lignes de la classe (si on supprime l'accesseur en fait), pour finalement obtenir :
    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
    function [this] = Charger_Modeles(varargin)
        fichier = 'init_EC_225_03_Vh_000_250';
    
        this = struct(...
            'vitesse',          @getSystHelicoVitesse);
    
        %% CONSTRUCTEUR
        if mod(nargin, 2) == 1
            error('Mauvais format en entree : admet uniquement des couples (propriete, valeur).')
        else
            inputs = varargin;
            while length(inputs) >= 2
                prop = inputs{1};
                val  = inputs{2};
                inputs = inputs(3:end);
                switch lower(prop)
                    case 'fichier'
                        fichier = val;
                    otherwise
                        error(['The property "' num2str(prop) '" is not supported.'])
                end 
            end
            script_de_merde
    
        end
    
        %% ACCESSEURS
    
    end
    Ah ben là... ça marche o_O ?

    Sauf que moi bien sûr, ça ne m'intéresse pas... c'est quoi ce délire ? Quelqu'un a une idée ?


    EDIT3: Solution provisoire trouvée...
    Je déclare ma variable nX (et toutes celles contenues dans le script) - sans allouer de valeur - dans ma classe "Charger_Modeles" c'est moche et long à faire, mais le script devrait toujours contenir les mêmes variables, donc ça ne devrait pas poser de pb.

    J'ai pas encore tout testé, mais en faisant ça, je n'ai plus d'erreur... je vais voir si tout est OK après modif. Si oui, je mettrai le post en résolu et désolé pour le temps perdu pour les autres.
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  7. #7
    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 exactement çà (et c'est ce que disait ol).

    Tu ne peux pas créer de nouvelles variables dans les fonctions imbriquées de façon implicite, il faut que l'assignement (=) apparaisse "noir sur blanc" dans le code de tes fonctions imbriquées.

    Ne peux-tu pas convertir tes scripts en fonction qui te renverrait une structure avec tous les paramètres? Bon ca fait un peu de boulot

    Duf
    Simulink & Embedded Coder

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

  8. #8
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    J'y ai pensé, mais ça rajouterait une couche supplémentaire : le script a été généré automatiquement à partir d'un code... mon idée était qu'une personne utilisant mon outil génère le script comme il le fait d'habitude et l'utilise avec mon programme tel quel, sans avoir à passer par une étape intermédiaire, et sans modifier le script de toutes façons parce que ce même script peut être utilisé dans d'autres projets.

    Ol avait effectivement "implicitement" donné la solution, mais je n'ai pas tilté, c'était loin d'être clair.

    Je mets en résolu. Merci.

    EDIT: je trouve quand même dingue ce truc... pour qu'un script marche, il faut déclarer les variable que lui même déclare dans la fonction du dessus si celle-ci utilise des fonctions imbriquées... sinon c'est bon, ça marche... ils doivent vraiment avoir des problèmes mentaux chez matlab
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  9. #9
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tachmou Voir le message
    Bonjour,

    J'y ai pensé, mais ça rajouterait une couche supplémentaire : le script a été généré automatiquement à partir d'un code... mon idée était qu'une personne utilisant mon outil génère le script comme il le fait d'habitude et l'utilise avec mon programme tel quel, sans avoir à passer par une étape intermédiaire, et sans modifier le script de toutes façons parce que ce même script peut être utilisé dans d'autres projets.

    Ol avait effectivement "implicitement" donné la solution, mais je n'ai pas tilté, c'était loin d'être clair.

    Je mets en résolu. Merci.

    EDIT: je trouve quand même dingue ce truc... pour qu'un script marche, il faut déclarer les variable que lui même déclare dans la fonction du dessus si celle-ci utilise des fonctions imbriquées... sinon c'est bon, ça marche... ils doivent vraiment avoir des problèmes mentaux chez matlab
    "implicitement" ! "implicitement" ! Je t'en ferais, moi, des réponses implicites la prochaine fois ! !
    Tu as une fonction déclarée dans une autre, donc tu ne peux pas rajouter de variable en cours de route. ni avec un script, ni au déboggage, avec la console, quand l'exécution est stoppée sur un point d'arrêt. C'est "explicitement" ce que j'ai dit. par contre ta réponse me suggère "implicitement" que tu me tiens pour responsable du manque de connexions dans ta boite à réflexions , ce qui est la véritable raison pour laquelle "tu n'as pas tilté". Là je dis : "Pourquoi tant de haine ?"

    ceci dit, je suis bien d'accord avec toi : c'est "surprenant".

    Du coup, je ne mets plus jamais de fonction imbriquée (je ne travaille pas en objet car je suis venu à Matlab par le C++ et je sais pourquoi je suis resté sur Matlab ).

    Soit je mets des fonctions anonymes, soit je mets les fonctions annexes au cul du programme, mais pas imbriquées.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  10. #10
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Désolé si tu l'as mal pris, je me suis mal exprimé mais tu as compris ce que je voulais dire ^^

    Moi, je ne travaille presque plus qu'avec mes "pseudos classes". Au moins, je sais où sont mes variables, et depuis que je les utilise, ça m'a boosté (clairement) mes dév.

    Mais là, j'avoue que le coup du script, je n'avais clairement pas envie de le modifier... mais la solution de déclarer les variables avant le script convient tout à fait puisque le script, même si le contenu change selon les études, contiendra toujours les mêmes variables. Du coup : déclaration > appel du script > utilisation et c'est pas plus mal parce qu'au moins, on sait ce que le script crée.

    Cordialement,

    ps: là, je vais me replonger dans le gui, et ça ne me motive vraiment pas... (je suis un ancien utilisateur de Qt... et ça me manque déjà)
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  11. #11
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tachmou Voir le message
    Bonjour,

    Désolé si tu l'as mal pris, je me suis mal exprimé mais tu as compris ce que je voulais dire ^^
    Rassure-toi, je n'ai rien pris mal. je suis d'un naturel taquin, et tu m'as donné une bonne occasion de le montrer, voila tout
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. Réponses: 1
    Dernier message: 08/04/2011, 14h55
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. [VBA Excel] Appliquer une macro sur une celulle contenant une valeur
    Par tchauviere dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2008, 10h21

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