2017-08-24 9 views
1

Scilabのバージョンは5.5.1です。私は、Figureハンドルのuser_dataの性質に問題会った:私は、構造体としてのuser_dataを定義したScilab:figure.user_dataの要素のサイズは変更できません

(下部にあるMWEを参照)

をしかし、私はfigure.user_dataに変数を保存しようとすると、フィールドに、ベクトルサイズが変更されている場合、エラーが発生します(任意のタイプのベクトルで)

user_dataのousideを完全に動作させるので、解決策はfigure.user_data値を消去して新しいstructを自分の値で定義し、この新しい値でuser_dataを定義します。

しかし、これは初期の問題を解決しません。

以下

、figure.user_dataベクトルの大きさの問題とMWE、およびエラーが

のScilab 5.5.1のバグのようです
// 
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

を上げました。 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以上のバージョンで修正されました。 "このルーチンは、グラフィックスエンティティまたはGUIオブジェクトから指定されたプロパティの値を変更するために使用することができます。この場合、ハンドルにドット演算子を使用するのと同じです。たとえば、 set(h、 "background"、5)はh.background = 5._ "と等価です。だから、私はドットを好む理由、それはコードを狭める。 – PTRK

+0

それは良く見えますが、それはいつも私のために働いていませんでした。いったん私はdotオペレータを使って学校のプロジェクトにGUIを作ろうとしましたが、それは時にはうまくいくかもしれませんし、他の人はそうではないでしょう。すべてを正しく動作させるためには、どこでも '' set() ''を使う必要がありました。 – luispauloml

関連する問題