コンパイラが出すエラーの文字列で・・・

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

コンパイラが出すエラーの文字列で・・・

#1 投稿記事 by Mario2 »

ActiveBasic4.02.00で(多分最新版でも同じことが発生するかもしれませんが)、たとえば

コード: 全て選択

Sub MusicFileOpen(FileName As BytePtr)
(処理)
End Sub
というSubがあり、それを呼び出すとき、

コード: 全て選択

MusicFileOpen(Mid$(buffer,hTop+2))
(Mid$を何かの文字列に代入?すればエラーはなくなると思いますが・・・)
を使うと、
MainWnd.sbp(48) - "MusicFileOpen関数の第1パラメータ"はポインタ(以下略)
と出るのですが、自分的には
MainWnd.sbp(48) - "MusicFileOpen"関数の第1パラメータはポインタ(以下略)
が良いと思うのですが、どうでしょうか?
自分的には関数の部分だけを「"」で囲うほうが良いんじゃないかと思いまして・・・・・
まぁ、ほとんどエラーの内容が分かるので、気にしてないんですけど、一応気になりましたので(微妙に矛盾…)、投稿しておきます。
皆さんはどうなんでしょうかね?
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#2 投稿記事 by tak »

コンパイラの内部事情なので、仕方ないです。
例えば、コンパイラが内部で次のようなフォーマットを保持していたとしましょう。
  1. %s関数の第%dパラメータ
  2. "%s"はポインタ変数型です。文字列演算を指定することはできません
C言語の sprintf()関数のようなもので 1. の %s には "MusicFileOpen" という文字列が、%d には "1" という文字列が格納されたとします。
これをバッファに格納しておき、2. の %s にそのままこのバッファを格納すると、

 "MusicFileOpen関数の第1パラメータ"はポインタ変数型です。文字列演算を指定することはできません

という文字列が生成されるわけです。
このように多重的に sprintf()関数を利用するのならば、ダブルクォートの移動は不可能ですよね。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#3 投稿記事 by Mario2 »

> このように多重的に sprintf()関数を利用するのならば、ダブルクォートの移動は不可能ですよね。

そうなんですか。勉強になります。回答ありがとうございます。
mako20
記事: 26
登録日時: 2005年5月31日(火) 01:10
お住まい: 岡山県
連絡する:

#4 投稿記事 by mako20 »

でも、全角の”は、使おうとすれば使えると思いますが?

コンパイラは全角を文字として認める特性があるので(yacc/lexを少し経験したときに思いました)
Abs

#5 投稿記事 by Abs »

これは、製作上の都合だと思います。
以下のコードで実現できます。

コード: 全て選択

#include <stdio.h>

void main()
{
	char* pmsg = "\"%s\" 関数の第%dパラメータ";
	char* pmsg2 = "%sはポインタ変数型です。文字列演算を指定することはできません";
	char sztmp[256];
	char szmsg[256];
	
	sprintf(sztmp, pmsg, "MusicFileOpen", 1);
	sprintf(szmsg, pmsg2, sztmp);
	printf(szmsg);
	
}
Abs

#6 投稿記事 by Abs »

"コンパイラの内部事情"とは、"制作上の事情"と言うことなんですね。
失礼しました。
返信する