ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 07:06

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




新しいトピックを投稿する  トピックへ返信する  [ 6 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年7月23日(土) 11:19 
オフライン

登録日時: 2005年7月23日(土) 10:58
記事: 2
今後ActiveBasicを使わさせてもらおうと,いろいろ試しています。

ByteStrを引数に取るプロシージャを作成し,それを呼び出す際,
引数の与え方によってエラーが発生してしまいます。

下記のプログラムサンプルをご覧ください。

引数としてStrPtr()関数を直接使用すると,「無効な識別子」と
叱られます。
でも,一度BytePtr型変数に代入してからだと叱られません。

何か記述方法を間違っているのでしょうか?
(間違っているとしたら,プロシージャの宣言部分だろうと思う
のですが...)
コード:
#console

Main()

Sub PrintString(ByRef myString As BytePtr)
    MsgBox 0, myString, "Print String"
End Sub

Sub Main ()
    Dim myString As String
    myString = ZeroString(100)
    lstrcpy(StrPtr(myString), "Message")

    '下記記述だと「StrPtr(myString)が無効な識別子」と叱られる
    PrintString(StrPtr(myString))

    '下記記述だとOK。なぜ?
    Dim myStringPtr As BytePtr
    myStringPtr = StrPtr(myString)
    PrintString(myStringPtr)
End Sub


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年7月23日(土) 12:38 
オフライン

登録日時: 2005年7月19日(火) 19:47
記事: 98
お住まい: 山形県
引数が(ByRef myString As BytePtr)の場合は
「BytePtr型のポインタ参照」となり、
何か変数を渡さなければならない為
StrPtr()では渡せなくなってしまいます。
下のエラーにならない例では、
BytePtr型のmyStringPtrをポインタ参照しているので
きちんと渡せています。

PrintString関数の引数をByValにすれば変数でない値も渡せるので、
この方法を使えば良いと思います。
この場合も、下のmyStringPtrは結局は値参照なので
エラーになりません。
コード:
#console

Main()

Sub PrintString(ByVal myString As BytePtr)
    MsgBox 0, myString, "Print String"
End Sub

Sub Main ()
    Dim myString As String
    myString = ZeroString(100)
    lstrcpy(StrPtr(myString), "Message")

    PrintString(StrPtr(myString))

    Dim myStringPtr As BytePtr
    myStringPtr = StrPtr(myString)
    PrintString(myStringPtr)
End Sub

_________________
Toshi's Recess Room
http://toshi.my.land.to/


通報する
ページトップ
投稿記事Posted: 2005年7月23日(土) 13:22 
こんな関数に
コード:
Sub Proc(ByRef Num As Long)
	Num = 1
End Sub
Proc(0)という呼び出しはできないというのはなんとなくわかると思います。
引数が関数の戻り値の場合もこれと同じ扱いを受けます。

Naruさんの例では実際には変数の中身を書き換えてはいませんが、ByRefを指定すると書き換えられるものとして扱われるのでNaruさんのコードもエラーになってしまいます。

しかし抜け穴があってPrintString(ByVal VarPtr(myString))とすればコンパイルできるんですね。
どういうことかというとByRefの引数はByVal VarPtr()と等価になります。
つまりPrintString(myStringPtr)という呼び出しはPrintString(ByVal VarPtr(myStringPtr))と同じになります。
String型は表面上BytePtrと同じように文字列をさすポインタからなっているのでこういう芸当が出来るんです。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年7月23日(土) 13:35 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
上のは私です。ログインし忘れました。
もう少し書き足したいのに編集できない……。

たとえPrintString(ByVal VarPtr(myString))でできたとしてもそれになんの意味があるかと聞かれれば答えようがありません。
そこへ文字列の代入をしたらまずいですし、文字列内の個々の文字の書き換えは出来ますがこれは別にByValでもできます。
ByRef Longの引数にDWord型の変数を渡したい、というのならまだ使い道がありそうですが。


最後に編集したユーザー イグトランス [ 2005年7月24日(日) 08:48 ], 累計 1 回

通報する
ページトップ
投稿記事Posted: 2005年7月23日(土) 22:40 
オフライン

登録日時: 2005年7月23日(土) 10:58
記事: 2
どうもありがとうございました。
解決しました。

ポインタはByRefで宣言するのだと,勝手に間違った解釈をしてしまって
いました。

どうもありがとうございました。


通報する
ページトップ
投稿記事Posted: 2005年7月24日(日) 12:22 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
補足しますと。

ByRefは「ポインタを引き渡していないように見せながら実際にはポインタを引き渡す」ものです。
ですので,本当にポインタそのものを引き渡すときはByVal(デフォルト)となります。

_________________
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================


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

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


オンラインデータ

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


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

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