人生のプチ美学を教えてください!!

ソース自体が長いので問題となっている所だけ書きます。

情報量が少なくて申し訳ありませんが…。

VC環境です。

/* define定義 */
#define IF_ITEM_CNT 14
  ・
  ・
  ・

/* 内部関数プロトタイプ宣言 */
int AnalyzeProc( char **pReturnString, char *pTargetString,
int StrNum, char String );          /* 文字列分解処理を行う関数 */
  ・
  ・
  ・

/* グローバル変数宣言 */
char In_Rec[ IN_FILE_MAX_LEN + 1 ];
char *w_In_Rec[ IN_ITEM_CNT + 1 ];
  ・
  ・
  
int Main{

  ・
  ・
}
int MainProc{
  ・
  ・
strncpy( g_dn03_rec.DN03_KISYU_MEI, sizeof( g_dn03_rec.DN03_KISYU_MEI ),
w_In_Rec[ 10 ], DN03_KISYU_MEI );
  ・
  ・
  M_Res = AnalyzeProc( &w_IN_Rec, In_Rec,
IF_ITEM_CNT, ',' );
  ・
addSpeace( 0, 0, DN03_KISYU_MEI_LEN, _dn03_rec.DN03_KISYU_MEI );
  ・
  ・
return ( TRUE );
}

となっているのですが、エラーが出ます。

Warning C4047 : '関数' : 内接参照のレベルが 'char **' と 'char *(*)[15]' で異ります。

Warning C4024 : 'AnalyzeProc' この型が 1 の仮引数および実引数と異なります。

Warning C4013 : 関数 'addSpace' は定義されていません。int型の値を返す外部関数と見なします。

あとリンクのエラーで
error : LNK2019 : 未解決の外部シンボル _addSpeace が関数 _MainProc で参照されました。

fatal error LNK1120: 外部参照 1 が未解決です。

というエラーが出るのですがどう直していいかわかりません。
Warning C4047も型が違うのはわかるんですがどうすればいいのか…。

Warning C4013は前にこのエラーが出たときはプロトタイプ宣言することでエラーは無くなったんですが、
今回のは違うみたいです。宣言の仕方が悪かったのかもしれませんが。

A 回答 (4件)

ソースコードが部分的にしか掲載されていないようなので、


確かな事はわかりませんが、

> Warning C4047 : '関数' : 内接参照のレベルが 'char **' と 'char *(*)[15]' で異ります。
>
> Warning C4024 : 'AnalyzeProc' この型が 1 の仮引数および実引数と異なります。
関数AnalyzeProcが宣言と、
呼び出し時で、引数の型が違っているので、出ている警告と思います。
関数を呼び出す時の、
パラメタは、宣言した通りの型を使って呼び出しましょう。

> Warning C4013 : 関数 'addSpace' は定義されていません。int型の値を返す外部関数と見なします。
> Warning C4013は前にこのエラーが出たときはプロトタイプ宣言することでエラーは無くなったんですが、
プロトタイプを宣言して、コンパイルの警告は、回避したつもりのようですが、

> error : LNK2019 : 未解決の外部シンボル _addSpeace が関数 _MainProc で参照されました。
リンク時に、エラーになっているのは、
addSpaceのプロトタイプはあるが、
実装が見つからないようです。

addSpaceの実装がどうなっているか確認しましょう。

この回答への補足

早速の回答ありがとうございます。

>関数を呼び出す時の、
>パラメタは、宣言した通りの型を使って呼び出しましょう。
&w_IN_Rec の部分をどのようにしたら
char **になるんでしょうか?

現行ではこれで通っていたようなので余計にわからなくなってます。

これだけの情報じゃさすがに難しいとは思いますが。

>プロトタイプを宣言して、コンパイルの警告は、回避したつもりのようですが、
これについては他のプログラムの改修中、VCの警告レベルを3に上げた際に
MainProcなどの関数がMain関数の下にあったため上記のエラーがでてプロトタイプ宣言で解決しました。

今回のエラーと同じエラーでも意味が違うということですか?

補足日時:2008/12/20 01:43
    • good
    • 0

w_IN_Rec の型は char *[15] であり, char ** ではありません>#3.

    • good
    • 0

>char *w_In_Rec[ IN_ITEM_CNT + 1 ];


>int AnalyzeProc( char **pReturnString, (以下略)
>M_Res = AnalyzeProc( &w_In_Rec, In_Rec, (以下略)

この3行を良く見ましょう。

「&」の無い「w_In_Rec」は「&w_In_Rec[0]」と同じです。「w_In_Rec[0]」は中身が「char *」ですから「&w_In_Rec[0]、つまりw_In_Rec」は「char **」です。

では「&w_In_Rec」は何ですか?

「&」がもう1つ付いてますから「char **へのポインタ、つまりchar ***」です。

int AnalyzeProc( char **pReturnString, (以下略)
と宣言しておいてchar ***を渡したら怒られて当たり前です。

呼んでる方の「&」が余計か、呼ばれてる方に「*」が1個足りません。

で、呼ばれてる関数AnalyzeProcで何をしてるかが質問文に書いてないので、呼んでる方の「&」が余計か、呼ばれてる方に「*」が1個足りないか、どっちが悪いのか判断出来ません。

>addSpeace( 0, 0, DN03_KISYU_MEI_LEN, _dn03_rec.DN03_KISYU_MEI );

「空間」を和英辞典で牽いてみましょう。そして、そこに載ってる単語と「Speace」の綴りが合ってるか、穴が開くほど見比べましょう。

この回答への補足

>呼ばれてる関数AnalyzeProcで何をしてるかが質問文に書いてないので
AnalyzeProcは以下のような処理をしています。

int AnalyzeProc( char **pReturnString,
char *pTargetString,
int StrNum,
char StripChar ) {
long StringLen; /* 処理文字列長 */
long ProcPos; /* 処理中ポインタ */
long StartPos; /* スタートポイント */
long GetStringNum; /* 取得文字列数 */
long HitCount; /* 合致数 */

/* 初期化 */
HitCount = StringLen = ProcPos = StartPos = GetStringNum = 0;

/* 文字列長の取得 */
StringLen = strlen(pTargetString);

/* 対象文字列のチェック */
if ( pTargetString == '\0' ) {
returnBAD;
}

/* 文字列数と区切り文字の関連チェック */
for( ProcPos = 0; ProcPos < StringLen; ProcPos++ ) {
if ( pTargetString[ProcPos] == StripChar ) {
HitCount++;
}
}

/* 区切り文字数チェック */
if ( StrNum != (HitCount + 1) ) {
return BAD;
}

/* 文字列分割退避 */
ProcPos = 0;
while (GetStringNum != HitCount) {
if ( pTargetString[ProcPos] == StripChar ) {
/* 退避領域の確保 */
if ( ProcPos == StartPos ){
/* 区切り文字間に何も文字がない場合NULL領域のみ確保 */
pReturnString[GetStringNum] = (char *)malloc(1);
memset((void *)pReturnString[GetStringNum], '\0', 1);
} else {
pReturnString[GetStringNum] = (char *)malloc((ProcPos - StartPos) + 1);
/* 確保領域の初期化 */
memset((void *)pReturnString[GetStringNum], '\0', ((ProcPos - StartPos) + 1));
/* 退避 */
memcpy( (void *)pReturnString[GetStringNum], &pTargetString[StartPos], ProcPos - StartPos);
}
StartPos = ProcPos + 1;
GetStringNum++;
}
ProcPos++;
}
/* 文字列最後までを退避 */
/* 退避領域の確保 */
pReturnString[GetStringNum] = (char *)malloc(strlen(&pTargetString[StartPos]) + 1);
/* 確保領域の初期化 */
memset((void *)pReturnString[GetStringNum], '\0', (strlen(&pTargetString[StartPos]) + 1));
/* 退避 */
memcpy( (void *)pReturnString[GetStringNum], &pTargetString[StartPos], strlen(&pTargetString[StartPos]));

return GOOD;
}

補足日時:2008/12/20 13:41
    • good
    • 0

「AnalyzeProc を呼び出すときに &w_IN_Rec と & を付けたのはなぜだろう」とか「本当に addSpeace

を定義してたっけ」と自問するといいかもしれない.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています