Передача неинициализированных 2D-массивов в качестве аргументов в C - PullRequest
0 голосов
/ 12 марта 2012

все. Я пытался и пытался обдумать это, и чувствую, что я почти на месте, но я так запутался, сколько «*» мне нужно! У меня есть функция, которая принимает в качестве входных данных строку каталога, содержащую файл данных, int и указатели на два неинициализированных 2D-массива. Функция читает файл данных, затем выделяет память и заполняет массивы соответственно.

Этот код абсолютно неверен, я знаю, но идея такова:

void main()
{
  double **Array1;
  int **Array2;
  int dimension1;
  char DirWork[100], buff[100];

  f_ReadData(DirWork, dimension1, &Array1, &Array2);

  sprintf(buff,"%lf",Array1[0][0]); // Causes segmentation fault
  printf(buff);
}

и

void f_ReadData(char *DirWork, int dimension1, double ***Array1ptr, int ***Array2ptr)
{
  int ct, ct2;
  double **Array1 = *Array1ptr;
  int **Array2 = *Array2ptr;
  char FullDirArray1[100], FullDirArray2[100];
  FILE *d_Array1, *d_Array2;

  sprintf(FullDirArray1,"%s%s,DirWork,"Array1.dat");
  sprintf(FullDirArray2,"%s%s,DirWork,"Array2.dat");

  d_Array1=fopen(FullDirArray1,"r");
  d_Array2=fopen(FullDirArray2,"r");
  fscanf(d_Array1,"%d", &dimension1);

  Array1 = dmatrix(0,dimension1-1,0,3); // allocates memory to Array1 (dimension1 x 3) elements, using nrutil
  Array2 = imatrix(0,dimension1-1,0,3); // allocates memory to Array2 (dimension1 x 3) elements, using nrutil

  for(ct=0; ct<dimension1; ct++) 
  {
    for(ct2=0; ct2<3; ct2++)
    {
      fscanf(d_Array1, "%lf", &Array1[ct][ct2];
      fscanf(d_Array2, "%d", &Array2[ct][ct2];
    }
  }
  fclose(d_Array1);
  fclose(d_Array2);
}

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

Если бы кто-нибудь мог помочь, я был бы очень благодарен ... Я вижу * звезды! Спасибо!

1 Ответ

0 голосов
/ 12 марта 2012

Тогда число звезд верное.

Вы получаете segfault, потому что вы не копируете указатель на буферы, которые вы выделили. Вы инициализируете только f_ReadData: Array1, но вам нужно присвоить это значение обратно * Array1ptr.

...