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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1119
ぴょぴょ浮動小数点の配列の挙動10解決


ぴょぴょ

リンク

2013/11/19(Tue) 19:49:36|NO.58293

[Aタイプ]
ddim buff,10
buff(0)=1.1

これは「buff」の要素数は10個のまま。



[Bタイプ]
ddim buff,10
buff(0)=1.0

これも「buff」の要素数は10個のまま。



[Cタイプ]
ddim buff,10
buff(0)=1

しかし、この場合は「buff」の要素数が1個になる。なぜ?



[Dタイプ]
ddim buff,10
dim value
value=1
buff(0)=value

これも「buff」の要素数が1個になる。なぜ?



[Eタイプ]
ddim buff,10
dim value
value=1
buff(0)=double(value)

これは「buff」の要素数は10個のまま。
上記の動作のCタイプ、Dタイプが
バグか、仕様なのか。
お聞きしたいです。

なお、現在はEタイプで対策してます。
これが普通なのでしょうか?HSPって。



この記事に返信する


ポテト(流星群)

リンク

2013/11/19(Tue) 19:58:43|NO.58294

Eについてはちょっとわかりませんが、
C,Dについては恐らくは実数で初期化した配列に、
整数型を入れているから起きる現象だと思います。
これの対策としてはEが有るのでは?
型の不整合をHSP内でなんとか動くようにしているので
おかしな事になるのではないでしょうか



うめうさ

リンク

2013/11/19(Tue) 20:03:51|NO.58295

ddim buff,10
mes ""+vartype(buff)
buff(0)=1
mes ""+vartype(buff)
stop

変数の型タイプが変更されて初期化されているのではないでしょうか。



うめうさ

リンク

2013/11/19(Tue) 20:04:12|NO.58296

わっふー、同じ事言ってすいません。



ぴょぴょ

リンク

2013/11/19(Tue) 20:14:26|NO.58297

●ポテト(流星群)へ
> C,Dについては恐らくは実数で初期化した配列に、
> 整数型を入れているから起きる現象だと思います。
つまり、仕様なの?この動作。

> これの対策としてはEが有るのでは?
そうなのか!

●うめうさへ
> 変数の型タイプが変更されて初期化されているのではないでしょうか。
そのようですね。



ポテト(流星群)

リンク

2013/11/19(Tue) 20:25:10|NO.58299

>ぴょぴょさん
そうですね。恐らくは仕様です。
強い静的型付け言語ならエラーになるところですが、
エラーにしないために無理矢理定義された型から外してでも代入してる事で起こる
弊害ですね。妥協するしか無いですね…これは。



ぴょぴょ

リンク

2013/11/19(Tue) 21:10:29|NO.58300

> そうですね。恐らくは仕様です。
> 強い静的型付け言語ならエラーになるところですが、
> エラーにしないために無理矢理定義された型から外してでも代入してる事で起こる
> 弊害ですね。妥協するしか無いですね…これは。
ありがとうございました。



3k

リンク

2013/11/20(Wed) 19:55:30|NO.58317

既に解決してらっしゃいますが、ちょっとだけ失礼します

バグか仕様なのかについては、そもそも明確な言語仕様が存在せず
実装こそが仕様である状態なので、明らかにリファレンスと挙動が
異なる場合以外は仕様だと言えるでしょう

それはさておき、今回の挙動はHSP本体の実装からくるものです
HSPでは単一の要素のみを持つ変数というのは存在しません、変数は
全て配列として実装されているからです
順を追ってみていきます

HSPの構文上では
v = 1

のように、単一の変数への代入が許されています 実はこれ、今のところ次のスクリプトの糖衣構文です
v(0) = 1
HSPの内部実装では配列しか存在しないため、単一の変数としての評価
は自動的に配列の最初の要素の評価と解釈されます
// 次の二つは同じ動作
a = b a(0) = b(0)

さて、HSPでは構文上単一変数の型は代入時に定まります
次のスクリプトはHSP使いなら誰でも書くと思います
v = 1// ここでvは整数型になる
v = "str"// ここでvは文字列型になる v = 1.0// ここでvは倍精度浮動小数点型になる
HSPではこのように変数の型が動的に変化し、これによっておおよそ
楽にコードを書くことができます

しかし、先ほども述べましたが単一変数は実際は配列の最初の要素として
評価されます
つまりHSP内部的にはこうなります
v(0) = 1// ここでvは整数型になる
v(0) = "str"// ここでvは文字列型になる v(0) = 1.0// ここでvは倍精度浮動小数点型になる
というわけで、CとDのケースでエラーもでず変数の型が変わる理由
はここにありました

これを許さないと、単一の変数の代入においても自動的に型が変わら
ないため、とても不便になるのは容易に想像できますね

ちなみに、HSPでは添字1以降は構文的にも配列要素としての評価され
るので、次の例はエラーがでます
ddim v, 10
v(1) = 1// double型の配列にint型を代入しようとした

本来ならば「v」と「v(0)」の評価は、書き方が違うのだから別に
して欲しいですが、今の実装ではこれら二つは同じなので注意が必要です
(なお、この他にも変数が全て配列として実装されているが故の微妙な
挙動をする箇所(仕様)があります、考えてみると面白いかもしれません)

以上、雑談に近い余談でした



ぴょぴょ

リンク

2013/11/20(Wed) 22:07:42|NO.58321

> HSPでは単一の要素のみを持つ変数というのは存在しません、変数は
> 全て配列として実装されているからです
デバッグ画面より、何となくは気付いてました。これ。

> さて、HSPでは構文上単一変数の型は代入時に定まります
> HSPではこのように変数の型が動的に変化し、これによっておおよそ
> 楽にコードを書くことができます
これが便利そうで混乱するとこですね。(C/C++言語出身者の私の意見)

> これを許さないと、単一の変数の代入においても自動的に型が変わら
> ないため、とても不便になるのは容易に想像できますね
はい。

> ddim v, 10
> v(1) = 1// double型の配列にint型を代入しようとした
ここは分かりますね。
なお、今回の質問は電卓ソフトを作っていた時の疑問に思ったものです。
調べていくうちに自分のプログラムのバグがあったようです。
つまり、
ddim buff,10
buff(0)=0

このようにしていたのです。
これが原因で「buff」が「int型」となり、要素数も「1個」に変化しました。
本来は「buff(0)=0.0」としなくてはいけなかった。
これによって「buff(1)」や「buff(2)」を参照しようとした時に
実行時の配列の要素エラーが出ました。
そこで質問してみました。

しかし、私のプログラムにバグがあっただけでした。(恥)

> 以上、雑談に近い余談でした
このような質問は雑談の方が良いのでしょうかね?



3k

リンク

2013/11/21(Thu) 01:42:41|NO.58329

> これが便利そうで混乱するとこですね。(C/C++言語出身者の私の意見)
C/C++系の方でいらっしゃいましたか…大変恐縮
私はC/C++のことはほとんど分からないため正確に比較することなど
はできませんが、「便利そうで混乱する」というのは結局慣れだと
勝手に思っています
C/C++にはC/C++に適した読み方・書き方ひいては思考が、HSPでは
HSPに適した思考があり、それらの習得後はほとんど混乱せずにプログラム
を書く事ができるのではないでしょうか
正直仕様の罠もたくさんありますが、ぜひ頑張って頂ければなと思います


> このような質問は雑談の方が良いのでしょうかね?
いえ、雑談ではなく質問カテゴリのままでよろしいかと思いますよ
私が「雑談に近い余談」と書いたのは、次の三点があったからです
 ・既に質問が”解決”状態であったこと
 ・私の書き込みは補足的な情報で構成されていること
 ・本来必要ないHSP本体の実装の話にまで多少ながら踏み込んでいること

困っていることを書いて意見を頂く場合は”質問”だと思います



ぴょぴょ

リンク

2013/11/21(Thu) 17:46:21|NO.58339

> 困っていることを書いて意見を頂く場合は”質問”だと思います
了解。



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