トピック
VALにType mismatch
2そうだね
プレイ済み
返信[1]
親投稿
みなつ tksm372
INKEY$()の戻り値を一旦変数に入れて、その文字が数字かどうかを判定してからVAL()するといいですよー^^
2そうだね
プレイ済み
返信[2]
親投稿
キャサリン z.vu5spo9x
プチコン内部では、「未初期化の長さ0の文字列」と通常の長さ0の文字列("")が存在するそうで、この2つはそれぞれ別物として扱われています。 どうもINKEY$は、キーが何も押されていない時に""ではなく、「未初期化の長さ0の文字列」を返しているようです。 そして、  VAL("") は0を返しますが、  VAL(「未初期化の長さ0の文字列」) はType mismatchになるようです。 幸い、「未初期化の長さ0の文字列」==""の演算結果がTRUE(1)となるので、  K$=INKEY$()  IF K$=="" THEN K$="" と、K$が未初期化の長さ0の文字列であれば、K$に通常の長さ0の文字列を代入すると良いでしょう。 ちなみに、文字列変数の配列を宣言すると、すべての要素は未初期化の長さ0の文字列になります。
2そうだね
プレイ済み
返信[3]
親投稿
なるほど!なんとなくですが分かりました。区別があるから何も押さないときは使える型に変換させる必要があるんですね。
0そうだね
プレイ済み
返信[4]
親投稿
みなつさん、キャサリンさんありがとうございました!!_(_ _)_
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
このように一旦変数に入れておくだけで問題ありません。 WHILE 1  K$=INKEY$()  ?VAL(K$)  VSYNC WEND 変数に入れるのが面倒ならば下記のようにしてもOKです。 WHILE 1  ?VAL(INKEY$()+".")  VSYNC WEND これは何も押してない時はVAL(".")の値を求める(0を返す)ため問題ないということです。 「1」を押した場合もVAL("1.")の値となり、これは1を返すため問題ありません。 ちなみにINKEY$()の後に付けるのが"."以外の文字だと常に0を返すため正しく動作しません。
1そうだね
プレイ済み
返信[6]
親投稿
キャサリン z.vu5spo9x
>>おちゃめさん あら、ほんとだ。INKEY$の戻り値を変数に代入するだけでよいみたいですね。なんか勘違いをしていました。 VAR SA$[9] K$=SA$[5] '←未初期化の長さ0の文字列の参照を代入 とし、 ? VAL(K$) とすると、VALでType mismatchとなることを知っていたので、 その先入観でコメントしてしまいました。 ...それにしても、何だか不可解な挙動をしますね、コレ。
1そうだね
プレイ済み
返信[7]
親投稿
面白いですねぇ(°ο°;)
0そうだね
プレイ済み
返信[8]
親投稿
キャサリン z.vu5spo9x
あ、不可解じゃないです。解りました。 代入文にて、=より右の式が ・文字列型変数(または、その配列の要素)だけのときは、その変数が指し示すメモリーの参照を代入する。 ・演算結果の型が文字列型になるときは、新たにメモリーを割り当て、演算結果の内容をコピーし、その割り当てたメモリーの参照を代入する。 演算結果が「未初期化の長さ0の文字列であれば、通常の長さ0の文字列を割り当て、その参照を代入する。」 (つづく)
3そうだね
プレイ済み
返信[9]
親投稿
キャサリン z.vu5spo9x
(例1)  K$=INKEY$() の右式は変数ではなく、文字列型の式なので、コピー処理を行う。 INKEY$が未初期化の長さ0の文字列を返していれば、K$の内容は""になる。 (例2)  K$=SA$[5] の右式は文字列型の変数なので、その参照をK$に代入する。 SA$[5]の内容が未初期化の長さ0の文字列であれば、K$の内容も同じ未初期化の長さ0の文字列である。 難しいですが、こうだと思います、多分。
1そうだね
プレイ済み
返信[10]
親投稿
のり cb_FlyingFox
変数を使わない方法なら、 VAL(""+INKEY$()) または VAL(INKEY$()+"") でも良さそうです。 (未初期化の文字列+""、 ""+未初期化の文字列 の 評価がともに""だから。)
2そうだね
プレイ済み