홈>
안녕하세요 여러분 코드에 약간의 문제가 있습니다
이 프로그램은 계산해야합니다 ((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;
}
- 답변 # 1
- 답변 # 2
void 포인터에 대한 산술이 허용되지 않으므로 void *를 대상 유형으로 변환해야합니다 (예 : int *
).void *를 int *로 변환 한 후 Addition ()은 다음과 같이 보입니다. 모든 함수를 동일하게 변경하여 작동해야합니다.
int* args = static_cast<int*>(arg);
- 답변 # 3
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*
로 다시 캐스팅해야합니다. .예를 들어
int*
- 답변 # 4
void *Division(void *arg_div) { int* args = static_cast<int*>(arg_div); int result = args[0]/args[1]; ...
다음은 문제에 대한 수정입니다. void *를 int *로 변환 한 다음 int 배열의 값을 사용해야합니다.
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]; .. }
관련 자료
- flutter - '일부 모델'유형은 '동일 모델'유형의 하위 유형이 아니지만
- notifications - 서명 할 수없는 유형 (TypeScript 412)
- c# - ASPX가 유형을로드 할 수 없습니다
- 사이트의 HTML 코드에 대한 페이지를 찾을 수 없습니다
- c++ - 열거 형 - 유형 이름은 허용되지 않습니다
- debian - type -p java는 initd 스크립트에서 작동하지 않습니다
- Arduino Ide 1813에서 아무것도 입력 할 수없는 이유는 무엇입니까?
- django-simple-history에서 유형 오류가 발생합니다
- gcc - statst_size 유형이 unsigned int가 아닌 이유는 무엇입니까?
- c++ - 배열 유형 int []는 할당 할 수 없습니다
- kotlin - 변수 이름에 데이터 유형을 포함하지 않음
관련 질문
- c++ : 단일 프로그램에서 특정 수의 고아 및 좀비 프로세스를 실행하는 방법은 무엇입니까?
- java : 자바에서 c++로 작성된 멀티 스레딩 프로그램을 기다리십시오.
- Linux 운영 체제가 있습니까?
- c++ : 내 LLDB가 'A'패킷을 반환하여 오류 -1을 반환했습니다.
- c++ : std :: promise :: set_value 충돌에서 충돌
- c++ : Coredump 파일 공유 라이브러리에 행 번호를 가져옵니다
- c++ : Linux 명령 마지막으로 파일에 대한 변경 사항을 보거나 나열 할 수 있습니다.
- c++ : 목표를 '설치'라는 규칙이 없음 [CMAKE]
- c++ : 실제 및 시뮬레이션 된 노드 모두와 NS-3 시뮬레이션
- c++ : 예외 실행 부스트 ASIO SSL 예제
포인터 유형 (C 스타일 ...)을
void*
로 변경 한 이유 ? (올바른 길을 걸을 수 있도록 질문을하세요.)그냥
int*
를 얻을 다시, 그들은 당신이 역 참조 할 수있는 포인터입니다. 와이즈 비즈 포인터이지만void*
를 얻을 수 없습니다 객체에 대한 작업이 적습니다.