2013-10-18 100 views
0

我有一个作业问题,我目前停留在。问题的参数如下。 1.)它必须接受来自用户的总共5个整数。多个POSIX线程

2.)它必须有三个线程,每个线程执行不同的功能(平均值,最小值和最大值)。

我遇到的问题是在声明全局数组中有5个元素的空数组,然后修改这些元素。每次我最终都会遇到段错误,告诉我我做得不正确。顺便提一句,C语言的着重点不在于C++(我不允许使用它)。如果任何人都可以帮助我理解错误,我将非常感激。另外,如果它是重复的(我看了,我没有看到解决这些问题),请将问题或文章提交给我,谢谢。

代码:

#include <stdio.h> 
#include <pthread.h> 

void *avgWorker(int in[]); 
void *minWorker(int in[]); 
void *maxWorker(int in[]); 

int main(void) 
{ 
    int it, *input; 

    int in[5]; 

    pthread_t tid1,tid2,tid3; 
    pthread_attr_t attr1, attr2,attr3; 

    for (it = 0; it < 5; ++it) 
    { 
     printf("Please enter number %d of 5\n", (it + 1)); 

     input[it] = scanf("%d"); 
    } 

    pthread_attr_init(&attr1); 
    pthread_attr_init(&attr2); 
    pthread_attr_init(&attr3); 

    pthread_create(&tid1, &attr1, avgWorker(in), NULL); 
    pthread_create(&tid2, &attr2, minWorker(in), NULL); 
    pthread_create(&tid3, &attr3, maxWorker(in), NULL); 

    pthread_join(tid1,NULL); 
    pthread_join(tid2,NULL); 
    pthread_join(tid3,NULL); 

    return 0; 
} 

void *avgWorker(int in[]) 
{ 
    int total, avg, it; 

    total = 0; 

    for (it = 0; it < 5; ++it) 
    { 
     total += in[it]; 
    } 

    avg = 0; 

    avg = total/5; 

    printf("\n The average value is: %d. \n", avg); 
} 

void *minWorker(int in[]) 
{ 
    int min, it; 
    min = 99999; 

    for (it = 0; it < 5; ++it) 
    { 
     if (in[it] < min) 
    min = in[it]; 
    } 

    printf("The minimum value is: %d\n", min); 
} 

void *maxWorker(int in[]) 
{ 
    int max, it; 

    max = -99999; 

    for (it = 0; it < 5; ++it) 
    { 
     if (in[it] > max) 
    max = in[it]; 
    } 

    printf("The maximum value is: %d \n", max); 
} 

最后,我用gcc编译的代码,并使用-lpthread标志。再次感谢您提供的任何帮助。

+0

是否编译? (每打开一个警告!) –

+1

你应该总是用'-Wall'运行gcc。如果你想要真正干净的代码,可以添加'-Wextra',并且'-Werror'强制你注意它的警告。见[** GCC警告选项**](http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)我相当肯定你会得到一个错误的'scanf参数数量的警告'。 –

+0

谢谢!我是命令行编译新手,这真的很有帮助。 –

回答

5

这是它应该崩溃:

input[it] = scanf("%d"); 

scanf回报领域的读取数量,而不是数据读取。应将存储数据的变量地址作为参数传递。像这样:

scanf("%d", &input[it]); 

另外input只是一个未初始化的指针。它没有指向任何地方(有意义)。我想你想要in,而不是input。你根本不需要变量input

+0

问题是你正在使用带有错误参数的scanf。阅读scanf文档。 –

+0

很好的捕捉'在'和'输入'问题......! – Floris

3

您的问题是在该行

input[it] = scanf("%d"); 

查找的scanf语法......你需要提供数据存储位置的地址,因此

scanf("%d", input+it); 

应该是一种进步。或者 - 正如@dreamlax所指出的那样,为了获得更多可读代码

scanf("%d", &input[it]); 
+0

尽管等同,但由于某种原因,我发现'&input [it]'更容易阅读。 – dreamlax

+0

@dreamlax - 公平点。我会更新我的答案以包含您的建议。 – Floris