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 :

Attempt to add "var" to a static workspace


Sujet :

MATLAB

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Attempt to add "var" to a static workspace
    Bonjour

    Cette erreur apparait lorsque je définis certaines variables (celles qui ne sont pas définies en global) dans mes nested fonctions (principales ou subsidiaires).

    Ca me gêne de déclarer ces variables en global, étant donné que ces variables sont souvent nombreuses et temporaires.

    Comment faire... ?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    peux-tu nous montrer un exemple de code qui génère cette erreur?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cette erreur apparaît le plus souvent lorsque tu es en mode "Debug", et que tu tentes de définir une nouvelle variable qui n'existait pas au moment où tu as lancé l'exécution.
    Il te faut alors stopper le débogage, ou utiliser une variable déjà existante.

  4. #4
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Je ne pense pas être spécialement en mode Debug, je lance simplement dans la fenêtre de commande mon fichier m.

    Mon fichier m se présente ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fonction_principale
     
       % "fonction_interface" contient seulement du code d'uicontrol.
       fonction_interface;
     
       function sous_fonction
     
          % des trucs... 
          eval(['K2',int2str(n),'=zeros(3);'])
          % des trucs
     
       end
     
    end
    fonction_interface contient une variable h29:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h29 = get(UI.uncontrole,'title');
    Si je ne déclare pas h29 en global dans fonction_principale, ça plante.

    La ligne avec K2=... plante aussi dans les mêmes conditions. Je sais pas ailleurs que le eval est très sale, qu'il faudrait faire un beau K2{n} mais je reprends un code et je ne peux pas tout modifier (temps...).

    Voyez vous le problème?
    Merci

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonne chance pour contourner cela si tu veux vraiment conserver EVAL, et surtout si ta variable n peut être élevée.
    K2(n) ne figurant pas dans le workspace initial, la ligne contenant eval l'ajoute, et c'est cela qui le fait planter, tout comme le cas du Debug.
    La solution pour n = 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function sous_fonction
          K21 = [];
          % des trucs... 
          eval(['K2',int2str(n),'=zeros(3);'])
          % des trucs
     
    end
    Je te laisse imaginer ce qu'il faut ajouter si n varie de 1 à 1000
    Franchement, je serais toi, je ferais les modifications nécessaires afin de supprimer toutes les occurrences d'EVAL.
    eval(['K2',int2str(n),'=zeros(3);']) par rapport à K2{n} = zeros(3);, il n'y a pas photo.

    Concernant h29, quelle erreur obtiens-tu?

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    eval(['K2',int2str(n),'=zeros(3);']) par rapport à K2{n} = zeros(3);, il n'y a pas photo.
    Oui, ça c'est sûr... Après mon n varie entre 1 et 4, alors pourquoi pas. Je verrai si je peux supprimer le eval.

    Pour h29, exactement ma même erreur que le titre du topic, avec pour "var" "h29".

  7. #7
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, je présume que fonction_interface est un script et non une fonction, c'est donc le même topo.
    Il te faut le transformer en fonction et faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function h29 = fonction_interface 
     
    h29 = % contenu
    Puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function fonction_principale
     
       % "fonction_interface" contient seulement du code d'uicontrol.
       h29 = fonction_interface;

  8. #8
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui c'est bien un script bien vu.
    Mais si je n'ai pas que h29, il faut que je fasse:
    function [h29, h..., ...] = fonction_principale ?

    Je voulais utiliser un script et non une fonction parce que mes callback ne trouvent pas les nested fonctions (sous_fonction), tandis que depuis un script les fonctions sont trouvées.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    Mais si je n'ai pas que h29, il faut que je fasse:
    function [h29, h..., ...] = fonction_principale ?
    Oui quelque chose du genre, ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function meshandles = fonction_interface  % interface non?
    % ...
    meshandles.h29 = contenu29
    
    %% voire
    % ... 
    meshandles(29) = % contenu 29
    En tout cas, une fonction retournant ce dont tu as besoin.

    Citation Envoyé par Anduriel Voir le message
    Je voulais utiliser un script et non une fonction parce que mes callback ne trouvent pas les nested fonctions (sous_fonction), tandis que depuis un script les fonctions sont trouvées.
    Je ne suis pas sûr d'avoir bien compris, pourrais-tu donner un exemple?

    [EDIT] Si tu souhaites garder un script, il te suffit de définir les variables crées par le script dans ta fonction principale avant de l'appeler, comme K21.

  10. #10
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Si tu souhaites garder un script, il te suffit de définir les variables crées par le script dans ta fonction principale avant de l'appeler, comme K21.
    Oui, voila, et j'en reviens à mon probleme initial, puisque je ne veux pas les déclarer.

    Je crois qu'encore une fois, le mieux c'est de ne pas créer de nested functions !

    EDIT: Ah non, même avec un script mes Callback ne sont pas trouvés... Bon je laisse complètement tomber! Merci pour votre aide

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