ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 17:29

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2013年8月21日(水) 16:18 
昔作成したソフトを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
解決方法を教えて下さい。


通報する
ページトップ
   
投稿記事Posted: 2013年8月22日(木) 00:02 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 215
お住まい: 東京都
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の標準関数です。
念のためご確認よろしくお願いたします。


通報する
ページトップ
投稿記事Posted: 2013年8月22日(木) 10:44 
たかせ様
ありがとうございます。
おかげさまで、だいぶ解決しました。

>> ①変数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
問題の無いコードに見えますが、警告を消す方法をお願いします。

宜しくお願いします。


通報する
ページトップ
   
投稿記事Posted: 2013年8月22日(木) 11:57 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 215
お住まい: 東京都
>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)に変更

念のためご確認よろしくお願いいたします。


通報する
ページトップ
投稿記事Posted: 2013年8月29日(木) 22:56 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 215
お住まい: 東京都
>MakeStrも、なんとかしたいです。
上記でMakeStr以外の方法を記載しましたが過去のトピックに解決方法が記載されていました。
対応方法
A = MakeStr(Buff1) を A = MakeStr(Buff1 As PCSTR)にするとOKです。
参考トピック
MakeStr on ab5.0.0.5(rev.535)
ご確認よろしくお願いいたします。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[13人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean