ab.com コミュニティ https://www.activebasic.com/forum/ |
|
GetDWord関数のオーバーロード https://www.activebasic.com/forum/viewtopic.php?t=1679 |
ページ 1 / 1 |
作成者: | KICO [ 2006年11月15日(水) 12:48 ] |
記事の件名: | GetDWord関数のオーバーロード |
何時も、お世話に成っています。 コード: Dim str As String Dim size As Long str = ZeroString(20) size = GetDWord(str - SizeOf(DWord))Ver3.13では、size = 20 と取得出来ますが、 Ver4.24では、エラー:「型が違います」 と、成り (size = GetDWord(StrPtr(str) - SizeOf(DWord))とすれば、size = 20 と取得出来ます。) Ver5cp3 及び、Ver5β6では、エラー:「"Operator -" は定義されていません。」 と、成ります。 (size = GetDWord(StrPtr(str) - SizeOf(DWord))とすれば、エラーには成りませんが、 size = 20 と取得出来ません。) http://dev.activebasic.com/dai/?m=200607 (CStringクラス) 仕様が変わったのでしょうか? 宜しくお願いします。 |
作成者: | OverTaker [ 2006年11月15日(水) 16:34 ] |
記事の件名: | |
こんにちは、OverTakerです。 KICOさんの察した通り、Stringの仕様が変更になったため、このようなことが起こります。 コード: Dim str As String Dim size As Long str = ZeroString(20) size = GetDWord(str - SizeOf(DWord))このコードはちょっと意外ですね。以前String型は、文字列の先頭の前にサイズを表していたので、このような荒技的なコードが使用できました。 しかし、現在はWikiで見ると分かりますが、String型はコンパイラ定義ではなく、Stringクラスとして、ライブラリで提供されるようになりました。これにより、以前とは違ったStringクラスとなりましたので、その方法は使用できません。 文字列のサイズを取得する方法としては、以下の方法があります。 コード: #console Dim s As String s = "ActiveBasic" Print Len(s) Print lstrlen(s) Print s.Length Sleep(1000)他にもあるかもしれませんが、一番下のやり方はStringクラスで使用することができます。上の2つは、以前のコンパイラでも使用することができます。 現在のStringクラスはまだ完全ではありませんので、s.Lengthに値が書き込めてしまうのですが、誤作動を起こすのでそのようなコードは書かないようにしてください。 |
作成者: | KICO [ 2006年11月15日(水) 20:43 ] |
記事の件名: | GetDWord関数のオーバーロード |
OverTaker様、ありがとう御座います。 引用: 以前String型は、文字列の先頭の前にサイズを表していたので、このような荒技的なコードが使用できました。
それでVer5以降は使用できなかったのですね。(バグではなかったのですね、失礼致しました。)しかし、現在はWikiで見ると分かりますが、String型はコンパイラ定義ではなく、Stringクラスとして、ライブラリで提供されるようになりました。これにより、以前とは違ったStringクラスとなりましたので、その方法は使用できません。 引用: このコードはちょっと意外ですね。…
String型文字列をポインタ渡しで受け取った場合、lstrlen ではEOS(End Of String)までのバイト数は得られますが、ZeroString で確保したバイト数は、Len では得られないので GetDWord を使用しました。 コード(Ver3.13, Ver4.24 仕様) [ここをクリックすると内容が表示されます]
HeapSize関数に関する質問は、http://www.activebasic.com/forum/viewtopic.php?t=1678Dim str As String Dim buf As BytePtr Dim byt[MAX_PATH-1] As Byte Dim a As Long Dim b As Long Dim c As Long Dim d As Long str = ZeroString(20) buf = " " a=test(str) b=Len(str) c=test(buf) d=test(byt) Debug Function test(lpStr As BytePtr) As Long Dim str As String str="Test": test=Len(str) If HeapSize(GetProcessHeap(), 0, lpStr-4)<>-1 Then 'String Type If GetDWord(lpStr-4)<test Then Exit Function SetDWord(lpStr-4, test) 'サイズ書き換え End If lstrcpy(lpStr, str) End Function 「プログラミング質問板」で質問させて頂いていますので、そちらの方も宜しくお願い致します。 |
作成者: | イグトランス [ 2006年11月16日(木) 21:36 ] |
記事の件名: | |
そもそもBytePtr型の引数を受け取るところに,String型の変数が渡された場合を処理しようということで,無理が生じてしまいます。 私だったら,多くのWindows APIの関数がそうであるようにBytePtr型の引数と,その大きさを示す変数を取る関数を作り, 別途String型を受け取る版の関数を作ります。 (GetWindowTextとGetWindowTextStrのように) |
作成者: | KICO [ 2006年11月16日(木) 23:48 ] |
記事の件名: | Re: |
イグトランス (egtra)様、ありがとう御座います。 引用: そもそもBytePtr型の引数を受け取るところに,String型の変数が渡された場合を処理しようということで,無理が生じてしまいます。
呼び出し側のデータ型のチェックが出来れば、一つの関数で使い分けしなくて良いのでやっていましたが、無理な様ですね。「呼び出し側のデータ型のチェック」に、ついて 「プログラミング質問板」で、質問させて頂きます。 宜しくお願い致します。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |