ab.com コミュニティ https://www.activebasic.com/forum/ |
|
AB5にてコンパイルするとエラーになります。 https://www.activebasic.com/forum/viewtopic.php?t=4527 |
ページ 1 / 1 |
作成者: | Tako [ 2013年8月21日(水) 16:18 ] |
記事の件名: | AB5にてコンパイルするとエラーになります。 |
昔作成したソフトをAB5に変換していますが、エラーで困っています。 AB4では正常にコンパイル&動作しますが、AB5.0.0.5ではコンパイル時にコメントに記載したエラーがでます。 コード: Sub MainWnd_CommandButton1_Click() Dim A As String Dim B As Long Dim Buff As BytePtr Dim Buff2[20] As Byte Buff1 = calloc(20) lstrcpy(Buff1 As VoidPtr, "0123456789") lstrcpy(Buff2 As VoidPtr, "0123456789") A = MakeStr(Buff1) '①"MakeStr" 戻り値が存在しないプロシージャです。 B = InStr( 1 , Buff1 , "34" ) '②"InStr"の第2パラメータが、*ByteからSystem.Stringに変換できません。 B = InStr( 1 , Buff2 , "45" ) '③"InStr"の第2パラメータが、(null)からSystem.Stringに変換できません。 MsgBox 0, Buff1 , "" '④"MSGBOX"の第2パラメータが、*ByteからSystem.Stringに変換できません。 free(Buff1) End Sub解決方法を教えて下さい。 |
作成者: | たかせ [ 2013年8月22日(木) 00:02 ] |
記事の件名: | Re: AB5にてコンパイルするとエラーになります。 |
AB4とAB5ではStringのデータの仕様が異なるのでAB5に手直しする必要が発生する場合があります。 ここで確認したいのですが、 ①変数Aは実質使用されていないので不要ですよね? ②変数BuffはじつはBuff1が正解ですよね? 次のように修正しました。 なおInStrをINSTRに変更しました。 Sub MainWnd_CommandButton1_Click() 'Dim A As String Dim B As Long 'Dim Buff As BytePtr Dim Buff1 As BytePtr Dim Buff2[20] As Byte Buff1 = calloc(20) lstrcpy(Buff1 As VoidPtr, "0123456789") lstrcpy(Buff2 As VoidPtr, "0123456789") 'A = MakeStr(Buff1) 'B = InStr( 1 , Buff1 , "34" ) 'B = InStr( 1 , Buff2 , "45" ) 'MsgBox 0, Buff1 , "" B = INSTR( 1 , Buff1 , "34" ) B = INSTR( 1 , Buff2 , "45" ) MessageBox(NULL,Buff1,"Buff1の内容",MB_OK) MessageBox(NULL,Str$(B),"Bの内容",MB_OK) 'INSTR結果確認用 free(Buff1) End sub /* InStrの代用 */ Function INSTR(I1POS As Long,I2STRP As *Byte,I3STRP As *Byte) AS Long Dim POSP As *Byte Dim PLEN As Long POSP = strstr(I2STRP + I1POS,I3STRP) If POSP = NULL Then PLEN = 0 Else PLEN = POSP - I2STRP + 1 End If INSTR = PLEN End Function End AB4/AB5共にコンパイルと実行が正常に行われました。 ただAB5では警告メッセージがでるので*Byteを*Charまたは*SByteにしたほうがよいかもしれません。 ちなみに strstrはCの標準関数です。 念のためご確認よろしくお願いたします。 |
作成者: | Tako [ 2013年8月22日(木) 10:44 ] |
記事の件名: | Re: AB5にてコンパイルするとエラーになります。 |
たかせ様 ありがとうございます。 おかげさまで、だいぶ解決しました。 >> ①変数Aは実質使用されていないので不要ですよね? MakeStrも、なんとかしたいです。 コード: Dim A As String Dim Buff1 As BytePtr Buff1 = calloc(20) lstrcpy(Buff1 As VoidPtr, "0123456789") A = MakeStr(Buff1) '①"MakeStr" 戻り値が存在しないプロシージャです。 MessageBox(NULL,A,"Aの内容",MB_OK) free(Buff1)>> ②変数BuffはじつはBuff1が正解ですよね? その通りです。 申し訳ありません。 >>ただAB5では警告メッセージがでるので*Byteを*Charまたは*SByteにしたほうがよいかもしれません。 下記の様にしてみましたが、警告が消えません。(*Charにしても同様です。) 引用: Function INSTR(I1POS As Long,I2STRP As *SByte,I3STRP As *SByte) AS Long
問題の無いコードに見えますが、警告を消す方法をお願いします。Dim POSP As *SByte Dim PLEN As Long POSP = strstr(I2STRP As VoidPtr + I1POS As VoidPtr,I3STRP As VoidPtr) As VoidPtr If POSP = NULL Then PLEN = 0 Else PLEN = POSP - I2STRP + 1 :'←[警告] *SByteからLongに強制変換されています。 End If INSTR = PLEN End Function 宜しくお願いします。 |
作成者: | たかせ [ 2013年8月22日(木) 11:57 ] |
記事の件名: | Re: AB5にてコンパイルするとエラーになります。 |
>MakeStrも、なんとかしたいです。 現状ではMekeStrだとうまくいかないのでMekeStrを使用しないよう修正する必要があります。 対応その1 Dim A As StringをDim A(19) As Byteに変更 A = MakeStr(Buff1)をlstrcpy(A,Buff1)に変更 >下記の様にしてみましたが、警告が消えません。(*Charにしても同様です。) すみません私のミスです。キャストが抜けてました。 キャストにより受け取り側のデータの型に合わせれば警告がでなくなります。 この場合PLENがLong型なので PLEN = XXXXXX As Longにします。 対応その2 PLEN = POSP - I2STRP + 1をPLEN = (POSP - I2STRP + 1) As Longに変更 それからInStrは文字列検索開始位置が1からスタートするのでINSTRもそれに合わせるため、 以下の対応を行って下さい。これも私のミスでした。 対応その3 POSP = strstr(I2STRP + I1POS,I3STRP)をPOSP = strstr(I2STRP + I1POS - 1,I3STRP)に変更 念のためご確認よろしくお願いいたします。 |
作成者: | たかせ [ 2013年8月29日(木) 22:56 ] |
記事の件名: | Re: AB5にてコンパイルするとエラーになります。 |
>MakeStrも、なんとかしたいです。 上記でMakeStr以外の方法を記載しましたが過去のトピックに解決方法が記載されていました。 対応方法 A = MakeStr(Buff1) を A = MakeStr(Buff1 As PCSTR)にするとOKです。 参考トピック MakeStr on ab5.0.0.5(rev.535) ご確認よろしくお願いいたします。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |