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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0516
窓口バッファのサイズ11解決


窓口

リンク

2009/5/16(Sat) 23:44:33|NO.25193

sdim で作成された配列変数は内部でメモリ的に
どのようになっているか知っている人はいますか?

例えば

sdim s_ , 4 , 10
sdim _s , 4 * 10

この二つの変数のバッファのメモリサイズはイコールではないのでしょうか?



この記事に返信する


レノス

リンク

2009/5/17(Sun) 02:31:00|NO.25196

イコールではありません。

str型変数は、仕様上、最低でも1要素あたり 64 バイトは確保します。
そのため、そのスクリプトは

sdim s, 64, 10 sdim _s, 64
と同義です。

追記:
あ、「メモリが無駄だぞこのヤロー」とか考えるのは無しの方向で。



窓口

リンク

2009/5/18(Mon) 03:39:37|NO.25229

なんとメモリが無(ry

ありがとうございます。
と言うことは

sdim s_ ,,10 sdim _s ,64*10
でメモリサイズ的にイコールということですか。



abast

リンク

2009/5/18(Mon) 21:22:43|NO.25236

>なんとメモリが無(ry
いちいち乗らなくていいよ。だるいんで。

内部的なことを話しても無駄だと思いますので結論だけいいます。

>sdim s_ ,,10
>sdim _s ,64*10
>でメモリサイズ的にイコールということですか。

違います。
前者のほうがメモリを消費します。



abast

リンク

2009/5/18(Mon) 21:26:08|NO.25237

「メモリ、メモリ」を言ってる方に限って消費メモリをシビアに考えていないということが
ままあります。

たとえばn次元配列は1次元配列よりメモリを消費するから
n次元配列を1次元配列の写像とすることで

「消費メモリの軽量化」

と うたっているソフトウェアはよくみかけます。



窓口

リンク

2009/5/19(Tue) 02:24:03|NO.25245

ビットシフトでリピートを使わずに、
配列変数全体に掛け算を適用したいと思っていたんです。

sdim _s,32,10 で作られた配列変数を
sdim s_,32*10 で作られたバッファにコピーして
ビットシフトののちに
memcpy _s , s_ , size , 0 , 0

としたら、_sはすべての要素が二乗された値になるはずです。

書き込むには lpoke
読み込むには lpeek
を使います。

そのためには、内部的なメモリサイズがどうしても必要だったんですが。

一応
lpeek(s_,32*[loadpoint])
で必要な部分を読み取ることができることは解りますが。
ちょっとmemcpy してみたら値が変になったのでここで質問した次第です。



abast

リンク

2009/5/19(Tue) 11:04:28|NO.25247

こういう質問はいつになっても多いですね。
おそらくHSPの仕様(の設計)と実装が悪いからなんでしょうね。

HSPはデータ型を意識しないですむスクリプト言語に属してはいるけど
モジュールを使い出すと 途端にC/C++言語の実装が丸出しになってしまって
データ型に縛られる。
同じようにmemcpyやvarptrのようなメモリとポインタ周りの実装がカッチカチに固められてしまっていて、
メモリの使われ方を意識しないとプログラミングできない。
HSP3.2をリリースするのとは別に、そういった問題点を設計しなおしたHSP4に着手するべきと思う。

>sdim _s,32,10 で作られた配列変数を
>sdim s_,32*10 で作られたバッファにコピーして
>ビットシフトののちに
>memcpy _s , s_ , size , 0 , 0

ヘルプに書かれていないものだから間違えるのは仕方ない。
そのままでは不正なコピーとなります。

そもそも"同様の構造"でないコピー元配列とコピー先配列間で一括コピーを行うことに
違和感を感じて欲しい。

縦2段、横5段のパックに入った卵10個を、 横5段、縦2段の空のパックに、 まとめて移し変える
ということを考えてみて。
左から右に移し変えるだけでは卵はこぼれて割れてしまうでしょう。
そこで、左と右の容器の向きを合わせてから移し変えるとか、
左から取り出した卵の向きを右の容器の向きに合わせてから移し変えるとか、
するでしょう。

>書き込むには lpoke
>読み込むには lpeek

ワード単位で読み書きするならわざわざsdimである必要はないのでは?



abast

リンク

2009/5/19(Tue) 11:10:36|NO.25248

>ビットシフトでリピートを使わずに、
>配列変数全体に掛け算を適用したいと思っていたんです。
>sdim _s,32,10 で作られた配列変数を
>sdim s_,32*10 で作られたバッファにコピーして
>ビットシフトののちに

第一、配列要素をビットシフトするのに、リピートを使うでしょう。

高度なことをやろうとして、基本的なことが抜け落ちてますよね。

もしかして 配列全体にビットシフトをすれば、
配列全体のビットがシフトされるとか思ってるのかな。
そんなことどこに書いてあるんだか・・・。

「ビットシフトで掛け算を」もどこで覚えたのか怪しいですね。
経験者気取りの初心者ですかね?



b

リンク

2009/5/19(Tue) 13:29:42|NO.25249

なんでそんな攻撃的な・・・



abast

リンク

2009/5/19(Tue) 14:25:53|NO.25250

せっかくアドバイスしてあげたのに攻撃的呼ばわりされて不愉快っすね



窓口

リンク

2009/5/19(Tue) 15:53:57|NO.25251

解りやすい解説有難うございます。

ちなみに
sdim s_,32*10
のバッファの方をビットシフトするつもりでした。

自分に関しては
経験者気取りの初心者、と言う認識で間違いありません。

ちなみにビットシフトの知識はhsp3に付いている「プログラミングマニュアル」
からです。

以後気をつけます。



窓口

リンク

2009/5/19(Tue) 16:10:45|NO.25252

b さん

大丈夫です、自分はMですから。
どんどん攻撃してください(笑)


abast さん

Mというのは嘘です。
ただ、鈍感なだけです。


解決しました。



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