2010-10-30 4 views
1

salutations et des excuses si cela est une republication (i cherchai ce site, et je crois que ce ne est pas un rediffuser, cependant)type de who_user de retour dans Scilab

Je travaille avec Scilab, mais au cours d'un projet, Scilab doit traiter avec un grand nombre de variables. Je me demandais si je peux faire ce qui suit

var_list = who_user(); 
for _var_ = var_list do 
    if _var_ is global then 
    writetofile(human_readablefile, _var_) 
    end 
end 
clear() 

Bien sûr, cela est un pseudo-code, et j'ai quelques questions avant de le mettre en œuvre.

  1. Je n'arrive pas à obtenir var_list = who_user() qui fonctionne. donc je crois que la fonction ne retourne rien. Je suis réticent à pirater le code de la macro "who_user" lui-même. Y at-il un autre moyen d'obtenir la liste des variables utilisateur dans un autre varibale?

  2. Existe-t-il un moyen d'en extraire les variables globales?

  3. Sinon, alors quelles sont les techniques de gestion de la mémoire dans scilab?

Merci un million pour votre temps et aider

Répondre

1

Je suis en mesure de répondre à votre première question:

une légère modification de la fonction who_user lui-même:

function nams = who_user1() 
    //get user variables 
    [nams,mem]=who('get'); //get all variables 
    p=predef(); //number of system variable 
    st=stacksize() 
    nams=nams(1:$-p+1);mem=mem(1:$-p+1); 
    //modifiable system variables 
    excluded=['demolist','scicos_pal','%scicos_menu',.. 
    '%scicos_short','%helps','%helps_modules','MSDOS','who_user','%scicos_display_mode', ... 
     '%scicos_help']; 
    ke=grep(nams,excluded) 
    nams(ke)=[];mem(ke)=[]; 

    n=size(nams,1); 
    if n==0 then return,end 

    //format names on n*10 characters 
    ll=length(nams)+2;m=int((ll-1)/10)+1; 
    for k=1:max(m) 
    ks=find(m==k); 
    if ks<>[] then nams(ks)=part(nams(ks),1:(k*10));end 
    end 
endfunction 

Cette La fonction devrait vous donner la liste que vous désirez (j'ai changé le nom pour who_user1).

Vous pouvez savoir si une variable spécifique est globale ou non en utilisant la fonction isglobal(), mais vous devez transmettre une variable à isglobal(), pas la chaîne qui est le nom de la variable. La fonction que j'ai énumérée ci-dessus renvoie un vecteur de chaînes. Une autre approche que vous pourriez essayer serait de réécrire la fonction ci-dessus pour retourner les variables (plutôt que leurs noms) directement en utilisant varargout et ensuite les tester pour être globales.

+1

merci, http://www.scilab.org/product/man/getvariablesonstack.html est ce que je cherchais vraiment – Sean