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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0328
Gon配列変数の変数型の変更について2未解決


Gon

リンク

2019/3/28(Thu) 22:03:00|NO.86976

HSPでソフトを作っていたのですが、
実数型の配列変数を一回文字型変数にしてから、
また実数型配列変数に戻す必要が出てきました。
そこで以下のようなソースを書いたのですが
エラーが出てうまくいきませんどなたかわかる方よろしくお願いします。

sdim a,3 a(2)=str(a(2)) a=double(a) a=str(a) mes a(2)



この記事に返信する


沢渡

リンク

2019/3/29(Fri) 13:41:07|NO.86984

普通の変数ですと代入した値の形(整数、実数、文字列)によって変数の形も自動的に変わるのですが、
配列でそれをやるとエラーになります。
(配列の形を変えるには、改めてdim系命令を使ってリセットするしかない)
こんな感じで実数配列と文字列配列を別々に作り、
ひとつひとつ変換しつつ代入していくのはどうでしょうか?

ddim a,3 //実数配列を作成 a=30789048.89766,-124872.42333,2378555.4872384 //実数配列の中身(数字は適当) sdim b,64,3 //文字列配列を作成。sdim 配列名,デフォルト文字数,要素数 repeat 3 b(cnt)=str(a(cnt)) //実数を文字列化 a(cnt)=double(b(cnt)) //文字列を実数化 mes a(cnt) //実数の中身を表示してみる loop



YOS G-spec

リンク

2019/3/29(Fri) 19:50:15|NO.86992

沢渡さんと内容被ってますが気になったことをちょいちょい書いてみます。

まず、次のコードを実行すると分かりますが、最初の配列の個数が正しく定義できていません。

sdim a,3 mes "配列の要素数:"+length(a) ;→配列の要素数:1 ; 3つの要素を持つ配列として正しく定義できていない。 a(2)=str(a(2)) ;→配列の要素数:3 ; a(2)に代入されたことで配列が自動拡張された。 mes "配列の要素数:"+length(a)
sdimは、

sdim p1,p2,p3... p1=変数 : 配列を割り当てる変数名 p2=1〜 : デフォルト文字数 p3=0〜 : 要素の最大
とのことですので、

sdim a,,3 mes "配列の要素数:"+length(a) ;→配列の要素数:3 a(2)=str(a(2)) ;→配列の要素数:3 mes "配列の要素数:"+length(a)
このようにする方が正しいです。

ちなみにここはエラーの直接の原因ではないので置いといて、
残りの処理の配列の要素数も見てみましょう

sdim a,,3 a(2)=str(a(2)) mes "配列の要素数:"+length(a) ;→配列の要素数:3 a=double(a) mes "配列の要素数:"+length(a) ;→配列の要素数:1 ; HSPでは配列に対して一括で処理を与えることはできない。 ; 配列で添字を省略するとa(0)としているのと同じになる。 a=str(a) mes "配列の要素数:"+length(a) ;→配列の要素数:1
コメントで入れていますがHSPでは配列に対して一括で処理を与えることは出来ません。
ループを使用してください。

sdim a,,3 a(2)=str(a(2)) mes "配列の要素数:"+length(a) ;→配列の要素数:3 foreach a: a(cnt)=double(a(cnt)): loop mes "配列の要素数:"+length(a) ;→配列の要素数:1 foreach a: a(cnt)=str(a(cnt)): loop mes "配列の要素数:"+length(a) ;→配列の要素数:1
ループ処理を追加しましたがまだ直っていません。
これはHSPではstrやdoubleなど、一つの配列の中に複数の型の値を持つことが不可能なためです。
よって、str用とdouble用の配列を別に用意することで解決できます。

;ddim ad,3 ad=0.0,0.0,3.14 ;sdim a,,3 a="1.14","2.14","hoge" mes "配列の要素数:"+length(a) a(2)=str(ad(2)) foreach a: ad(cnt)=double(a(cnt)): loop mes "配列の要素数:"+length(ad) foreach a: a(cnt)=str(ad(cnt)): loop mes "配列の要素数:"+length(a) foreach a: mes a(cnt): loop
ちなみにどうしても同じ型の値を同じ配列を収めたい場合は少し複雑になりますが、
モジュール変数でコンテナを作ってモジュール型変数の配列として扱う方法もあります。

#module Val __v #modfunc local setv var _v __v=_v: return #define global setv(%1,%2) %tset \ %i=%2: setv@Val %1,%o #modcfunc v return __v #global dimtype a,vartype("struct"),3 newmod a,Val: setv a(0),1.14 newmod a,Val: setv a(1),2.14 newmod a,Val: setv a(2),3.14 mes "配列の要素数:"+length(a) setv a(2),str(v(a(2))) foreach a: setv a(cnt),double(v(a(cnt))): loop mes "配列の要素数:"+length(a) foreach a: setv a(cnt),str(v(a(cnt))): loop mes "配列の要素数:"+length(a) foreach a: mes v(a(cnt)): loop
以上、参考になれば幸いです。



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