我试图用C语言编写一个图形界面的聊天。
一方面,我有一个客户为我的聊天,另一方面,我有一个GTK应用程序显示我的聊天。
为了同时运行它们,我将使用pthread(向其他建议打开tho)。
我的问题是,为了让我的客户正常工作,我需要argc和argv据我所见,pthread_create()将一个要执行的函数和一个参数作为参数我从其他主题中看到,我可以使用数据结构来包含它们,但我似乎无法正确地对它们进行转换以下是我所拥有的:

typedef struct {
    int *argc;
    char ** argv;
} args_list;

void * simple_client(void * arg){
    int argc = (int) arg->argc;
    char * argv[] = (char *) arg->argv;
    printf("in thread : %d / %s, %s \n", argc, argv[0], argv[1]);

    return 0;
}

int main(int argc, char * argv[])
{
    printf("int main : %d / %s, %s \n", argc, argv[0], argv[1]);
    args_list * args = malloc(sizeof *args);
    args-> argc = &argc;
    args-> argv = &argv;

    pthread_t thread1;

    if (pthread_create(&thread1, NULL, simple_client, args)) {
        perror("pthread_create");
        return EXIT_FAILURE;
    }
    if (pthread_join(thread1, NULL)) {
        perror("pthread_join");
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

由此,我得到:error:request for member'argc'in something not a structure or union From int argc=(int)arg->argc;and same with argv From char*argv[]=(char*)arg->argv;
是什么导致了这些错误你认为这是用GTK gui实现在线聊天的好方法吗?
提前谢谢

最佳答案

这里的类型有一些问题。
simple_client需要一个void*要将传入值用作arg_list,需要将其强制转换为一个值。

void * simple_client(void * argp){
    arg_list* arg = (arg_list*) argp;

arg_list中不需要额外级别的间接寻址它应该包含与main的参数相同的类型。
    //in main:
    args->argc = argc;
    args->argv = argv;

    //in simple_client:
    int argc =  arg->argc;
    char** argv = arg->argv;

在原始代码中,您将“指向char*的指针的地址”存储在“指向char*的指针”中。

关于c - 将argc和argv传递给c中的线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54876579/

10-13 03:58