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

エラー「invalid conversion from `void (*)()' to `void (*)(int)'」

Tacosanの回答

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

die の宣言を void die(int sig); にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為.

YYoshikawa
質問者

お礼

有難うございます。

YYoshikawa
質問者

補足

お手数をお掛けしています。 > die の宣言を > void die(int sig); > にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. > また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為. $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: void の値が本来の意味通りに無視されませんでした となってしまいました。 何か勘違いしてますでしょうか?? #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <curses.h> #include <signal.h> #include <unistd.h> #define BUF_LEN 20 #define MIN_X 1 #define MIN_Y 1 #define MAX_X 60 #define MAX_Y 20 /* 移動キーの割り当て */ #define NORTH 'k' #define SOUTH 'j' #define EAST 'l' #define WEST 'h' #define QUIT 'q' #define PORT (in_port_t)50001 #define HOSTNAME_LENGTH 64 int setup_server(in_port_t port) /* 戻り値 ソケットのディスクリプタ */ /* port 接続先のポート番号 */ { struct sockaddr_in me; /* 自分のソケットのアドレス */ int soc_waiting; /* 接続待ちのソケット */ int soc; /* 通信に使うソケット */ /* 自分のアドレスを sockaddr_in 構造体に設定 */ memset((char *)&me, 0, sizeof(me)); me.sin_family = AF_INET; me.sin_addr.s_addr = htonl(INADDR_ANY); me.sin_port = htons(port); /* IPv4 でストリーム型のソケットの作成 */ if ((soc_waiting = socket(AF_INET,SOCK_STREAM,0)) < 0 ){ perror("socket"); return -1; } /* ソケットに自分のアドレスを設定 */ if (bind(soc_waiting,(struct sockaddr *)&me,sizeof(me)) == -1){ perror("bind"); return -1; } /* ソケットで接続待ちの設定 */ listen(soc_waiting,1); fprintf(stderr,"successfully bound, now waiting.\n"); /* 接続要求があるまでブロック */ soc = accept(soc_waiting, NULL, NULL); /* 接続待ちに使ったソケットを閉じる */ close(soc_waiting); /* 通信に使うソケットのディスクリプタを返す */ return soc; } char * chop_newline(char *str, int len) /* 戻り値 与えられた文字列の先頭アドレス */ /* str 改行文字で終わっているかも知れない文字列 */ /* len 処理の制限 */ { int n = strlen(str); /* 与えられた文字列の長さ */ /* 末尾が改行文字なら削る */ if(n<len &&str[n-1]=='\n'){ str[n-1]='\0'; } /* 先頭番地を返す */ return str; } /* プライベート変数 */ static int session_soc; /* socket */ static fd_set mask; /* fd mask */ static int width; /* width of the mask */ static char my_char, peer_char; /* character */ typedef struct{ int x,y; /* current position */ char look; /* character */ } PLAYER; static PLAYER me, peer; /* 自分と相手の状態を保持する変数 */ static char buf[BUF_LEN]; /* 送受信兼用バッファ */ static WINDOW *win; /* 表示用ウィンドウ */ /* session モジュールにプライベートな関数 */ static void hide(PLAYER *who); static void show(PLAYER *who); static int update(PLAYER *who, int c); static int interpret(PLAYER *who); static void die(int);

関連するQ&A

  • (続)エラー「invalid conversion from `void (*)()' to `void (*)(int)'」

    お手数をお掛けしています。 > die の宣言を > void die(int sig); > にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. > また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為. えーと、下記のように static void die(int); : (中略) : signal(SIGINT, die(1)); : (中略) : /* 端末属性を復旧して終わる */ die(1); } : (中略) : static void die(int) { endwin(); /* 端末属性の復旧 */ exit(0); } としてみたのですが $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: void の値が本来の意味通りに無視されませんでした となってしまいました。 何か勘違いしてますでしょうか??

  • コンパイルエラー invalid operands to binary

    自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。 ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか? char *Base64n(unsigned char *buf, size_t length, size_t *outlen) { const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst         uvwxyz0123456789+/="; unsigned char *p; unsigned char *q; unsigned char a[4]; char *RtnBuf; int j=0; int cnt; RtnBuf = (char *)malloc(length+1); memset(RtnBuf, 0, length+1); p = (unsigned char*)buf; q = (unsigned char*)RtnBuf; cnt = 0; while(*p != 0) { a[0] = a[1] = a[2] = a[3] = 0; a[0] = strchr(b64, p[0]) - b64; a[1] = strchr(b64, p[1]) - b64; a[2] = strchr(b64, p[2]) - b64; a[3] = strchr(b64, p[3]) - b64; q[0] = ((a[0] << 2) | (a[1] >> 4)) & 0xff; cnt++; if (p[2] != '=') { q[1] = ((a[1] << 4) | (a[2] >> 2)) &0xff; cnt++; } if (p[3] != '=') { q[2] = ((a[2] << 6) | a[3]) & 0xff; cnt++; } p += 4; q += 3; } *outlen = cnt; return(RtnBuf); } コンパイルはRed Hatでgccを使ってコンパイルしています。 引数は第1引数がデコード対象の文字列、第2引数がデコード対象文字列長、第3引数がデコード後の文字列長で、戻り値がデコード後の文字列です。

  • signal関数の使い方

    標準関数のsignal()関数についてですが void (*signal(int sig, void (*func)(int)))(int); 関数の形式からしてよくわかりません。 僕のイメージでは関数のポインタというと void (*func)(int,int) という感じですが上の場合 void (*func(int,int))(int) /*引数は仮にint型*/ という形式になってますよね。末尾の(int)は引数のはずですがどこの引数になっているのかよくわかりません。 しかも関数の使用例などをみると signal(SIGINT, func); という形で使っており末尾の(int)がどこにいったのかさっぱりわかりません。 よろしくお願いします。

  • C++(というよりC)で文字を置換

    現在じゃんけんさせるプログラムを作っています。その中で 0→ぐー 1→ちょき 2→パー のように変換してreturnさせる関数を作りたいのです。 現状作ったファイルをコンパイルすると VisualStudioだと エラー 1 error C2440: 'return' : 'char [20]' から 'int' に変換できません。 27 1 じゃんけん・改 2 IntelliSense: 戻り値の型が関数型と一致していません 27 9 じゃんけん・改 g++だと In function 'int Replacement(int)': 19:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "パー"; ^ 22:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ちょき"; ^ 25:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ぐー"; ^ 27:9: error: invalid conversion from 'char*' to 'int' [-fpermissive] return Replaced; ^ 17:7: warning: address of local variable 'Replaced' returned [-Wreturn-local-addr] char Replaced[20] = { 0 }; ^ In function 'int main()': 60:27: error: 'scanf_s' was not declared in this scope scanf_s("%d", &player_c); とエラーやら警告がでます。g++のscanf_sのエラーはscanfにすればいいので気にしないとして、どうすれば目的の関数が作れますか? [ソース抜粋] int Replacement(int ver){ char Replaced[20] = { 0 }; if (ver == 2){ char *Replaced = "パー"; } else if (ver == 1){ char *Replaced = "ちょき"; } else{ char *Replaced = "ぐー"; } return Replaced; /*switch (ver){ case 2: char *Replaced = "パー"; return Replaced; break; case 1: char *Replaced = "ちょき"; break; default: char *Replaced = "ぐー"; break; }*/ } void Which_is_Winner(int player_c,int cpu_c, int Judge_Which_is_Winner){ printf("じゃんけん・・・・・・ポンっ!\n"); printf("あなた:%s\nCPU:%s\nじゃんけん", Replacement(player_c), Replacement(cpu_c));//それぞれの手を表示 if (player_c == Judge_Which_is_Winner){ printf("あなたの勝ちです!\n"); } else { printf("cpuの勝ちです!\n"); } }

  • エラーがとれません 助けてください

    エラーがとれません 助けてください http://cs.fit.edu/~mmahoney/dist/eval4.cpp をコンパイルすると eval4.cpp: In member function ‘bool Attack::read(FILE*)’: eval4.cpp:105: error: ‘strlen’ was not declared in this scope eval4.cpp:114: error: ‘strchr’ was not declared in this scope eval4.cpp: In function ‘int main(int, char**)’: eval4.cpp:132: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:133: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:134: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:183: error: ‘strlen’ was not declared in this scope のようなエラーがでてしまいます。 Ubuntuのg++でコンパイルしています。 なにがまずいのでしょうか?

  • MingwでC++のソースがコンパイルできない。

    質問があるのですがよろしくお願いしします。 プラットフォームは Windows HOME です。 MinGWでC++のhelloworld.cppという名前のプログラム ------ここから----------- #include <iostream> using namespace std; int main(){ cout <<"Hello World!!\n"; return 0; } -------ここまで----------- を、gcc helloworld.cpp とWindowsのコマンドプロンプトから打ってコンパイルしようとしたのですが、 undefined reference to std string::size() const undefined reference to std string::operator[](using int) const undefinrd reference to std::cout undefinrd reference to std::basic_ostream<char, std::char traits<char> >&, char const*) undefinrd reference to std::ios_base::Init::() undefinrd reference to std::ios_base::~Init::() などのエラーが出て、コンパイルできません・・ hello.cという名前のC言語プログラム --------ここから------ #include<stdio.h> int main(void){ printf("Hello GCC World on Windows!!\n"); } ------ここまで------- は、gcc hello.c で正常にコンパイルでき、生成したexeファイルも正常に動きます。 また、eclipse CDT上からc++プログラムをMinGWでコンパイルすることもできるのですが・・ なぜかWindowsのコマンドプロンプトからc++プログラムをコンパイルしようとするとエラーが出てしまいます。(C言語のプログラムでもエラーが出ることが時々あります。) どなたか詳しい方いらっしゃいましたらご教授頂けると幸いです。 よろしくお願いします。

  • c++ファイルのコンパイル

    OSX(10.3)を使用しているのですが、ターミナルを使用してc++ファイルをコンパイルしようとすると以下のように表示されます。 ld: Undefined symbols: std::ios_base::Init::Init() std::ios_base::Init::~Init() ___gxx_personality_v0 c++ファイル自体は #include <iostream> int main(void) { return 0; } なので間違っていないと思うのですが (> <) コンパイルはgcc -o a.exe test.cpp で行いました。 どうすれば良いのでしょうか?分かる方お願いします。

    • ベストアンサー
    • Mac
  • 多桁 計算プログラム

    下のプログラムを (1)上位桁の不要な0を表示しない (2)3つの数を計算できるようにする (3)0が入力されるまでは入力を受け付けて加算を繰り返す プログラムに改造する方法を教えてください。 #include <stdio.h> #define MAXDIGIT 70 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); int main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); add(a,b,c,MAXDIGIT); display(a,b,c,MAXDIGIT); return 0;} void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return;} void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return;} void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++;} return;} void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return;} void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return;} void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return;} void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return;}

  • 継承元の関数はオーバーロードできないのですか?

    #include <stdlib.h> /* 動物クラス */ class CAnimal{ public: int type; void init(int); void prt(void); }; /* 犬クラス */ class CDog : public CAnimal{ public: void init(void); }; /*------------ 動物クラス ------------*/ void CAnimal::init(int t){ type = t; } void CAnimal::prt(void){ printf("%d\n", type); } /*------------ 犬クラス ------------*/ void CDog::init(void){ type = 10; } /*------------ メイン関数 ------------*/ void main(void) { CDog dog; dog.init(1); dog.prt(); } メイン関数の「dog.init(1)」(下から3行目)でコンパイルエラーが出ます。継承元の関数はオーバーロードできないのでしょうか? 参考書にはそんなこと書いてありませんし、検索しても似たような事例が見つかりません。 初歩的なことですみませんが、どなたか教えていただけないでしょうか。

  • C言語計算プログラム

    Cの計算プログラム 下のプログラムを (1)上位桁の不要な0を表示しない (2)3つの数を計算できるようにする (3)0が入力されるまでは入力を受け付けて加算を繰り返す プログラムに改造する方法を教えてください。 #include <stdio.h> #define MAXDIGIT 70 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); int main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); add(a,b,c,MAXDIGIT); display(a,b,c,MAXDIGIT); return 0;} void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return;} void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return;} void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++;} return;} void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return;} void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return;} void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return;} void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return;}