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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0714
HSP熟練者(自称)システムエラー10解決


HSP熟練者(自称)

リンク

2008/7/14(Mon) 18:08:23|NO.17297

スティック命令で stick 変数,数字 と書くときに
stick 変数&数字 と書くとシステムエラーが起こるんですけど
これって私だけですか?
通常ならパラメータの形が違いますと出ると思うんですけど



この記事に返信する


Sui

リンク

2008/7/14(Mon) 18:38:19|NO.17298

本当に熟練者ですか?自称ですけど^^

エラーには優先度があります。
なぜシステムエラーになるのかはわかりますよね?



HSP熟練者(自称)

リンク

2008/7/15(Tue) 19:50:36|NO.17314

すみません。わからないです。
私たちは学校の部活でHSPをやっていて、
その部活の中にHSPが得意なやつがいるのですけど
そいつが今ぜんぜん部活に来ないので・・・
できればなぜか教えてくれませんか?
あと、HSP熟練者(自称)はそいつがいっていたことです。



xxs

リンク

2008/7/15(Tue) 21:32:25|NO.17315

>>これって私だけですか?
いいえ。そうなります。

>>通常ならパラメータの形が違いますと出ると思うんですけど
仕様です。

・・・て、こんな回答で良いのかな。



Quiet

リンク

2008/7/15(Tue) 22:36:22|NO.17316

「パラメータの型が違います」では、変数の型が規定のものではない場合に表示され、

「システムエラーが発生しました」では不明の事態が発生した場合に表示されます。


/* ky="" pos ky,ky */ /* onkey "aaa" */ //stick ky&2 //getkey ky&32



DoubleQuote

リンク

2008/7/16(Wed) 13:04:28|NO.17319

とりあえずエラーが発生するスクリプトをここに貼り付けてみてはいかがでしょうか?

全文ではなくかいつまんで



レノス

リンク

2008/7/17(Thu) 23:29:51|NO.17357

stick 変数&数字
という書き方をする意味がわからない……。
そもそも根本がわかっていないと思います。

とりあえず、講座やマニュアルを読んで、HSPについて勉強してください。
講座はHSPTVにもあります。



船丸

リンク

2008/7/18(Fri) 06:18:00|NO.17364

とりあえず、

a=16 b=a&16 mes b
これを見れば分かると思いますが、

stick a&16 // 数字になっている
これが駄目な理由が分かると思います。



FUJI

リンク

2008/7/18(Fri) 07:56:43|NO.17365

おそらく stick a&16 がダメな理由を質問したいわけではなくて、なぜシステムエラーになるか知りたいのだと思います。
それは、変数パラメータの取得時にパラメータが一つの変数で終わっているかをチェックしていないからです。

dim a + 1
や、

#module #deffunc f var p1, int p2 return #global f a + 1
でも同じようなことが起こるはずです。

本来は一つの変数でパラメータが終了しているか確認してその時点でエラーを発生させるべきなんですが、
していないので内部が変な状態で進んでしまってメモリ違反が起こってシステムエラーになります。



flory

リンク

2008/7/18(Fri) 08:20:51|NO.17366

もう少しこの場合に即して考えてみる。


サンプル1

stick 16

サンプル1はstick命令のパラメータとして数値を渡したものです。
この場合、当然エラーになるわけですが、そのエラーは「変数名が指定されていません」になります。

サンプル2

stick a&16

サンプル2はstick命令のパラメータとしてa&16を渡したものです。
この場合のエラーは「システムエラーが発生しました」となります。
サンプル1の時とはエラー内容が違います。a&16が数値として渡されていれば、サンプル1と同じく「変数名が指定されていません」というエラーになるはずです。つまり、a&16は数値として渡されていないということです。

サンプル3

stick 16&a

サンプル3はstick命令のパラメータとして16&aを渡したものです。サンプル2とは演算順序が異なります。
この場合のエラーは「変数名が指定されていません」となります。
このエラーはサンプル1と同じものなので、16&aは数値として渡されていると推測できます。
しかし、サンプル2と3で違うエラーが発生することに疑問が残ります。サンプル2と3は、パラメータとしてそれぞれa&16、16&aを渡していますが、これらは単独で用いた場合は同じ結果を示すはずです。それなのに、なぜstick命令のパラメータとして渡した時は違う結果になるのでしょうか。

それは以下のように考えられます。

変数名を指定すべきパラメータに演算式(計算式、条件式)を指定したとき、

1.「a&16」のように、まず変数名がくる場合
→パラメータを変数名として解釈するが、……あとはFUJIさんのおっしゃる通りでしょう。

2.「16&a」のように、まず数値(もしくは文字列など)がくる場合
→パラメータを数値(もしくは文字列など)として解釈するが、変数名ではないので「変数名が指定されていません」となる。


一応これで説明がつきます。



SYAM

リンク

2008/7/18(Fri) 09:21:33|NO.17368

見えない部分なので確実な話ではないですが
多分、計算式を一時格納する領域が、数値式と変数式で異なるからだと思います。
16&aは
パラメータとなる「値」、つまり16&aの計算結果を、数値として扱います。
a&16は
パラメータとなる「値」が一時的な目には見えない変数としてメモリに格納され、それが命令に渡されます。

元々stick命令は、渡された変数が格納された領域に結果を書き込むものですから、メモリ領域ではないただの数値を渡したのでは成り立ちませんからエラーを発生します。
cだと、関数の引数にリテラルを渡すような感じです。
しかし、一時的にでも変数としてメモリに格納されたものなら渡せてしまいます。
が、一時的に確保したメモリ領域は、計算のためにだけ確保されたので、計算をし終えた時点でメモリは確保を解除されてます。
つまり、stick命令は無効なメモリ領域を渡され、そこに処理結果を書き込もうとします。そこではじめてエラーとなります。

stickさんが家を建てようとしたら
土地でないものを渡されたか
効力のきれた土地の権利書を渡されたか
…みたいな差です。
後者は 家を建てようとしたらシステムから怒られたワケですね。



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