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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1028
@keysdimについて17解決


@key

リンク

2012/10/28(Sun) 18:29:17|NO.50296

sdimで設定したデフォルト文字数の取得はできすか?

それとsdimで設定したデフォルト文字数は次に設定した要素分確保されてる、という認識でいいんでしょうか
例えば、
sdim objname,200,50
だと、200文字分が50確保される、という事ですか?



この記事に返信する


ANTARES

リンク

2012/10/28(Sun) 19:16:02|NO.50300

>sdimで設定したデフォルト文字数の取得はできすか?
 たぶんあると思いますが、変数に記憶しておく方が早いのでは?

>sdim objname,200,50
>だと、200文字分が50確保される、という事ですか?
 実際の内部動作はよくわかりませんが、使う分にはそう考えてかまいません。
ただし、200文字ではなく199バイトです。全角1文字は2バイト消費します。
1バイト少ないのは、ターミネータ(終わりの目印)に1バイト消費するからです。
また、50に対応する添え字は0〜49ということにも注意してください。



@key

リンク

2012/10/28(Sun) 19:34:04|NO.50301

ありがとうございます

sdimで設定したデフォルト文字数の取得が知りたいのはsdim配列で指定した要素を
削除(memcopyで消し去るだけ 全体要素数は変えない)する関数を作りたいので聞いています
上の方法以外で同じことができるなら、教えてくれると助かります



KA

リンク

2012/10/28(Sun) 20:55:57|NO.50302

sdimの要素数って再確保しないと変わらないんじゃないかな。
単一要素で確保しない限りmemcpyも危なくて使えないような気がします。

sdimは要素長を再確保する事が有るので、連続したアドレスには存在しな
い事が有ります。

それと1バイト指定しても、最低64バイトは確保されます。
(そう説明書に書いてあった。)



ANTARES

リンク

2012/10/28(Sun) 20:59:53|NO.50303

 検索してみたけど、ないみたいです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=28388

 質問は「デフォルト」なのでなぜ変数に記憶するのじゃダメなのか理解に苦しみますが、
クリアするだけなら各要素の先頭にpokeで0を書くだけで十分です。
全体をクリアする必要があり、しかも、デフォルトから拡張されているかもしれない
ということが心配なら、要素ごとに異なる可能性があるので、要素ごとにPVal構造体を見る
必要があります。
結局、dll命令を作るかstrlenで代用するしかないですね。



ANTARES

リンク

2012/10/28(Sun) 21:13:02|NO.50304

あ、連続してるなんて思っちゃだめよ。
連続しなくなったんで、みんな苦労してるんだから。
間違いなく改悪ですけどね。



レノス

リンク

2012/10/28(Sun) 22:18:55|NO.50306

デフォルト文字数(バッファサイズ)の情報は内部で特に保存されていないので、
自動拡張した場合は取り出すことができなくなります。ゆえに自分で保存する他ありません。

memcpy ……じゃなくて memset (ですよね?) を使うならデフォルトではなく
現在のバッファサイズを知るべきだと思うのですが

それで、それには以下の方法があります (黒魔術ですが)
> HSP開発wiki STRBUF
http://hspdev-wiki.net/?HSP3%2FSTRBUF

sdim a, 80, 2 dupptr size, varptr(a(1))-16, 4 mes strf("alloced\t= %d byte.",size) a(1) = {" 012345678901234567890123456789 012345678901234567890123456789 012345678901234567890123456789 "} // 自動拡張 dupptr size, varptr(a(1)) - 16, 4 mes size

またdllを使えば容易にバッファサイズを知ることができます
(デバッグウィンドウが変数のバッファサイズを取得するときのを流用できる)
簡単なので作りました
http://www1.axfc.net/uploader/File/so/85043.zip (passなし)

ちなみに
> 200文字ではなく199バイトです
200バイトが確保されるけど使えるのは実質199バイトだけ、
と言ったほうが分かりやすいかと

> 要素ごとにPVal構造体を見る
この情報は PVal にはありません
PVal はあくまで変数1個を管理するものなので

> 連続しなくなった
バッファが連続してしまっていたら
要素ごとの自動拡張にすごく時間がかかりますし



レノス

リンク

2012/10/28(Sun) 22:45:42|NO.50308

追記

ANTARES さんが解説していらっしゃるように、
文字列は 0 があるところで終わると解釈されるので
文字列データを空にしたいだけなら poke で先頭に0を書くだけで十分です。
すなわち "" を各要素に代入するのが一番シンプルな実装でしょう。

上のレスでは、文字列バッファを文字列以外のもののバッファとして使う場合は
そういうことができないので、方法が存在することを(若干過剰に)強調してみました。
必要に応じて判断するように。

というか前のスレで同じ方法を提案してましたね私
なぜ無視されたのかとまた沸々と怒りが(

> 作りました
癖で only hsp3.3rc1 と書いちゃってますが hsp3 以降ならどれでも動きそうでした



@key

リンク

2012/10/28(Sun) 23:36:44|NO.50311

説明不足でした
要素というのはobjname(X)のことで、Xを消してあとのはシフトする、という事です

それでmemcpyで後のをコピーして上書きしようと組んだんですがエラーが・・・
ってことは要素同士は連続してないってことですか・・・?



レノス

リンク

2012/10/29(Mon) 00:59:27|NO.50313

ANTARES さんのおっしゃっているように
要素ごとにバッファは独立して(不連続に)確保されています。
なので要素ごとにコピーするという方法しかありません。



ツオノ

リンク

2012/10/29(Mon) 01:01:58|NO.50314

hsp の文字列型配列はCであらわすと多分 こんな感じだと思います

STRBUF *sbf[3];

つまり、4byte の 配列にそれぞれに 文字列情報の位置を指した 32bit ポインタが代入されている感じです。
memcpy 一つで、全てクリアするのは諦めた方が良いでしょう。



@key

リンク

2012/10/29(Mon) 01:16:09|NO.50315

ありがとうございます
若干非効率ですが、
http://hsp.tv/play/pforum.php?mode=pastwch&num=46456
の方を使うことにします



てれてれ

リンク

2012/10/31(Wed) 17:54:20|NO.50385

毎度の事だけど@keyさんは解決チェックをしたら発作が起こる難病にでも罹っているのだろうか。

さらに言えば、例え自分が求めている回答で無かったとしても無視するのはおかしい。
態々時間を割いて回答をしてくれた人に対して失礼。

http://hsp.tv/play/pforum.php?mode=all&num=48978
http://hsp.tv/play/pforum.php?mode=all&num=49210
http://hsp.tv/play/pforum.php?mode=all&num=49648
http://hsp.tv/play/pforum.php?mode=all&num=49884
http://hsp.tv/play/pforum.php?mode=all&num=49973
http://hsp.tv/play/pforum.php?mode=all&num=50052



@key

リンク

2012/10/31(Wed) 18:54:54|NO.50386

チェックはちゃんとしてますよ
ただ、解決が無理そうな質問は無理に上げないで他の人の質問に答えてもらいたいと思ってるだけです



てれてれ

リンク

2012/10/31(Wed) 19:38:09|NO.50390

何やら誤解があるようだけど、
私がしているのは画面下部の解決のチェックボックスのチェックの話。

もちろんこれは強制では無いんだろうけど、
解決してるのに未解決状態だと後から見た人にとって分かりづらくてどうにも不親切。

>ただ、解決が無理そうな質問は無理に上げないで他の人の質問に答えてもらいたいと思ってるだけです
他の人に回答してもらいたい気持ちはわかるが、
それは、気に入らなかった回答を数ヶ月以上放置しても良いことの理由にはならないだろう。

結果的にあなたの求めた回答で無かったとしても、
他でも無いあなたの疑問に答えようと時間を割いて、
態々回答してくれた人が居るのだからお礼の一言ぐらい言ってもバチは当たらないのでは・・・



@key

リンク

2012/10/31(Wed) 19:44:48|NO.50391

解決チェックと略されると誤解の元です
解決のチェックは単純に忘れていたので申し訳ありません
気づくのが大抵数日後なので、スレを上げるのも変だと思ったのでそのままなんです



てれてれ

リンク

2012/10/31(Wed) 20:00:21|NO.50396

>解決チェックと略されると誤解の元です
「解決」チェックはこの掲示板で最も多く使われている名称だと思うのですが・・・
忘れていたのなら仕方がありませんね。

>気づくのが大抵数日後なので、スレを上げるのも変だと思ったのでそのままなんです
果たしてスレを上げることと回答を放置することのどちらが非礼なのでしょうね・・・

ここで議論をしても仕方がありませんし、私はそろそろ書き込みを控えさせて頂きます。
それでは、お騒がせしました。



@key

リンク

2012/10/31(Wed) 23:21:58|NO.50399

そういえばここも未解決のままでした・・・
アドバイスの通り解決にしましょう



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