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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0527
やみねこstr変数って中身はどうなってるんでしょうか?21解決


やみねこ

リンク

2008/5/27(Tue) 15:05:24|NO.16173

最近、ふと思いついて、

sdim a, 20, 5
 
とか して、20バイトを超える文字を書き込んだら、自動的に拡張されました。 それが正常動作なのでしょうけど、 20,5と指定したところで、固定長のメモリが確保されるところをイメージしていたので、 気持ち悪く感じました。 どこかで、 dimは拡張のたびに 「メモリ確保してコピーしてる」という話を聞いた気がしますが、 str型はどういう仕組みになっているんでしょうか? お手数ですが、よろしくお願いします。



この記事に返信する


やみねこ

リンク

2008/5/27(Tue) 15:07:16|NO.16174

何回やり直しても、
改行が消えてしまう… なんで?



y

リンク

2008/5/27(Tue) 15:59:31|NO.16175

その場合だと、拡張はされてないです。

sdim a,20,5 mes varptr(a(0)) mes varptr(a(1)) a(0)="abcdefghijklmnopqrstuvwxyz" mes a(0) mes varptr(a(0)) mes varptr(a(1)) stop
多分文字の長さの最低バイト数が128バイトになっているんじゃないでしょうか。
なので、この場合のメモリの再確保が行なわれるのは恐らく128バイト以上の文字列を書き込んだときかと。

あと拡張の際には別メモリに再確保されるみたいなので、
他の配列には影響はないので速度面以外に関してはあまり気にする必要はないと思います。

詳しく検証もせずに書き込んで申し訳ありませんが、この辺で。



StarratS

リンク

2008/5/27(Tue) 16:15:17|NO.16176

拡張されるようなスクリプトを書かなければ実装が可変だろうがなんだろうが、
使う側は関係ないんじゃないの?
変なところで気にするよね。

yさんへ>
128バイトがどうとか、大間違い。
まーvarptr使うくらいの人なので、あえて正解はいいませんけど。



StarratS

リンク

2008/5/27(Tue) 16:16:12|NO.16177

つまり二人とも、そんなこと気にするようなレベルじゃないってことだと思います。



やみねこ

リンク

2008/5/27(Tue) 20:26:50|NO.16186

>y さん

僕もvarptrで、dimやらsdimやら覗いてみました…
だけど、dimはつながっているようなのですが、sdimは良く分かりませんでした。
ありがとうございます。

>StarratS さん

すみません、変なことが気になって…

マップエディタを作っていまして、
マップサイズ変更のとき、配列の再確保前にデータを退避させるため、
dimで確保した場合はmemcpyで一括コピーとかやってしまっていますが、

sdimデータでマップデータを作ったら(テキストファイルで編集できますし…)
memcpy使っていいんだろうか?… 的な疑問からでした。

sdimの場合は一行ずつコピーしたほうが安全そうですね…



やみねこ

リンク

2008/5/27(Tue) 20:28:11|NO.16188

あ、もしかして、C#のStringみたいなオブジェクト型なんでしょうか?



StarratS

リンク

2008/5/27(Tue) 20:36:37|NO.16192

俺はC#知らないんけど、
HSPはC++で作られているから可変長と言ったらポインタ配列で実装、これ常套手段。
ほんま気になるならOpenHSP見てくれば〜?



StarratS

リンク

2008/5/27(Tue) 20:42:15|NO.16193

>sdimデータでマップデータを作ったら(テキストファイルで編集できますし…)
>memcpy使っていいんだろうか?… 的な疑問からでした。
>sdimの場合は一行ずつコピーしたほうが安全そうですね…
あー、HSP2時代は固定長だったからmemcpy使えたらしいけど、
HSP3はそんなわけで要素ごとにループまわして一個一個コピーしなきゃいけない

んだけど、
要望が多かったからv????とかいう命令ができたんだよー。



ANTARES

リンク

2008/5/27(Tue) 23:18:05|NO.16199

 デバッグ・ウィンドウが表示されたら、aについて調べて
実行ボタンを押してください。
少しは理解が深まるかも。

sdim a,20,5 mes varptr(a(0)) mes varptr(a(1)) assert a(0)="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" mes a(0) mes varptr(a(0)) mes varptr(a(1)) assert



StarratS

リンク

2008/5/27(Tue) 23:55:44|NO.16201

だからなんだ。ポインタ配列の説明で十分だな。



StarratS

リンク

2008/5/28(Wed) 00:28:13|NO.16205

ANTARESさんのサンプルは、ポインタ配列が?マークの人にとっては、意味のないものですよ。

あとちなみに
>v????
はvarptrではありません。
HSP3での(可変長)文字列配列をファイルに書き出すための命令です(そのために用意されたと思ってもいい)



やみねこ

リンク

2008/5/28(Wed) 13:06:42|NO.16215

>StarratS さん

ありがとうございます。
ポインタ配列だったんですね…
(C++は、本を読んだだけなので、よく分かってませんでした)

v????って、 もしかしてvsave、vloadですか?
追加されたけど、何に使うんだろう… と思ってました。

ありがとうございました。
(OPEN HSPも時間があるときに、少しずつ勉強したいと思います)

>ANTARES さん

非常に分かりやすいスクリプトでした。
ありがとうございます。

デフォルトで64バイト(63+終端コード)分確保されてるんですね。
それを超えるとポインタが移動したのが分かりました。

悪い癖で、要素0と要素1の間が何故
88バイト(sdim a,64以上をやると変化する)なのか、
気になりだしたので、今度はそれを調べてみようと思います。



StarratS

リンク

2008/5/28(Wed) 19:17:05|NO.16225

>気になりだしたので、今度はそれを調べてみようと思います。
がんばれー。



ANTARES

リンク

2008/5/28(Wed) 22:30:29|NO.16235

>デフォルトで64バイト(63+終端コード)分確保されてるんですね。
>それを超えるとポインタが移動したのが分かりました。
 デバッグウィンドウの「バッファサイズ」を見てほしかったのですが……。



やみねこ

リンク

2008/5/29(Thu) 13:18:34|NO.16262

63+終端は、何か見間違えていたようです。

キーボードからアルファベットを入力して、
そのままa(0)に 追加していくようなプログラムを書いて、

screen 0に メモリダンプしてみたら、
64バイト書き込めていました。

65バイト目を書き込みに言ったところで、アドレス移動…でした。

ちなみに、300バイトほどダンプしていたところ、
隙間(a(0)とa(1)の間)の数値は、アドレス移動すると、
そのさきでは0になっており(一緒に移動してこないのかも)
なにか、変数を管理する為の符号のようなものなのかなと、
思っています。

色々とありがとうございました。
(あとは、HSPのソース読まないと分からないし… ^^;)



ANTARES

リンク

2008/5/29(Thu) 21:09:14|NO.16282

>>デフォルトで64バイト(63+終端コード)分確保されてるんですね。
>>それを超えるとポインタが移動したのが分かりました。
> デバッグウィンドウの「バッファサイズ」を見てほしかったのですが……。
 訂正。
 デバッグウィンドウの「バッファサイズ」も見てほしかったのですが……。


>screen 0に メモリダンプしてみたら、
>64バイト書き込めていました。
 何かの勘違いでは?
なお、メモリダンプは自分でやらなくてもデバッグウィンドウに表示できます。
HSP2と違って、少なくとも379バイトまでは終端コードまでダンプしてくれるようです。
(それ以上は調べてないだけで、ダメというわけではありません)

sdim a,20,5 mes varptr(a(0)) mes varptr(a(1)) ;assert a(0)="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" mes a(0) mes varptr(a(0)) mes varptr(a(1)) mes "strlen="+strlen(a(0)) assert



やみねこ

リンク

2008/5/30(Fri) 13:22:56|NO.16302

>ANTARESさん

ごめんなさい。
書き方が悪かったみたいです。
本当に申し訳ありませんでした。

64バイト…の件は、たしかに勘違いでした。
0〜63バイトまで書き込んでいるつもりでしたが、
1〜63バイトでした…
自分で書いたルーチンで、勘違いしてました…

あと、ダンプを画面に出したのは、
4通りの表示が見たかったからで、

1.dupptr c, varptr(a(0))-24, 300 して、
  好きな位置で改行してみたかった。(結果的は4バイト単位になったけど)
2.ポインタが移動した先の、ダンプが見たかった
3.32ビットデータで見てみたかった(アドレスが書き込まれる可能性から)
4.ポインタが移動した後、移動する前のメモリはどうなるのか?

でした。

でも、2番は、デバッグウインドウをちゃんと見ていたら、
解決してましたね…

移動したとたんバッファが4096バイトになってました…
ダンプの結果は、
まっさらな 0の大地が広がっていた事は言うまでもありません。

なんだか、HSP使っていてポインタの勉強になるとは思っても見ませんでした。
少しだけポインタが分かった気がします。

ありがとうございました。

(ちなみにバッファは24バイトで中には、二つのアドレスが入ってました。
 データの開始位置と、管理情報の開始位置でした。
 残りのデータが なんであるかは、謎です… )



StarratS

リンク

2008/5/30(Fri) 18:11:08|NO.16309

はいはい、そうやってズルズルとレスを引き伸ばして、
誰かがズバリ教えてくれるのを期待するのはやめましょう!
HSPを素っ裸にするような内容が入門者も利用する掲示板に書かれていたら、
入門者が実力にそぐわないことをしでかそうとするじゃぁありませんか。
勉強は静かに落ち着いてやりましょう。
掲示板でその成果を報告する必要もないと思いますー。



StarratS

リンク

2008/5/30(Fri) 18:19:35|NO.16310

やみねこさん>
だからな、HSPのソースを見ればいいんだよ。
データの詳細も分からずにメモリを徘徊するのは危険なことですよ。
危険が及ぶのはやみねこさんだけですが、
危険を知らない人も見てることだしね。



やみねこ

リンク

2008/5/30(Fri) 18:26:56|NO.16312

>StarratSさん

>掲示板でその成果を報告する必要もないと思いますー。

>危険を知らない人も見てることだしね。

なるほどです。
質問した以上、結果を書いておくべきかと思いましたが、
関係ない人が なんとなく真似して火傷したら申し訳ないですね…

これ以降は、沈黙します。

すみませんでした。



StarratS

リンク

2008/5/30(Fri) 18:29:36|NO.16314

え、すみませんでしたって言われるとなんか俺が悪者みたいな・・・。
すみませんでした。



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