2017-03-21 10 views
1

I en utilisant ce codeportée de fin de course de variables Scilab

clc; 
clear; 
getd(); 

a=1; 
b=myFunction(); 

, où myFunction est définie par

function b=myFunction() 
    b=a+1; 
endfunction 

. Pour une raison étrange, cela fonctionne très bien dans Scilab. Je crois que myFunction hérite simplement a de la fonction principale. Ceci est en contraste avec par exemple Matlab, où a doit être un argument d'entrée de myFunction afin de l'utiliser.

Je veux que les fonctions de Scilab fonctionnent uniquement avec les variables locales et les variables données en entrée, comme dans Matlab. Alors que dans ce cas, a n'est pas hérité de la fonction principale.

Comment puis-je y parvenir?

+0

Voici comment [variable scope] (https://wiki.scilab.org/howto/global%20and%20local%20variables) fonctionne dans Scilab. Pour changer cela, vous pouvez télécharger le code source de Scilab, réécrire son moteur et compiler. – FTP

+1

Mais pourquoi voulez-vous réaliser cela? Si vous écrivez des définitions de fonctions appropriées, c'est-à-dire que vous définissez toutes vos variables d'entrée comme des arguments entre parenthèses, et que vous appelez votre fonction avec le nombre correct d'arguments d'entrée, Scilab ne mélange pas vos variables locales et globales. Dans votre fonction, vous pouvez même vérifier qu'une entrée suffisante est fournie avec 'varargin'. – Attila

Répondre

2

Cela fonctionne très bien dans Scilab car dans le cas où une fonction utilise une variable indéfinie, l'interpréteur la recherche dans la portée appelante. Bien que cela semble étrange, c'est ainsi que cela fonctionne et je pense que ce comportement ne peut pas être modifié sans modifier le code source comme l'a dit @NormalHuman. Dans votre exemple, votre code fonctionne parce que la variable "a" est définie dans la portée de l'appel, mais si vous exécutez la fonction dans une autre situation, elle peut échouer. À mon avis, une fonction ainsi définie a un défaut dans son code. J'utilise beaucoup Scilab et je ne vois pas cela comme un vrai problème, mais je suis d'accord avec vous que ce comportement est assez étrange et qu'il ne devrait pas exister. Cependant, si vous craignez de développer incorrectement une fonction qui fonctionne bien pendant que vous écrivez le code en raison d'une variable définie dans la portée d'appel, la solution est de créer des tests unitaires et de les exécuter dans un interpréteur propre .