2012-01-27 3 views
0

J'essaie de lire les fichiers flottants d'un fichier puis de les trier. Le tri doit être un CUP parallèle. C'est le code actuel:CUP allouer tableau dynamique et tri

#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; 
} 

Et je ne sais pas ce que je fais mal. J'obtiens un défaut de segmentation, car l'allocation de la mémoire se passe mal. Pouvez-vous m'aider?

+0

Vous avez besoin d'allouer plus de * un * espace de flotteur, n'est-ce pas? Pourquoi n'essayez-vous pas d'allouer 'sizeof (float) * THREADS' octets à la place. – Borealid

+0

J'ai essayé (j'ai essayé beaucoup de choses). sizeof (tableau) renvoie à nouveau 8, et il y a encore défaut de seqmentation :(. – ciembor

Répondre

1

Cet appel est erroné:

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

également votre objet array est un pointeur vers float. Il est normal que sizeof array renvoie la taille du type de pointeur (8 dans votre implémentation) et non la taille de l'objet tableau que vous avez attribué. Vous devez vérifier la valeur de retour de upc_all_alloc pour vérifier qu'il n'y avait pas d'erreur lors de l'allocation (si la valeur de retour == NULL, l'allocation a échoué).

+0

Merci pour les suggestions, maintenant je cherche moyen de compter le nombre de flottants dans mon fichier ... J'ai trouvé que je reçois 8 + (10 lignes * nombre)... – ciembor