2010-07-30 6 views
2

Hiya essayant d'écrire un code pour l'intégration 1D Monte-Carlo de base. Pour ce faire, j'ai besoin d'une liste de nombres pseudo-aléatoires que je peux ensuite saisir dans une fonction (stockée dans un autre sous-programme). J'ai donné un pointeur à la liste des nombres aléatoires mais quand j'essaie de le déréférencer dans le fichier principal, j'obtiens "error: types incompatibles lors de l'assignation au type 'double [11]' du type 'double'". Quelqu'un pourrait-il me dire où je vais mal? Mon code peut être trouvé ici:Obtention d'un sous-programme pour renvoyer un pointeur référençant un tableau puis le déréférencé dans main (en C)

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#ifndef RAND_MAX 
#define RAND_MAX 2147483648 
#endif 
#define N 10 

double function(double x); 
double* rdm(void); 

void main(void) 
{ 
    double* Random_number_list; 
    int i; 
    double sum = 0.0, sum2 = 0.0, X[N+1],S, Random_number_list2[N + 1]; 
    double F[N+1], lower, upper, avg, avg2; 
    printf("Lower Bound: "); 
    scanf("%lf", &lower); 
    printf("Upper Bound: "); 
    scanf("%lf", &upper); 

    Random_number_list2 = *Random_number_list; 

    for (i = 0; i <= N; i++) { 
     X[i] = ((upper - lower)*Random_number_list2[i]) + lower; 
     F[i] = function(X[i]); 
     sum = sum + F[i]; 
     sum2 = sum2 + (F[i] * F[i]); 
    } 
    avg = sum/N; 
    avg2 = sum2/N; 
    S = (upper - lower) * (avg + sqrt((avg2 - (avg * avg))/N)); 
    printf("The Monte Carlo approximation is %lf\n", S); 
} 

double function(double x) 
{ 
    double y; 
    y = sin (x); 
    return y; 
} 

double* rdm(void) 
{ 
    double* Random_number_list = calloc(N + 1, sizeof(double)); 
    int i; 

    srand(time(NULL)); 
    for (i = 1; i <= N; i++) { 
     Random_number_list[i] = (float) rand()/(float) RAND_MAX; 
    } 
    return Random_number_list; 
} 

Merci beaucoup. Jack Medley

+0

Jack, il est une bonne idée de mettre votre code ici et supposons que tous les autres sites sur Internet disparaîtra. De cette façon, lorsque pastebin disparaît ou commence à essayer de monétiser son site, SO sera toujours utile. C'est pourquoi, même si je fais référence à Wikipedia (par exemple) dans mes réponses, je vais quand même faire un bref résumé. J'ai déplacé votre code à travers. – paxdiablo

Répondre

4

Vu:

int * a; 
int b[5]; 

alors vous pouvez écrire:

a = b; // copying a pointer, same as a = &b[0]; 

Cependant, vous ne pouvez pas écrire:

b = a; // b's memory is allocated, you cannot swap it out. 

Ce qui signifie, perdre Random_number_list2, et travailler avec juste Random_number_list.

Vous voulez:

double* Random_number_list = rdm(); 

et plus tard

// added space, so it's clearer you're multiplying and not dereferencing. 
X[i] = ((upper - lower) * Random_number_list[i]) + lower; 
+0

Désolé juste pour clarifier je veux: double * Random_number_list = rdm(); lorsque je déclare dans main()? – JMzance

+0

Ah je l'ai eu merci – JMzance

Questions connexes