【问题标题】:Error error: ‘void*’ is not a pointer-to-object type错误错误:‘void*’不是指向对象的指针类型
【发布时间】:2019-05-04 12:32:23
【问题描述】:

大家好,我在代码中遇到了一个小问题

这个程序应该计算 ( (a+b) x (c+d) ) / e

创建三个线程,一个用于 仅加法 仅乘法 分工

main() 中只能创建一个线程 在除法线程中显示结果。 int 值(a, b, c, d, e) 应该从 main 中的用户那里获取并传递给 main 中创建的线程。每一步的其他结果应该在下一步传递。

这是我为上述场景编写的程序

#include <iostream>
#include <pthread.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void *Division(void *arg_div)
{
    int result = arg_div[0]/arg_div[1];
    cout << result ;
    pthread_exit(NULL);
}

void *Multiplication(void *arg_mul)
{
    int arg1[2];
    arg1[0]=arg_mul[0]*arg_mul[1];
    arg1[1]=arg_mul[2];
    pthread_t div;
    pthread_create(&div,NULL,Division,(void*)arg1);
    pthread_join(div,NULL);
    pthread_exit(NULL);
}

void *Addition(void *arg_add)
{
    int arg[3];
    arg[0]=arg_add[0]+arg_add[1];
    arg[1]=arg_add[2]+arg_add[3];
    arg[2]=arg_add[4];
    pthread_t ad;
    pthread_create(&ad,NULL,Multiplication,(void*)arg);
    pthread_join(ad,NULL);
    pthread_exit(NULL);
}

int main()
{
    int values[5];
    for(int i=0;i<5;i++)
    {
        cin >> values[i];
    }
    pthread_t pa;
    pthread_create(&pa,NULL,Addition,(void*)values);
    pthread_join(pa,NULL);
    return 0;
}

【问题讨论】:

标签: c++ linux operating-system pthreads


【解决方案1】:

为什么将指针类型(C 风格...)更改为void*? (让你走在正确的道路上的技巧问题)。

只需返回 int*,它们是您可以取消引用的指针。 void* 是指针,但是你不能得到 void 对象,更不用说对它做操作了。

int* args = static_cast<int*>(arg);

【讨论】:

    【解决方案2】:

    不允许对 void 指针进行算术运算,您需要在此处将 void * 转换为目标类型,即 int*

    在将 void* 转换为 int* 后,您的 Addition() 如下所示,您必须对所有函数进行相同的更改才能使其正常工作。

    void *Addition(void *arg_add)
     {
       int *input = (int *)arg_add;
       int arg[3];
       arg[0]=input[0]+input[1];
       arg[1]=input[2]+input[3];
       arg[2]=input[4];
     }
    

    【讨论】:

    • 使用 C++ 类型转换,而不是 C 风格。
    【解决方案3】:

    您不能取消引用 void* - 您需要将线程函数的参数转换回 int*

    例如,

    void *Division(void *arg_div)
    {
        int* args = static_cast<int*>(arg_div);
        int result = args[0]/args[1];
    ...
    

    【讨论】:

    • 使用 C++ 类型转换,而不是 C 风格。
    【解决方案4】:
        void * Division(void * arg_div) {
            int * arg_div_int = (int * ) arg_div;
            int result = arg_div_int[0] / arg_div_int[1];
            ...
        }
    
        void * Multiplication(void * arg_mul) {
    
            int * arg_mul_int = (int * ) arg_mul;
            int arg1[2];
            arg1[0] = arg_mul_int[0] * arg_mul_int[1];
            arg1[1] = arg_mul_int[2];
            ...
        }
    
        void * Addition(void * arg_add) {
    
            int * arg_add_int = (int * ) arg_add;
            int arg[3];
            arg[0] = arg_add_int[0] + arg_add_int[1];
            arg[1] = arg_add_int[2] + arg_add_int[3];
            arg[2] = arg_add_int[4];
            ..
        }
    

    这是解决您的问题的方法。您必须将 void* 转换为 int*,然后使用 int 数组中的值。

    【讨论】:

    • 使用 C++ 类型转换,而不是 C 风格。
    猜你喜欢
    • 2012-11-24
    • 2011-12-18
    • 2017-04-22
    • 1970-01-01
    • 2013-10-24
    • 2011-12-18
    • 2020-08-30
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多