2014-06-17 44 views
0

我有这个巨大的头文件average.h其中包含4个数组。我想通过使用线程分别计算4个数组的平均值来计算头文件的平均值。 运行时出现分段错误,所以我猜如何计算数组的长度有问题。我被告知,计算float**的大小是不可能的,那么我应该怎么做呢?计算数组的大小来计算使用线程的平均值

这里是我的代码:

/* 
* File: main.c 
* Author: thomasvanhelden 
* 
* Created on June 15, 2014, 5:34 AM 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include "average.h" 

void* calc(void* param) { 
    float** array = (float**) param; 
    int size = sizeof(*array)/sizeof(float*); 
    int i; 
    float sum = 0; 
    float* average; 

    for (i = 0; i < size; i++) { 
     sum += *array[i]; 
    } 

    *average = sum/size; 

    return average; 
} 

/* 
* 
*/ 
int main(int argc, char** argv) { 

    pthread_t t1, t2, t3, t4; // thread handlers 
    int res1, res2, res3, res4; // results of creating/joining the threads 
    void *avg1, *avg2, *avg3, *avg4; // results of the threads as void* 
    float *result1, *result2, *result3, *result4; // results of the threads as flaot* 

    // create the threads 
    res1 = pthread_create(&t1, NULL, calc, a1); 
    res2 = pthread_create(&t2, NULL, calc, a2); 
    res3 = pthread_create(&t3, NULL, calc, a3); 
    res4 = pthread_create(&t4, NULL, calc, a4); 

    // check for errors creating the threads 
    if (res1 || res2 || res3 || res4) { 
     printf("Something went wrong creating the threads!\n"); 
     return 1; 
    } 

    // wait for the threads to finish and get the result 
    res1 = pthread_join(t1, &avg1); 
    res2 = pthread_join(t2, &avg2); 
    res3 = pthread_join(t3, &avg3); 
    res4 = pthread_join(t4, &avg4); 

    // check for errors joining the threads 
    if (res1 || res2 || res3 || res4) { 
     printf("Something went wrong joining the threads!\n"); 
     return 1; 
    } 

    // void* to float* 
    result1 = (float*) avg1; 
    result2 = (float*) avg2; 
    result3 = (float*) avg3; 
    result4 = (float*) avg4; 

    // print the result, should be 
    printf("The average is: %f", (*result1 + *result2 + *result3 + *result4)); 


    return (EXIT_SUCCESS); 
} 
+0

显示数组的声明。 – user694733

+0

这工作?我相信下面的语句会给你1总是在32位平台上指针的大小总是4个字节:int size = sizeof(* array)/ sizeof(float *); –

回答

2

正如你所说的,它不可能从一个指针检索您的数组的大小。你必须将你的参数打包在一个结构体中(你的float**,加上你的数组的大小,以及任何其他相关信息),然后把一个指向这个结构体的指针传递给pthread_create()

请注意,您的工作函数必须返回一个指针,因此需要分配内存。如果你想避免动态分配,这里有一个模式可以重用参数struct作为返回值:

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

#define ARRAY_COUNT(arr) (sizeof (arr)/sizeof *(arr)) 

typedef union { 
    struct { // Function parameters 
     float *array; 
     size_t size; 
    }; 
    struct { // Function return value 
     float result; 
    }; 
} arrayAverageParam_u; 

void *arrayAverage(void *param) { 
    arrayAverageParam_u *_param = param; 
    // From now on we can use _param to access the struct 

    int i; 
    float avg = 0.0f; 
    for(i = 0; i < _param->size; ++i) 
     avg += _param->array[i]; 

    if(i) 
     avg /= i; 

    // Store the result, overwriting the parameters 
    _param->result = avg; 

    return NULL; 
} 

main() 
{ 
    float array[] = {1.0f, 2.0f, 3.0f, 4.0f}; 

    // Fill the struct with parameters 
    arrayAverageParam_u param = { 
     .array = array, 
     .size = ARRAY_COUNT(array), 
    }; 

    pthread_t thread; 
    pthread_create(&thread, NULL, arrayAverage, &param); 

    pthread_join(thread, NULL); 

    // Retrieve the result from the struct 
    printf("The average is %g\n", param.result); 

    return 0; 
} 
+0

这是一个好主意!我正在考虑将数组的大小硬编码到for循环中,但你的听起来好多了。谢谢! –

+0

不要忘记接受这个答案,如果它适合问题:) – Quentin

+0

对不起,我现在做了。以为我不得不等待几个小时才能够接受答案...:/ –