Получение подпрограммы для возврата указателя, ссылающегося на массив, и последующего разыменования его в main (в C) - PullRequest
2 голосов
/ 30 июля 2010

Привет, я пытаюсь написать код для базовой интеграции 1D Монте-Карло. Для этого мне нужен список псевдослучайных чисел, которые я затем могу ввести в функцию (сохраненную в другой подпрограмме). Я дал указателю список случайных чисел, но при попытке разыменовать его в main я получаю «error: несовместимые типы при назначении типу« double [11] »из типа« double ». Может кто-нибудь сказать мне, где я иду не так? Мой код можно найти здесь:

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

Большое спасибо. Джек Медли

1 Ответ

4 голосов
/ 30 июля 2010

Учитывая:

 int * a;
 int b[5];

, тогда вы можете написать:

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

Однако вы не можете написать:

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

Что означает, потерять Random_number_list2и работайте с Random_number_list.

. Вы хотите:

 double* Random_number_list = rdm();

и более поздние версии

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