2017-08-24 95 views
1

Scilab的版本是5.5.1。我见过一个问题人物手柄中的用户数据属性:Scilab:figure.user_data的元素大小不能更改

我定义中的用户数据为结构(见MWE在底部)

但是当我尝试存储变量来figure.user_data字段中,如果矢量大小已更改,则会引发错误(使用任何类型的矢量)

做到这一点user_data完美工作,因此解决方案可能是擦除figure.user_data值,然后定义新的用我的值结构化,然后用这个新值定义user_data。

但是,这并没有解决最初的问题。

下面,与figure.user_data矢量大小问题的MWE,错误引发

// 
clc 
clear 
xdel(winsid()) 

strct = struct('int',0,'str','str','vstr',['a';'b']) 
old_strct = strct 

// changing vectors size in a struct works 
strct.int = [0,1,2] // ok 
strct.str = ['a';'b'] // ok 
strct.vstr =['b','c'] // ok 
strct.vstr =['a','b','c'] // ok 

f=figure('visible','off') 
f.user_data = old_strct // ok 
// but changing it inside the user_data property doesn't 
f.user_data.int = strct.int // see error below 
f.user_data.str = strct.str // error 
f.user_data.vstr = ['b';'c'] // ok as size is the same 
f.user_data.vstr =['a','b','c'] // error 

// we can still erase all the struct with a new one, though 
f.user_data = strct //ok but not efficient to delete all the field to change one 

    !--error 15 
Sub-matrix not well defined. 
at line  45 of function generic_i_h called by : 
at line  2 of function %s_i_h called by : 
f.user_data.int = strct.int // error 
at line  21 of exec file called by :  
exec('/net/jabba/home0/pp607946/brouillon.sce', -1) 

回答

0

这似乎是在Scilab的5.5.1的错误。我试图在Windows 7上使用Scilab 6.0.0来重现它,它工作得很好。

当我使用旧版本(5.3.3)时,我发现有时设置图形的属性可能会非常棘手。然而,总是有效的是使用set()函数,而不是你正在使用的点运算符。不过,您需要一次性设置user_data的所有字段,正如您自己提到的那样。要设置单个字段,请使用临时变量或重新使用旧变量。

//all new fields 
set(f,'user_data',strct); 

//one field at a time 
old_strct.int = strct.int; set(f,'user_data',old_strct); 
old_strct.str = strct.str; set(f,'user_data',old_strct); 
old_strct.vstr = strct.vstr; set(f,'user_data',old_strct); 
+0

你说得对,他们修正了这个版本大于5.5.1的bug。在说到set的时候,手册给出了: “_这个例程可以用来修改图形实体或GUI对象的指定属性的值,在这种情况下,它相当于在句柄上使用点运算符。例如, set(h,“background”,5)相当于h.background = 5._“。这就是为什么我更喜欢这个点,它缩小了代码。 – PTRK

+0

我知道它看起来更好,但它并不总是适合我。一旦我尝试使用点运算符创建一个学校项目的图形用户界面,它有时会工作,而其他人则不会。我不得不在所有地方都使用set()来使所有的东西都正常工作。 – luispauloml