【问题标题】:POSIX returning and printing array prthread_join()?POSIX 返回并打印数组 prthread_join()?
【发布时间】:2018-08-12 15:41:09
【问题描述】:

我试图找到多个数字的素数分解。如果用户键入 15 80 77,它将为每个输入创建一个线程,并让线程返回一个分解数组,然后将其打印出来。但是我收到两个错误。一个说错误:取消引用'void *'指针[Werror] printf("%d", returnValue[r]);

还有一个说错误:无效使用无效表达式 printf("d", returnValue[r]);

我对指针并不熟悉。任何帮助是极大的赞赏。这也是我的第一个问题,请耐心等待。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct _thread_data_t {
    int tid;
} thread_data_t;

void *runner(void *param);

int main(int argc, char *argv[]) {

    pthread_t thr[argc];
    pthread_attr_t attr;
    int i, rc;
    //int *primeFactor;
    //primeFactor = (int *)malloc(sizeof(int)*argc);
    //thread_data_t thr_data[argc];
    printf("Prime Numbers: ");

    //Get the default attributes
    pthread_attr_init(&attr);
    //creat the thread
    for(i = 0; i < argc; ++i){
        //thr_data[i].tid = i;
        if ((rc = pthread_create(&thr[i],&attr,runner,argv[i]))){
            fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
            return EXIT_FAILURE;
        }
    }

    //Wait for the thread to exit
    for(i = 0; i<argc; ++i){
        void *returnValue;
        int r = 0;
        pthread_join(thr[i], &returnValue);
        for(r = 0; r < sizeof(returnValue); r++){
            printf("%d ", returnValue[r]);
        }
    }
    printf("\nComplete\n");

}

//The Thread will begin control in this function
void *runner(void *param) {
    int *primeFactors;
    int num = atoi(param);
    primeFactors = (int *)malloc(sizeof(int)*num);
    int i, j, isPrime;
    int k = 0;
    for(i=2; i<=num; i++)
    {
        if(num%i==0)
        {
            isPrime=1;
            for(j=2; j<=i/2; j++)
            {
                if(i%j==0)
                {
                    isPrime = 0;
                    break;
                }
            }

            if(isPrime==1)
            {
                primeFactors[k] = i;
                k++;
            }
        }
    }


    //Exit the thread
    //      pthread_exit(0);

    //      pthread_exit((void *)primeFactors);
    pthread_exit(primeFactors);
}

【问题讨论】:

  • 您必须先将 void* 转换为它的实际类型(在本例中为 int*),然后才能取消引用它
  • 很抱歉,我不太了解它的工作原理。介意展示一下它的样子吗?

标签: c pthreads posix pthread-join


【解决方案1】:

您在代码 sn-p 中犯了几个错误。

  1. main 函数中的argc 包含命令行参数的数量,包括脚本名称。因此,您不想将第一个命令行参数解析为整数值。
  2. for(r = 0; r &lt; sizeof(returnValue); r++) 中的sizeof 运算符为您提供returnValue 变量的字节数,在64 位操作系统中该变量应始终为8,因为它是一个指针值。使用其他方法来获取结果数组的大小。
  3. 您收到的警告是由于类型误用。进行显式类型转换以修复它。

【讨论】:

  • 感谢您的反馈,非常感谢。我不确定如何完成第三步。无论如何,您可以再深入一点,因为我没有太多地处理 C。非常感谢。
  • 进行类型转换很容易:将 printf("%d ", returnValue[r]); 替换为 printf("%d ", ((int *)returnValue)[r]);。这会欺骗编译器将returnValue 视为整数指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2021-11-07
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多