Передача указателя на массив массивов в функцию

0

У меня есть основная функция, которая устанавливает следующие переменные:

double matrix[numVectors][size] = {
    {0.183963, 0.933146, 0.476773, 0.086125, 0.566566, 0.728107, 0.837345, 0.885175, 0.600559, 0.142238},
    {0.086523, 0.025236, 0.252289, 0.089437, 0.382081, 0.420934, 0.038498, 0.626125, 0.468158, 0.247754},
    {0.969345, 0.127753, 0.736213, 0.264992, 0.518971, 0.216767, 0.390992, 0.242241, 0.516135, 0.990155}
};

double result1[size], result2[size];

double *ptr_matrix  = &matrix[0];
double *ptr_result1 = &result1[0];
double *ptr_result2 = &result2[0];

То, что вы пытаетесь сделать, это:

  • Создайте массив с тремя рядами по 10 удвоений
  • Создайте два пустых массива из 10 двухлокальных
  • Создать указатель на матрицу
  • Создание указателей на два пустых массива

Затем я пытаюсь передать все три указателя на другую функцию. Эта другая функция будет перебирать строки матрицы (только строки, она не посещает все пространство матрицы), выполнить вычисление с использованием строки (в виде массива). Конечным результатом являются две пустые массивы, объявленные в начале, и каждая из них становится одной строкой из матрицы.

Вот прототип второй функции:

void smallestSum(double (*mat)[size], int num, double *first, double *second)

Эта функция проходит через каждую комбинацию строк матрицы (0/1, 0/2, 1/2) и проверяет суммы их значений. Два массива, производящие наименьшую сумму, в конечном итоге становятся result1 и result2 сверху.

Поскольку это первый раз, когда я действительно вникаю в область указателя/массива/матрицы, у меня есть несколько вопросов:

  • Я правильно "получаю" указатель на матрицу? Или мне нужно вместо этого получить указатель на первое значение матрицы?
  • В smallestSum() я могу перебирать массив, как обычно (используя for (int я = 0; я < num; i++)?
  • 0
    Используйте vector<vector<double>> чтобы перейти к вашей функции, vector<vector<double>>& v voila!
Теги:
arrays
pointers
matrix

2 ответа

1
Лучший ответ

Вам нужно изменить определение ptr_matrix, поскольку оно не является указателем на один двойной, а на всю строку:

double (*ptr_matrix)[size] = &matrix[0];

Затем вы можете вызвать функцию следующим образом:

smallestSum(ptr_matrix, numVectors, ptr_result1, ptr_result_2);

Внутри smallestSum вы можете выполнять итерацию как по строкам, так и по столбцам.

Обратите внимание, что size должен быть известен во время компиляции.

Если функция не модифицирует матрицу, рассмотрим добавление const к типу его первого аргумента.

  • 0
    Сладко, это сработало. Имеет гораздо больше смысла. Тем не менее, при итерации по матрице, как бы я разыменовал одну из строк, чтобы получить фактическое значение строки? В настоящее время у меня есть (*mat)[0] (для первого ряда), но это дает мне тип double * , тогда как я хочу double[] .
  • 0
    @MaxMackie Вы можете использовать значение double * как если бы оно было double[] . Чтобы получить доступ к ячейке в матрице, вы можете написать mat[i][j] ( i - индекс строки, а j - индекс столбца).
Показать ещё 3 комментария
0

Ответ abacabadabacaba дал в основном правильный, за исключением того, что size не обязательно должен быть известен во время компиляции. Если вы включите size в качестве параметра в функцию, вы можете использовать его как часть типа для других параметров для этой функции:

void smallestSum(int size, double (*mat)[size], int num, double *first, double *second)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню