работа со структурами и возвращение 2d массивов в C - PullRequest
0 голосов
/ 08 февраля 2012

У меня возникли проблемы с поиском лучшего способа вернуть структуру с массивом или указателем на массив.

вот что я хочу сделать: у меня есть структура

typedef struct {
    double *matrix;
    int cols;
    int rows;
    int nelems;
} ResultMat;

и функция, которая анализирует файл. Мне нужно вызвать эту функцию и вернуть ей структуру

ResultMat read (string file, string tag) {

  ResultMat mat;

  .....
  mat.cols = //some value from the file
  mat.rows = //some value from the file


  double array[rows][cols];
  //now i fill the array

  .......
  mat.matrix = *array;

  return mat;
}

внутри массива заполнен значениями, и я хочу вернуть всю эту структуру с массив / указатель на массив, хранящийся в mat.matrix.

Как это сделать, и есть ли лучший способ? Я довольно новичок в C и более знаком с программированием ОО, поэтому мне сложно найти лучшее решение.

Надеюсь, кто-нибудь может мне помочь! Спасибо

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Я думаю, что double array[rows][cols]; будет проблемой, так как вы создаете массив в стеке локальных функций.Это будет удалено после выхода из функции.Вам также следует помнить, что массивы переменной длины не соответствуют ANSI-C, и вам лучше не использовать их, на мой взгляд.

Вы должны работать с указателями и динамическим распределением памяти.malloc будет ключевым словом здесь.

Надеюсь, это поможет

0 голосов
/ 08 февраля 2012

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

void read (string file, string tag, double *matrix, int *cols, int *rows, int *nelms);

или вы можете сохранить структуру и пойти на что-то вроде этого:

void read (string file, string tag, ResultMat *myStructure);

ИМО, «лучшего способа» не существует, это просто разные варианты, ваш другой вариант, который я часто использовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...