お久しぶりです。
ダイクストラ法の時は大変お世話になりました.
今回は関数へのポインタです.
#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:無題
>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 が発生しているわけです。
コンパチでない(暗黙に変換できない)ポインタの型に変換しようとして怒られています。
対処法は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 が発生しているわけです。