2012-01-27 16 views
0

ファイルから浮動小数点数を読み取って並べ替えようとしています。ソートはパラレルUPCでなければなりません。それは現在のコードです:UPCによる動的配列とソートの割り当て

#include <upc_relaxed.h> 
#include <upc_collective.h> 
#include <stdio.h> 
#include <stdlib.h> 

int lt_int(shared void *x, shared void *y) { 
    int x_val = *(shared int *)x, 
    y_val = *(shared int *)y; 
    return x_val > y_val ? -1 : x_val < y_val ? 1 : 0; 
} 

shared int size=0; 

int main(int argc, char* argv[]) { 


    FILE *f; 
    int i=0; 
    if (MYTHREAD == 0) { 
    f = fopen ("dane.dat", "r"); 
    while (feof(f) == 0) {   
     fscanf (f, "%f\n");     
     ++size;  
    } 
    fclose(f); 
    } 

    upc_barrier; 

    /* allocation goes wrong! */ 
    shared [] float *array = upc_all_alloc(size, sizeof(float)); 
    /* printf("%d\n",sizeof(array)); // it returns 8! */ 

    upc_barrier; 

    if (MYTHREAD == 0) { 
    f = fopen ("dane.dat", "r"); 
    i=0; 
    while (feof(f) == 0) { 
     printf("%d\n", i); 
     /* segmentation fault! */ 
     fscanf (f, "%f\n", &array[i]);  
     printf("%f\n", array[i]);    
     i++;  
    } 
    fclose(f); 
    } 

    upc_barrier; 
    upc_all_sort(array, sizeof(float), size/THREADS, size, lt_int, UPC_IN_ALLSYNC); 
    upc_barrier; 

    if (MYTHREAD == 0) { 
    for (i = 0; i<=atoi(argv[1]) ; ++i) { 
     printf("%f\n", array[atoi(argv[1]) + (size/atoi(argv[1]))]); 
    } 
    } 

    return 0; 
} 

私は間違って何をしているのか分かりません。メモリの割り当てがうまくいかないため、セグメンテーション違反が発生します。手伝って頂けますか?

+0

* 1つ以上のフロートのスペースを割り当てる必要がありますか?代わりに 'sizeof(float)* THREADS'バイトを割り当ててみてください。 – Borealid

+0

私は試しました(私は多くのことを試しました)。 sizeof(array)は8を返します。もう一度seqmentationフォールトがあります。(。 – ciembor

答えて

1

この呼び出しは間違っている:

fscanf (f, "%f\n"); 

また、あなたのオブジェクトarrayfloatへのポインタです。通常はsizeof arrayは、割り当てた配列オブジェクトのサイズではなく、ポインタ型のサイズ(実装では8)を返します。 upc_all_allocの戻り値をチェックして、割り当て中にエラーがないことを確認する必要があります(戻り値== NULL、割り当てが失敗した場合)。

+0

提案に感謝します。私のファイルの浮動小数点数をカウントする方法を探しています...私は8 +数)... – ciembor

関連する問題