【问题标题】:Scilab: size of elements of figure.user_data cannot be changedScilab:figure.user_data 元素的大小无法更改
【发布时间】:2018-02-02 02:25:16
【问题描述】:

Scilab 的版本是 5.5.1 。我遇到了图形句柄的 user_data 属性的问题:

我已经将 user_data 定义为一个结构体(见底部的 MWE)

但是当我尝试将变量存储到 figure.user_data 字段时,如果向量大小发生变化,则会引发错误(任何类型的向量)

在 user_data 之外进行操作非常有效,因此解决方案可能是删除 figure.user_data 值,然后用我的值定义一个新结构,然后在这个新值处定义 user_data。

然而,这并不能解决最初的问题。

下面是一个 MWE,有 figure.user_data 向量大小问题,并引发了错误

//
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)

【问题讨论】:

    标签: string vector struct scilab uicontrol


    【解决方案1】:

    这似乎是 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);
    

    【讨论】:

    • 你说得对,他们在高于 5.5.1 的版本中修复了这个错误。谈到 set,manpages 给出:“此例程可用于从图形实体或 GUI 对象修改指定属性的值。在这种情况下,它相当于在句柄上使用点运算符。对于例如,set(h,"background",5) 等价于 h.background = 5."。这就是为什么我更喜欢点,它缩小了代码范围。
    • 我知道它看起来更好,但它并不总是适合我。一旦我尝试使用点运算符为学校项目创建 GUI,它有时会工作而其他人不会。我不得不在任何地方使用set() 才能使一切正常运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2016-04-06
    • 2016-12-04
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多