2013-03-23 2 views
0

Этот код указывается для задания. Тем не менее, с летучей мыши есть ошибка в вычислительной функции pi monte carlo. статистика ошибок недействительна для преобразования из int в unsigned int. Я не уверен, что это было предназначено, но я не смог исправить эту проблему. Эта функция является частью примера потоковой передачи, если вам интересно. Любые предложения больше всего оцененыНеверное преобразование int в unsigned int

void *compute_pi(void *s) 
{ 
int seed; 
int ii; 
int *hit_pointer; 
int local_hits; 
double rand_no_x; 
double rand_no_y; 

hit_pointer = (int *) s; 
seed = *hit_pointer; 
local_hits = 0; 

for(ii=0; ii < sample_points_per_thread; ii++) 
{ 
    rand_no_x = (double) (rand_r(&seed))/(double)RAND_MAX;//*error is these lines 
    rand_no_y = (double) (rand_r(&seed))/(double)RAND_MAX;//*error is these lines 
    if(((rand_no_x - 0.5) * (rand_no_x - 0.5) + 
    (rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25)//*error 
local_hits++; 
    seed *= ii; 
} 

*hit_pointer = local_hits; 
pthread_exit(0); 
} 

Я сделал некоторую отладку и теперь вижу, где может быть ошибка. плохой пост теперь является главной функцией, в которой вызывается вычисление pi. Я считаю, что аргументы анализируются в точках выборки и количестве потоков. Когда я запускаю программу, она запрашивает ввод после этого, она терпит неудачу с сбоем сегрегации. Какие-либо предложения?

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

    #define MAX_THREADS 512 

    void *compute_pi(void *); 


    int sample_points; 
    int total_hits; 
    int total_misses; 
    int hits[ MAX_THREADS ]; 
    int sample_points_per_thread; 
    int num_threads; 



    int main(int argc, char *argv[]) 
    { 
    /* local variables */ 
    int ii; 
    int retval; 
    pthread_t p_threads[MAX_THREADS]; 
    pthread_attr_t attr; 
    double computed_pi; 

    /* initialize local variables */ 
    retval = 0; 


    pthread_attr_init(&attr); 
    pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); 

    printf("Enter number of sample points: "); 
    scanf("%d", &sample_points); 
    printf("Enter number of threads: "); 
    scanf("%d%", &num_threads); 

    /* parse command line arguments into sample points and number of threads */ 
    /* there is no error checking here!!!!! */ 
    sample_points = atoi(argv[1]); 
    num_threads = atoi(argv[2]); 


    total_hits = 0; 
    sample_points_per_thread = sample_points/num_threads; 

    for(ii=0; ii<num_threads; ii++) 
    { 
    hits[ii] = ii; 
    pthread_create(&p_threads[ ii ], &attr, compute_pi, (void *) &hits[ii]); 
    } 

    for(ii=0; ii<num_threads; ii++) 
    { 
    pthread_join(p_threads[ ii ], NULL); 
    total_hits += hits[ ii ]; 
    } 

    computed_pi = 4.0 * (double) total_hits/((double) (sample_points)); 


    printf("Computed PI = %lf\n", computed_pi); 


    /* return to calling environment */ 
    return(retval); 
    } 
+0

Предполагаемый или нет, исходное «исправление», по-видимому, связано с объявлением 'seed' в соответствии с типом придания предоставленного параметра' void * '' hit_pointer'. Этот «матч» переносится. Вы правы, что ['rand_r()'] (http://linux.die.net/man/3/rand_r) действительно специфицирует использование 'unsigned int *' как своего единственного параметра. – WhozCraig

+1

Внимательно прочитайте сообщения об ошибках и не перефразируйте их. Ошибка: ** не ** недопустимое преобразование 'int' в' unsigned'; это нормально. Ошибка является недопустимым преобразованием 'int *' в 'unsigned *', что значительно отличается. –

ответ

1

От rand_r(3) man page:

int 
rand_r(unsigned *ctx); 

Как вы можете видеть, он принимает unsigned указатель - если вы передадите ему int и у вас есть соответствующие предупреждения/ошибки включена в вашем компиляторе (и кажется, вы это делаете), вы получите эту ошибку. Измените тип seed, и вы будете установлены.

+0

И измените тип 'hit_pointer'. О, и 'local_hits'. – scones

+0

Да, это тоже. –

+0

но они должны быть int datatypes правильно? поскольку они имеют дело с целыми числами. hit_pointer присваивается int числом, которое вводится для точек выборки и для семени. – user2125805

Смежные вопросы