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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0825
ねこさん整数型配列から実数型配列への変換5未解決


ねこさん

リンク

2015/8/25(Tue) 08:25:58|NO.71051

整数型配列から実数型配列への変換をしたいと思い、doubleを実行したのですが、
3次元が1次元になり配列ではなくなってしまいます。三次元の配列のまま実数型配列に
したいのですが、どのようにしたらよろしいのでしょうか?

環境はHSP 3.5 beta - dishです。

よろしくお願いします。



この記事に返信する


スペース

リンク

2015/8/25(Tue) 10:10:25|NO.71053

配列変数の内、例えばa.1.2.3だけを実数型に、という風には出来ません。
ですが、ddimという命令で実数型配列変数で初期化することが出来ます。



にゃんちゃん

リンク

2015/8/25(Tue) 12:19:45|NO.71058

テンポラリの変数を経由してから、元あった変数に書き戻すのが確実です。

x=1,2,3,4,5 ddim tmp,length(x) foreach x tmp(cnt)=double(x(cnt)) loop ddim x,length(tmp) foreach tmp x(cnt)=double(tmp(cnt)) loop



motchy

リンク

2015/8/25(Tue) 12:29:51|NO.71059

こうすれば出来るのではありますが、


dim x, 4,5,6 x(1,2,3) = 3 mes x(1,2,3) intToDouble_3dA x //変換 mes x(1,2,3) #module #deffunc intToDouble_3dA array a // "intToDouble_3dArray" 3次元int型配列をdouble型に変換 l1 = length(a) : l2 = length2(a) : l3 = length3(a) dim b, l1,l2,l3 : memcpy b,a, 4*l1*l2*l3 //オリジナルのバックアップ ddim a, l1,l2,l3 repeat l1 i = cnt repeat l2 j = cnt repeat l3 a(i,j,cnt) = double(b(i,j,cnt)) loop loop loop return #global

一時変数に待避してオリジナルを書き換えます。

スクリプト言語ですからこうやって変数の型をコロコロ変えることもできるわけではありますが、
それなりの時間がかかる処理です。そこまでしてなぜ配列の型を変える必要があるのでしょうか。
アルゴリズムとデータ構造を再考すれば型を変えずに済むシステムを組めるかもしれませんよ。



motchy

リンク

2015/8/25(Tue) 12:54:08|NO.71060

追記

ねこさん、もしかしてこういうことしませんでしたか?


dim a,2,2,2 a(0,0,0) = 1 a(1,1,1) = 2 a = double(a) //変換! (←しかし、そんなうまい話はない(笑))

double() にしても int() にしてもそうですが、
double(a) のようにaの添え字(a(17)等の数字 17 のこと)を省略した場合、aの先頭(つまりインデックス0)の値が操作対象として選ばれます。
もしaが多次元配列ならa(0,0,0)のように、とにかくaの占める主記憶領域の先頭の値が対象になります。
(HSPインタプリタのコードを読んだわけではないですが、経験的にそういう動作だと思っています)
これは代入の時も同じであって、

a = 1,2,3 a = 4
とすれば a = 4,2,3 となっているはずです。

しかしながら、


a = 1,2,3 a = 4.0

こうすると a は もはや配列ではなくなり a = 4.0 となります。
配列の要素は全て同じ型でなくてはならない(そうしないと管理が非常に面倒になる)というルールがありますから、
HSPインタプリタは2行目で仕方なく a を一旦クリアしてdouble型の変数として初期化したわけです。

これらのことから、
a = double(a)
などということを配列変数に対して行っても、ねこさんの期待していたようにはならないわけです。



窓月らら

リンク

2015/8/25(Tue) 18:50:39|NO.71062

実数にする必要があるなら、最初から実数として扱うべきかと。



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