ページ 1 / 1
AB5にてコンパイルするとエラーになります。
Posted: 2013年8月21日(水) 16:18
by Tako
昔作成したソフトを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
解決方法を教えて下さい。
Re: AB5にてコンパイルするとエラーになります。
Posted: 2013年8月22日(木) 00:02
by たかせ
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の標準関数です。
念のためご確認よろしくお願いたします。
Re: AB5にてコンパイルするとエラーになります。
Posted: 2013年8月22日(木) 10:44
by Tako
たかせ様
ありがとうございます。
おかげさまで、だいぶ解決しました。
>> ①変数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
問題の無いコードに見えますが、警告を消す方法をお願いします。
宜しくお願いします。
Re: AB5にてコンパイルするとエラーになります。
Posted: 2013年8月22日(木) 11:57
by たかせ
>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)に変更
念のためご確認よろしくお願いいたします。
Re: AB5にてコンパイルするとエラーになります。
Posted: 2013年8月29日(木) 22:56
by たかせ
>MakeStrも、なんとかしたいです。
上記でMakeStr以外の方法を記載しましたが過去のトピックに解決方法が記載されていました。
対応方法
A = MakeStr(Buff1) を A = MakeStr(Buff1 As PCSTR)にするとOKです。
参考トピック
MakeStr on ab5.0.0.5(rev.535)
ご確認よろしくお願いいたします。