2010-10-30 5 views
1

приветствий и извинения, если это репост (я искал этот сайт, и я считаю, сво не перепечатывать, хотя)возвращение типа who_user в Scilab

Я работаю с Scilab, но в ходе проекта, Scilab должен иметь дело с большим количеством переменных. мне было интересно, если я могу сделать следующий

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

, конечно, это псевдокод, и у меня есть несколько вопросов, прежде чем я его реализации.

  1. Я не могу получить var_list = who_user(). поэтому я считаю, что функция ничего не возвращает. Я не хочу взламывать код макроса «who_user». Есть ли другой способ получить список пользовательских переменных в другой varibale?

  2. Есть ли способ найти глобальные переменные из них?

  3. Если нет, то каковы методы управления памятью в scilab?

Благодаря миллиона за ваше время и помочь

ответ

1

Я могу ответить на ваш первый запрос:

С незначительной модификацией самой функции who_user:

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 

Этот функция должна предоставить вам список, который вы хотите (я изменил имя на who_user1).

Вы можете узнать, является ли конкретная переменная глобальной или нет с помощью функции isglobal(), но вам нужно передать переменную isglobal(), а не строку, которая является именем переменной. Функция, указанная выше, возвращает вектор строк.

Альтернативный подход, который вы могли бы попробовать, заключается в том, чтобы переписать вышеприведенную функцию, чтобы возвращать переменные (а не их имена) непосредственно с помощью varargout, а затем тестировать их как глобальные.

+1

спасибо, http://www.scilab.org/product/man/getvariablesonstack.html это то, что я действительно искал – Sean