c 中的 pthread 预期声明说明符或 '...' 在 '(' 之前
pthread in c unexpected declaration speifiers or '...' before '('
这是我一直在研究的一个程序的片段。基本上,如标题所述,我两次收到相同的错误消息。这是我第一次使用 pthreads,所以如果有人能告诉我我做错了什么,我将不胜感激。
#include <pthread.h>
#include <stdio.h>
void *User_choices();
void *Switch_statement(void *);
void *Server_function(void *);
pthread_t SEND_TO_SERVER_THREAD;
pthread_t PIC_COMMUNICATION_THREAD;
pthread_t USER_INTERFACE_THREAD;
char buf[1024];
void main()
{ // 1
snprintf(buf, 1024, "string");
while(1)
{ // 2
pthread_create(&USER_INTERFACE_THREAD, NULL, User_choices, NULL);
} // 3
} // 4
void *User_choices()
{ // 5
int userinput;
printf("Type 0 to reset sensor, 1 to ping, 2 to receive ADC value, 3 to quit the program: ");
scanf("%i", &userinput);
pthread_create(&PIC_COMMUNICATION_THREAD, NULL, Switch_statement, &userinput);
} // 6
void *Switch_statement((void *)userchoice))
{ // 7
int user = (int)*userchoice;
switch(user)
{ // 8
case 1:
printf("OTHER FUNCTIONS USUALLY GO HERE \n");
break;
case 2: //RETRIEVE ADC CASE
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buffer);
break;
case 3:
exit(0);
case 0: //RESET CASE
printf("ONCE AGAIN, OTHER FUNCTIONS USUALLY GO HERE");
break; //EXIT THE PROGRAM
default:
printf("Your entry is not a valid option! Try again \n");
} // 9
} // 10
void *Server_function((void *)server_buffer))
{ // 11
const char* send_to_server = (char)*server_buffer;
HTTP_GET(send_to_server);
} // 12
错误代码如下:
justpthread.c:31:24: error: expected declaration specifiers or ‘...’ before ‘(’ token
void *Switch_statement((void *)userchoice))
^
justpthread.c:53:23: error: expected declaration specifiers or ‘...’ before ‘(’ token
void *Server_function((void *)server_buffer))
如果我将 void main 更改为 int main,我会得到相同的两个错误代码。如果我去掉括号(void *),无论是 int main 还是 void main,我都会得到以下结果:
justpthread.c: In function ‘Switch_statement’:
justpthread.c:33:18: warning: dereferencing ‘void *’ pointer [enabled by default]
int user = (int)*userchoice;
^
justpthread.c:33:2: error: invalid use of void expression
int user = (int)*userchoice;
^
justpthread.c:41:76: error: ‘buffer’ undeclared (first use in this function)
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buffer);
^
justpthread.c:41:76: note: each undeclared identifier is reported only once for each function it appears in
justpthread.c:44:5: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
exit(0);
^
justpthread.c: In function ‘Server_function’:
justpthread.c:55:37: warning: dereferencing ‘void *’ pointer [enabled by default]
const char* send_to_server = (char)*server_buffer;
^
justpthread.c:55:2: error: invalid use of void expression
const char* send_to_server = (char)*server_buffer;
^
就括号而言,你们让我非常困惑,所以我给所有括号都编号了。我看到的是偶数,它们看起来好像正确地改变了方向。
根据其他建议,我更改了我的代码:
void main()
{
snprintf(buf, 1024, "string");
while(1)
{
pthread_create(&USER_INTERFACE_THREAD, NULL, User_choices, NULL);
}
}
void *User_choices()
{
int userinput;
printf("Type 0 to reset sensor, 1 to ping, 2 to receive ADC value, 3 to quit the program: ");
scanf("%i", &userinput);
pthread_create(&PIC_COMMUNICATION_THREAD, NULL, Switch_statement, &userinput);
}
void *Switch_statement(void *userchoice)
{
int user = *((int*)userchoice);
switch(user)
{
case 1:
printf("OTHER FUNCTIONS USUALLY GO HERE \n");
break;
case 2: //RETRIEVE ADC CASE
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buf);
break;
case 0: //RESET CASE
printf("ONCE AGAIN, OTHER FUNCTIONS USUALLY GO HERE");
break; //EXIT THE PROGRAM
default:
printf("Your entry is not a valid option! Try again \n");
}
}
我将 int user... 更改为
int user = *((int*)userchoice);
按照建议,所以我收到以下错误消息:
justpthread.c: In function ‘Server_function’:
justpthread.c:53:37: warning: dereferencing ‘void *’ pointer [enabled by default]
const char* send_to_server = (char)*server_buffer;
^
justpthread.c:53:2: error: invalid use of void expression
const char* send_to_server = (char)*server_buffer;
看来它消除了之前的一些错误。所以我现在注意到 server_buffer 也有问题所以我尝试将其更改为:
void *Server_function(void *server_buffer)
{
const char* send_to_server = *((char*)server_buffer);
//HTTP_GET(send_to_server);
}
现在我只有一个错误:
justpthread.c: In function ‘Server_function’:
justpthread.c:53:31: warning: initialization makes pointer from integer without a cast [enabled by default]
const char* send_to_server = *((char*)server_buffer);
删除这些行中 void * 周围的(括号)。
试试 void *userchoice
和
int user = *((int*)userchoice);
在施放 void *
之前,你不能对它做任何事情。
对于最后一个警告,您想将 void*
转换为 char*
,但是对于 *((char*)server_buffer
,您正在取消引用指向 server_buffer
的指针并转换 void*
char
而不是 char*
.
正确的方法是:
const char* send_to_server = (char*)server_buffer;
这是我一直在研究的一个程序的片段。基本上,如标题所述,我两次收到相同的错误消息。这是我第一次使用 pthreads,所以如果有人能告诉我我做错了什么,我将不胜感激。
#include <pthread.h>
#include <stdio.h>
void *User_choices();
void *Switch_statement(void *);
void *Server_function(void *);
pthread_t SEND_TO_SERVER_THREAD;
pthread_t PIC_COMMUNICATION_THREAD;
pthread_t USER_INTERFACE_THREAD;
char buf[1024];
void main()
{ // 1
snprintf(buf, 1024, "string");
while(1)
{ // 2
pthread_create(&USER_INTERFACE_THREAD, NULL, User_choices, NULL);
} // 3
} // 4
void *User_choices()
{ // 5
int userinput;
printf("Type 0 to reset sensor, 1 to ping, 2 to receive ADC value, 3 to quit the program: ");
scanf("%i", &userinput);
pthread_create(&PIC_COMMUNICATION_THREAD, NULL, Switch_statement, &userinput);
} // 6
void *Switch_statement((void *)userchoice))
{ // 7
int user = (int)*userchoice;
switch(user)
{ // 8
case 1:
printf("OTHER FUNCTIONS USUALLY GO HERE \n");
break;
case 2: //RETRIEVE ADC CASE
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buffer);
break;
case 3:
exit(0);
case 0: //RESET CASE
printf("ONCE AGAIN, OTHER FUNCTIONS USUALLY GO HERE");
break; //EXIT THE PROGRAM
default:
printf("Your entry is not a valid option! Try again \n");
} // 9
} // 10
void *Server_function((void *)server_buffer))
{ // 11
const char* send_to_server = (char)*server_buffer;
HTTP_GET(send_to_server);
} // 12
错误代码如下:
justpthread.c:31:24: error: expected declaration specifiers or ‘...’ before ‘(’ token
void *Switch_statement((void *)userchoice))
^
justpthread.c:53:23: error: expected declaration specifiers or ‘...’ before ‘(’ token
void *Server_function((void *)server_buffer))
如果我将 void main 更改为 int main,我会得到相同的两个错误代码。如果我去掉括号(void *),无论是 int main 还是 void main,我都会得到以下结果:
justpthread.c: In function ‘Switch_statement’:
justpthread.c:33:18: warning: dereferencing ‘void *’ pointer [enabled by default]
int user = (int)*userchoice;
^
justpthread.c:33:2: error: invalid use of void expression
int user = (int)*userchoice;
^
justpthread.c:41:76: error: ‘buffer’ undeclared (first use in this function)
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buffer);
^
justpthread.c:41:76: note: each undeclared identifier is reported only once for each function it appears in
justpthread.c:44:5: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
exit(0);
^
justpthread.c: In function ‘Server_function’:
justpthread.c:55:37: warning: dereferencing ‘void *’ pointer [enabled by default]
const char* send_to_server = (char)*server_buffer;
^
justpthread.c:55:2: error: invalid use of void expression
const char* send_to_server = (char)*server_buffer;
^
就括号而言,你们让我非常困惑,所以我给所有括号都编号了。我看到的是偶数,它们看起来好像正确地改变了方向。
根据其他建议,我更改了我的代码:
void main()
{
snprintf(buf, 1024, "string");
while(1)
{
pthread_create(&USER_INTERFACE_THREAD, NULL, User_choices, NULL);
}
}
void *User_choices()
{
int userinput;
printf("Type 0 to reset sensor, 1 to ping, 2 to receive ADC value, 3 to quit the program: ");
scanf("%i", &userinput);
pthread_create(&PIC_COMMUNICATION_THREAD, NULL, Switch_statement, &userinput);
}
void *Switch_statement(void *userchoice)
{
int user = *((int*)userchoice);
switch(user)
{
case 1:
printf("OTHER FUNCTIONS USUALLY GO HERE \n");
break;
case 2: //RETRIEVE ADC CASE
pthread_create(&SEND_TO_SERVER_THREAD, NULL, Server_function, (void *)&buf);
break;
case 0: //RESET CASE
printf("ONCE AGAIN, OTHER FUNCTIONS USUALLY GO HERE");
break; //EXIT THE PROGRAM
default:
printf("Your entry is not a valid option! Try again \n");
}
}
我将 int user... 更改为
int user = *((int*)userchoice);
按照建议,所以我收到以下错误消息:
justpthread.c: In function ‘Server_function’:
justpthread.c:53:37: warning: dereferencing ‘void *’ pointer [enabled by default]
const char* send_to_server = (char)*server_buffer;
^
justpthread.c:53:2: error: invalid use of void expression
const char* send_to_server = (char)*server_buffer;
看来它消除了之前的一些错误。所以我现在注意到 server_buffer 也有问题所以我尝试将其更改为:
void *Server_function(void *server_buffer)
{
const char* send_to_server = *((char*)server_buffer);
//HTTP_GET(send_to_server);
}
现在我只有一个错误:
justpthread.c: In function ‘Server_function’:
justpthread.c:53:31: warning: initialization makes pointer from integer without a cast [enabled by default]
const char* send_to_server = *((char*)server_buffer);
删除这些行中 void * 周围的(括号)。
试试 void *userchoice
和
int user = *((int*)userchoice);
在施放 void *
之前,你不能对它做任何事情。
对于最后一个警告,您想将 void*
转换为 char*
,但是对于 *((char*)server_buffer
,您正在取消引用指向 server_buffer
的指针并转换 void*
char
而不是 char*
.
正确的方法是:
const char* send_to_server = (char*)server_buffer;