pthread in c unexpected-declaration declaration speifiers或' ...'之前'('

时间:2016-04-13 21:05:58

标签: c pthreads

这是我正在研究的一个程序的片段。基本上,我收到标题所描述的两次相同的错误消息。这是我第一次使用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 *),无论它是主要的还是无效的,我得到以下内容:

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);

2 个答案:

答案 0 :(得分:1)

对于上次警告,您希望将void*投射到char*,但使用*((char*)server_buffer,您将取消引用指向server_buffer并将void*投射到char {1}}而不是char*

正确的方法是:

const char* send_to_server = (char*)server_buffer;

答案 1 :(得分:0)

删除这些行上的void *周围的(括号)。