繁体   English   中英

错误错误:“ void *”不是指向对象的指针类型

[英]Error error: ‘void*’ is not a pointer-to-object type

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

该程序应该计算((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样式...)更改为void* (使您走上正确道路的技巧性问题)。

只要返回int* ,它们就是您可以取消引用的指针。 void*是指针,但是您无法获得void对象,甚至无法对其执行任何操作。

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

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

例如,

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

不允许对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];
 }
    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数组中的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM