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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    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
    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

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    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

  4. #4
    Membre émérite
    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
    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

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

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    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

  6. #6
    Membre émérite
    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
    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.

  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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    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

+ 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