Получение подпрограммы для возврата трех отдельных массивов случайных чисел в C - PullRequest
0 голосов
/ 02 августа 2010

В настоящее время у меня есть код для подпрограммы, чтобы вернуть указатель на массив. Этот массив представляет собой список случайных чисел для одномерного интеграла Монте-Карло. Сейчас я пытаюсь сделать многомерный эквивалент, который требует 3 массива случайных чисел и вместо отдельной подпрограммы для каждого я пытаюсь создать такую, которая возвращает массив 3 на N + 1. Может кто-нибудь, пожалуйста, помогите мне с кодированием для этого. Друг упомянул, что мне понадобится двойной указатель, но большинство веб-источников до сих пор не помогали. Вот мой единственный код массива:

double* rdm_Y(void)
{
   double* Random_number_list_Y = calloc(N + 1, sizeof(double));
   int i;
   sleep(1);
   srand(time(NULL));
   for (i = 1; i <= N; i++) {
      Random_number_list_Y[i] = (float) rand() / (float) RAND_MAX;
   }
   return Random_number_list_Y;
}

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

Ответы [ 3 ]

1 голос
/ 02 августа 2010

Общий шаблон для динамического выделения двумерного массива типа T (где T может быть int, double и т. Д.) Равен

#include <stdlib.h>

T **alloc(size_t rows, size_t columns)  
{
  T **arr = malloc(sizeof *arr, rows); // type of *arr is T *
  if (arr)
  {
    size_t i;
    for (i = 0; i < rows; i++)
    {    
      arr[i] = malloc(sizeof *arr[i], columns); // type of *arr[i] is T
      if (arr[i])
      {
        size_t j;
        for (j = 0; j < columns; j++)
        {
          arr[i][j] = initial_value_for_this_element;
        }
      }
    }
  }
  return arr;
}
1 голос
/ 05 августа 2010

Я могу придумать три метода:

  1. A *double для одномерного массива размером 3xN (вы можете просто притвориться, что это три массива)
  2. A **double для массива из трех *double с, каждый из которых указывает на массив из N
  3. A struct, содержащий три *double с, каждый из которых указывает на массив из N

Если вам не нравится притворяться для метода 1, вы можете объявить еще два *double s и установить для них возвращаемое значение + N и + 2N соответственно. Также не забудьте free(), что вы должны иметь 1, 4 и 3 free() s для каждого из методов соответственно.

1 голос
/ 02 августа 2010

Попробуйте:

struct res{
 double *arr1, *arr2, *arr3;
};
main(){
 struct res r;
 r.arr1 = rdm_Y();
 r.arr2 = rdm_Y();
 r.arr3 = rdm_Y();
 // in r you have 3 pointers to 3 separate arrays
}

или что-то в этом роде

...