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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1214
dogsdim 確保サイズ5解決


dog

リンク

2016/12/14(Wed) 17:49:25|NO.77575


sdim s, 456 //0~456(456文字+null)まで確保? poke s, 456, 0 //エラー
sdimで確保されるサイズは、文字数+1ではないのでしょうか。
WinAPIで、NULLを含まない文字列のサイズが返ってきたとき、sdim buf, sizeでいいのですか。
最後にNULL足そうとすると、エラーになります。



この記事に返信する


tds12

リンク

2016/12/14(Wed) 18:15:45|NO.77576

sdim s,456
これでsに456バイトが確保されます。

pokeの第2引数は、0バイト目、1バイト目と数えていき、
456番目は455バイト目となります。



nori

リンク

2016/12/14(Wed) 23:15:54|NO.77580

sdimでは文字数+1ではなく文字数を確保になりますね
なのでnullを追加するのであればsdim buf, size+1で良いかと 



dog

リンク

2016/12/15(Thu) 09:10:23|NO.77584

では、456文字分入れるつもりでsdim buf, 456としても、456文字入れた場合、
1バイト拡張されているということですか



MillkeySoftware

リンク

2016/12/15(Thu) 10:24:52|NO.77585

sdim (文字列型変数)の初期確保バイトは、64バイトです。
それを超えるバイト数は、確定バイトとなります。

HSP特有のメモリ自動再確保機能が動作するのは、文字列を扱う命令のみです。
poke などのメモリ内容を直接操作する命令には対応していません。

なので、poke の場合、確保されたバッファを超えてしまっているのでエラーとなります。

>>では、456文字分入れるつもりでsdim buf, 456としても、456文字入れた場合、
>>1バイト拡張されているということですか
buf に入れる方法にもよります。

buf = "456文字"
などで入れた場合は、NULL 文字が付与され 457 バイトのメモリが再確保されます。

明示的に NULL 文字を付与する方法

buf = "456文字" + "\0"
などの方法で明示的に NULL 文字を付与した場合、458 バイトのメモリが再確保されます。
これは、自分で付与した NULL 文字も含めて、HSPが最後に NULL 文字を付与しているので 458バイトとなります。

poke で NULL 文字を入れようとした場合は、そもそもバッファオーバーフローを起こしますので入れれません。

sdim buf,456 poke buf,456,0 //メモリの456番地を操作しようとしているのでエラー

基本的に、メモリを動的に確保する場合、nori さんが回答している方法で行ってください。



dog

リンク

2016/12/15(Thu) 13:50:23|NO.77587

「文字数を指定する」とかいてあるので、sdimは、指定したサイズ+1自動で確保してくれるもの
だと思っていました。
64バイト以上だと、指定したサイズ分そのまま確保する、mallocと同じようなものなのですね。
ありがとうございました。



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