【发布时间】:2018-10-25 23:37:45
【问题描述】:
我是一名 C 练习程序的初学者,该程序可以计算从命令行读取的数字列表的各种统计值。但是当尝试在 Linux 中编译我的代码时,我遇到了一些我不确定如何解释的错误,我想知道是否可以从比我更熟悉 C 语言的人那里获得一些帮助。我已经包含了我的代码和下面的错误。
我的代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int *values;
int size;
double avg=0.0;
int minValue=0;
int maxValue=0;
void *runAvg(void *param);
void *runMin(void *param);
void *runMax(void *param);
int main (int argc, char *argv[]){
if(argc != 2){
fprintf(stderr, "usage: %s <integer value>\n", argv[0]);
}
int i;
for(i=1; i < argc; i++){
values=&(atoi(argv[i]));
size++;
}
pthread_t avgPt[size];
pthread_t minPt[size];
pthread_t maxPt[size];
pthread_attr_t attr;
//create threads
pthread_create(&avgPt, &attr, runAvg, values);
pthread_create(&minPt, &attr, runMin, values);
pthread_create(&maxPt, &attr, runMax, values);
//wait for threads to exit
pthread_join(avgPt, NULL);
pthread_join(minPt, NULL);
pthread_join(maxPt, NULL);
//print results of threads
printf("\n Average: %f \n",avg);
printf("\n Minimum: %d \n",minValue);
printf("\n Maximum: %d \n",maxValue);
}
void *runAvg(void *param){
int sum=0;
int i=0;
int *values;
values=(int*)param;
for(i=0;i<size; i++) sum += values[i];
avg = sum / (double)size;
pthread_exit(0);
}
void *runMin(void *param){
int i=0;
int *values;
values=(int*)param;
minValue = values[0];
for(i=0;i<size;i++){
if(values[i]<minValue){
minValue=values[i];
}
}
pthread_exit(0);
}
void *runMax(void *param){
int i=0;
int *values;
values=(int*)param;
maxValue=values[0];
for(i=0;i<size;i++){
if(values[i] > maxValue){
maxValue = values[i];
}
}
pthread_exit(0);
}
我的编译错误:
423assign.c:20: error: lvalue required as unary ‘&’ operand
423assign.c:30: warning: passing argument 1 of ‘pthread_create’ from
incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘pthread_t * __restrict__’
but argument is of type ‘pthread_t (*)[(unsigned int)(size)]’
423assign.c:31: warning: passing argument 1 of ‘pthread_create’ from
incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘pthread_t * __restrict__’
but argument is of type ‘pthread_t (*)[(unsigned int)(size)]’
423assign.c:32: warning: passing argument 1 of ‘pthread_create’ from
incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘pthread_t * __restrict__’
but argument is of type ‘pthread_t (*)[(unsigned int)(size)]’
423assign.c:34: warning: passing argument 1 of ‘pthread_join’ makes
integer from pointer without a cast
/usr/include/pthread.h:244: note: expected ‘pthread_t’ but argument is
of type ‘pthread_t *’
423assign.c:35: warning: passing argument 1 of ‘pthread_join’ makes
integer from pointer without a cast
/usr/include/pthread.h:244: note: expected ‘pthread_t’ but argument is
of type ‘pthread_t *’
423assign.c:36: warning: passing argument 1 of ‘pthread_join’ makes
integer from pointer without a cast
/usr/include/pthread.h:244: note: expected ‘pthread_t’ but argument is
of type ‘pthread_t *’
【问题讨论】:
-
嗯..
values=&(atoi(argv[i]));的问题应该很明显。atoi返回一个int立即值,而不是可寻址的值;因此,地址运算符会呕吐。
标签: c multithreading