Ошибка: void * не является указателем на тип объекта - PullRequest
0 голосов
/ 03 декабря 2018

Привет, ребята. У меня небольшая проблема с кодом

Предполагается, что эта программа рассчитывает ((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;
}

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

арифметика с указателем на 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];
 }
0 голосов
/ 03 декабря 2018
    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.

0 голосов
/ 03 декабря 2018

Вы не можете разыменовать a void* - вам нужно привести параметры потоковых функций обратно к int*.

Например,

void *Division(void *arg_div)
{
    int* args = static_cast<int*>(arg_div);
    int result = args[0]/args[1];
...
0 голосов
/ 03 декабря 2018

Почему вы изменили тип указателя (стиль C ...) на void*?(хитрый вопрос, чтобы заставить вас идти по правильному пути).

Просто верните int*, это указатели, которые вы можете разыменовать.void* являются указателями, но вы не можете получить объект void и тем более выполнять над ним операции.

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