ページ 11

無題

Posted: 2007年1月30日(火) 14:06
by 大工
お久しぶりです。


ダイクストラ法の時は大変お世話になりました.


今回は関数へのポインタです.

#include <stdio.h>
#include <string.h>

int main(void)
{
char *(*p_strcpy)(char *, char *);
char s1[10];
char s2[/url] = "copy";

p_strcpy = strcpy;
p_strcpy(s1, s2);

printf("%s\n", s1);

return 0;
}

test.c: In function `main':
test.c:10: warning: assignment from incompatible pointer type


と表示されこのプログラムは教科書通りに書いているのですが・・・・どう対処していいかワカリマセン・・


ご協力お願いします.

あと、自作関数を使って関数へのポインタは理解できたんですが
char *(*func) (void); と言ったchar型へのポインタを返す関数へのポインタといったポインタのポインタ(表現は不適切かも知れませんが)ではどういったことが行われているのでしょうか?(どういった働きをするのか)

Re:無題

Posted: 2007年1月30日(火) 14:20
by box
> 	char *(*p_strcpy)(char *, char *);

第2引数をconst char *にすればよいと思います。


お願いが2つあります。
1)新規投稿の際、内容に即した適切なタイトルを付けてください。
例:「関数へのポインタについて」

2)ソースコードを貼り付ける際、
<pre>
ソース本体
</pre>
のように前後をタグ(不等号は半角)ではさんでください。

Re:無題

Posted: 2007年1月30日(火) 15:10
by keichan
>test.c:10: warning: assignment from incompatible pointer type
コンパチでない(暗黙に変換できない)ポインタの型に変換しようとして怒られています。

対処法はboxさんが仰られている方法で解決するはずです。

>char *(*func) (void); と言ったchar型へのポインタを返す関数へのポインタといったポインタのポインタ(表現は不適切かも知れませんが)ではどういったことが行われているのでしょうか?(どういった働きをするのか)
これは
char *(*p_strcpy)(char *, char *);
と同じです。(引数が違うだけ)

「char* 型の戻り値を持ち、引数がchar* 型2つを取る『関数ポインタ型』変数p_strcpy」→ char* (*p_strcpy)(char*, char*)
「char* 型の戻り値を持ち、引数を取らない『関数ポインタ型』変数func」→ char* (*func)(void)
上記違いがわかりますか?
また、戻り値・引数の個数・タイプ共に同じものでなければ関数ポインタ型変数に格納することはできません。
ですので本件の warning が発生しているわけです。

Re:無題

Posted: 2007年1月30日(火) 15:19
by 大工
分かりました!!!!


ご協力ありがとうございます

Re:無題

Posted: 2007年1月30日(火) 15:25
by box
> なぜconstなんでしょう?

strcpyの第2引数はコピー元の文字列を指しています。
「strcpyのロジックではコピー元の文字列の内容を変更していませんよ」
という意味をこめてconstが付いています。