web-dev-qa-db-fra.com

Déclaration d'une variable globale dans MATLAB

Existe-t-il un moyen de déclarer des variables globales dans MATLAB?

S'il vous plaît ne répondez pas avec:

global x y z;

Parce que je peux aussi lire les fichiers d’aide .

J'ai déclaré une variable globale, x, puis j'ai fait quelque chose comme ceci:

function[x] = test()
    global x;
    test1();
end

Où la fonction test1() est définie comme:

function test1()
    x = 5;
end

Lorsque je lance test(), ma sortie est x = []. Est-il possible de faire en sorte que le x=5 soit affiché, ou quoi que je définisse x pour être dans une fonction séparée? En C, il s’agirait d’une variable externe, et j’ai pensé qu’en faire une variable globale devrait suffire.

34
Amit

Vous devez déclarer x en tant que variable globale dans chaque étendue (c'est-à-dire une fonction/un espace de travail) sur laquelle vous souhaitez que celle-ci soit partagée. Donc, vous devez écrire test1 en tant que:

function test1()
  global x;
  x = 5;
end
46
gnovice

Faire référence à votre commentaire sur gnovice en utilisant une variable globale peut être une approche pour résoudre votre problème, mais ce n’est pas une utilisation courante. 

Tout d’abord, assurez-vous que vos fichiers .m sont functions et non scripts. Scripts partagent un espace de travail commun, ce qui facilite le remplacement involontaire de vos variables. En revanche, les fonctions ont leur propre portée. 

Utilisez xUnit afin de générer un test unitaire répétable pour vos fonctions. En testant chaque fonction impliquée dans votre programme, vous localiserez la source d'erreur. Avoir votre test unitaire en place, des modifications supplémentaires du code, peuvent être facilement vérifiées. 

4
zellus

Un moyen possible de contourner le désordre global consiste à affecter la variable à appdata. Vous pouvez utiliser les fonctions setappdata et getappdata pour affecter et extraire appdata à partir d'une fenêtre MATLAB. Tant qu'une session MATLAB est active, il existe une fenêtre notée 0.

>> setappdata(0,'x',10)  % 0 indicates the root MATLAB window

Désormais, la variable x n'est visible par aucun script ou fonction, mais peut être consultée partout où cela est nécessaire à l'aide de getappdata.

function test
    globalX = getappdata(0,'x');
    disp(globalX);
end

x =
    10

La bonne nouvelle est que vous pouvez affecter n'importe quel objet MATLAB valide à appdata. Soyez simplement prudent avec les noms, en utilisant des noms uniques pour les champs appdata tels que ModelOptimizerOptions au lieu d'un générique x, y aiderait. Cela fonctionne également sur les exécutables compilés et le code déployé sur le serveur de production MATLAB.

1
Some Guy