HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0812
ANTARES#modfuncでシステムエラー5解決


ANTARES

リンク

2009/8/12(Wed) 13:04:56|NO.27019

 以下のスクリプトの最後のshow実行時にシステムエラーが発生します。

#module md1 a,b #modinit int ina, str inb a=ina b=inb return #modfunc show mes " a="+a mes " b="+b return #global newmod mv1,md1,10,"apple" newmod mv2,md1,20,"grape" mes "mv1": show mv1 mes "\nmv2": show mv2 newmod mv3,md1,0,"" mv3=mv1 mv1=mv2 mv2=mv3 mes "\nmv1" show mv1 mes "\nmv2" show mv2



この記事に返信する


ANTARES

リンク

2009/8/12(Wed) 18:54:39|NO.27025

 あれ、何か再起動したせいか、直ったみたいです。
お騒がせしました。



FUJI

リンク

2009/8/13(Thu) 01:02:01|NO.27029

現状のHSP(HSP3.1, HSP3.2)では未定義動作です。

まず、ここではモジュール変数の実体のことをstructオブジェクトと呼ぶことにします。
最初mv1, mv2, mv3にnewmodによって格納されたstructオブジェクトをs1, s2, s3とします。
モジュール型の変数ではnewmodで直接生成された要素と、他の変数から代入された要素は区別されます。これはvaruseで確認できます。
モジュール型の変数に代入が行われると、その要素にnewmodで直接生成されたオブジェクトが存在する場合、それは開放されてしまいます。(たとえそのオブジェクトが他の変数から参照されていたとしても)

「mv3=mv1」が実行されるとmv3にはs1が格納され、s3は開放されます。
「mv1=mv2」が実行されるとmv1にはs2が格納され、s1は開放されます。
「mv2=mv3」が実行されるとmv2にはmv3に格納されているs1が格納されますが、s1は既に開放されています。
既に開放されているstructオブジェクトを扱おうとすると未定義動作となります。(Cで言うとfreeした領域にアクセスするのと同じです)

こちらの環境では以下のスクリプトでシステムエラーが再現しました。

#module md1 a,b #modinit int ina, str inb a=ina b=inb return #modfunc show mes " a="+a mes " b="+b return #global #module #deffunc step_alloc local s sdim s, 48 * 2 return #global newmod mv1,md1,10,"apple" newmod mv2,md1,20,"grape" mes "mv1": show mv1 mes "\nmv2": show mv2 newmod mv3,md1,0,"" mv3=mv1 mv1=mv2 step_alloc mv2=mv3 mes "\nmv1" show mv1 mes "\nmv2" show mv2



ANTARES

リンク

2009/8/13(Thu) 04:11:24|NO.27031

 うーん、動いた動いたと喜んだのに、
使わない方がよさそうですね。
残念!!



おにたま(管理人)

リンク

2009/8/15(Sat) 21:52:09|NO.27088

FUJIさんが書かれているように、これは正しく動作しないです。
何にしてもシステムエラーになるのは良くないので、何らかの対策は考えておく必要がありそうですね。



ANTARES

リンク

2009/8/16(Sun) 13:12:15|NO.27113

 システムエラーも問題ですが、動いてしまう場合があることの方が
問題だと思います。



ONION software Copyright 1997-2023(c) All rights reserved.