• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(続)エラー「invalid conversion from `void (*)()' to `void (*)(int)'」)

エラーメッセージ「invalid conversion from `void (*)()' to `void (*)(int)'」の解決方法

このQ&Aのポイント
  • die の宣言を void die(int sig); にしたのであれば、session_loop の中で die を呼出すときにも引数は必要です。
  • また、最後の die の定義のところでも引数を取るようにしています。
  • しかし、die 関数を呼び出す際に引数を指定しているにも関わらず、エラーメッセージ「void の値が本来の意味通りに無視されませんでした」が表示されています。なぜこのエラーが発生しているのか、何か勘違いしている可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#include <stdio.h> #include <stdlib.h> #include <signal.h> static void die(int n); void main(void){ int c; signal(SIGINT,die); while('E'!=(c=getchar())); printf("main end\n"); exit(EXIT_SUCCESS); } static void die(int n){ printf("I called by signal(%d)\n",n); exit(EXIT_FAILURE); } サンプルを作ってみました。 上記のサンプルがコンパイル出来て、期待したように動きますでしょうか? #3の補足のプログラムは、 補足で、納得されている事柄からすると ほとんどバカげたプログラムに思えます。 server.c: function 内の`void session_loop()': server.c:106: error: too few arguments to function `void die(int)' って void sessioon_loop(){ static void die(int); } なんてしているってことじゃないですよね?

YYoshikawa
質問者

お礼

お手数おかけしています。 $ gcc -o sever server.c -lcurses として上手くいきました。 些細な事でした。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>つまり、dieに引数を入れて呼び出すのは、 >システム側ということなので、自分で呼び出すことはありません。 これは、 signal(SIGINT,die(1)); の部分を言っているのであって、 die(1); の部分を言っているのではありません。 signal(SIGINT,die(1)); がエラーになるというのは、 die(1)が呼び出されて返される値がないので signal(SIGINT, void); //<ちょっと変な書き方ですが になるのでおかしいということです。 老婆心まで

YYoshikawa
質問者

補足

ご回答有難うございます。m(_ _)m > signalは > signal(int ,関数へのポインタ) > です。 > だから > signal(SIGINT,die); > ですよね。 はい。そうですね。 > signal関数は、 > void (*signal(int sig, void (*func)(int)))(int); > で、 つまり、 void (*f(int n,void (*g(int m)))(int k); に於いて 関数fは 【『「int型変数n」 と 「int型変数mを引数にとる関数へのポインタ。つまり、g」 を引数にとる返値がvoid*型』 でint型変数kを引数にとる】 関数へのポインタ。 という意味ですよね?(チガイマス?) > sigで指定したシグナルに対するコールバックとして > 関数funcを登録する関数です。 > つまり、 > signal(SIGINT,die); > とした場合 > SIGINTというシグナルが発生した時 > dieという関数を呼び出すのですが、 > その時dieにシグナル番号を渡します。 > これが、dieが受け取る変数です。 つまり、 "シグナル番号を渡す"という事は void (*f(int n,void (*g(int m)))(int k); で nとmは等価という事ですか? static void die(int); //106行目 : (中略) : signal(SIGINT, die); : (中略) : die(); //186行目 : (中略) : static void die(int) とすると $ g++ -o sever server.c server.c: function 内の`void session_loop()': server.c:106: error: too few arguments to function `void die(int)' server.c:186: error: at this point in file となり、 static void (*die)(int); //106行目 : (中略) : signal(SIGINT, die); : (中略) : die(); //186行目 : (中略) : static void (*die)(int) とすると $g++ -o server server.c server.c: function 内の `void session_loop()': server.c:186: 関数への引数が少なすぎます server.c: At global scope: server.c:254: 文法エラー が `{' トークンの前にあります server.c:256: ISO C++ forbids declaration of `exit' with no type server.c:256: `int exit' redeclared as different kind of symbol /usr/include/stdlib.h:612: previous declaration of `void exit(int)' server.c:257: 構文解析エラー が `}' トークンの前にあります server.c: function 内の `int main()': server.c:267: `exit' cannot be used as a function となり、 static void (*die)(); //106行目 : (中略) : signal(SIGINT, die); : (中略) : die(); //186行目 : (中略) : static void (*die)() とすると $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: invalid conversion from `void (*)()' to `void (*)(int)' server.c: At global scope: server.c:254: 文法エラー が `{' トークンの前にあります server.c:256: ISO C++ forbids declaration of `exit' with no type server.c:256: `int exit' redeclared as different kind of symbol /usr/include/stdlib.h:612: previous declaration of `void exit(int)' server.c:257: 構文解析エラー が `}' トークンの前にあります server.c: function 内の `int main()': server.c:267: `exit' cannot be used as a function となってしまいました。 うーん、何が間違っているんでしょうか??

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

補足 signal関数は、 void (*signal(int sig, void (*func)(int)))(int); で、 sigで指定したシグナルに対するコールバックとして 関数funcを登録する関数です。 つまり、 signal(SIGINT,die); とした場合 SIGINTというシグナルが発生した時 dieという関数を呼び出すのですが、 その時dieにシグナル番号を渡します。 これが、dieが受け取る変数です。 dieの方でもなんというシグナルで呼び出されたのかわかるようになっているわけです。 つまり、dieに引数を入れて呼び出すのは、 システム側ということなので、自分で呼び出すことはありません。

YYoshikawa
質問者

お礼

お手数おかけしています。 $ gcc -o sever server.c -lcurses として上手くいきました。 些細な事でした。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

signalは signal(int ,関数へのポインタ) です。 だから signal(SIGINT,die); ですよね。

YYoshikawa
質問者

お礼

お手数おかけしています。 $ gcc -o sever server.c -lcurses として上手くいきました。 些細な事でした。

関連するQ&A