получить столбец массива в C99? - PullRequest
2 голосов
/ 14 июля 2020

В C, если у меня есть:

int grades[100][200];

и я хочу передать первую строку, я напишу: grades[0], но что, если я хочу передать первый столбец? написание этого не поможет grades[][0]

Ответы [ 3 ]

4 голосов
/ 14 июля 2020

Вы не можете передавать столбцы в C. Вы передаете указатели на начало некоторых непрерывных данных.

Строки в C непрерывно записываются в память, поэтому вы передаете указатель на первый элемент некоторой строки (вы делаете это неявно, используя его имя: matrix[row]; явная версия будет &matrix[row][0]), и вы можете использовать строку, перебирая непрерывную память.

Чтобы использовать столбцы, вам необходимо передать весь массив (указатель на первый элемент в 2D-массиве, на самом деле), а также передать длину строк, а затем функция должна перейти на эту длину, чтобы перейти от элемента того же столбца к следующему. Это одно из многих возможных решений, вы можете разработать любое другое решение, например, скопировав столбец во временный массив, как указано в каком-то комментарии; но он обычно используется, например, в функциях cblas .

3 голосов
/ 14 июля 2020

Если это помогает визуализировать , двумерный массив представляет собой массив массивов, он не формулируется как матрица . Таким образом, мы можем передать подмассив (то есть строку), но нет прямого способа передать столбец .

Один из способов добиться этого - увеличить на l oop во внешнем массиве выберите элемент в фиксированном месте (имитируя «столбец») и используйте значения для создания отдельного массива или перейдите к функции, которая должна обрабатывать данные.

0 голосов
/ 14 июля 2020

Матрицы не существуют в C (проверьте, прочитав стандарт C11 n1570 ). Только массивы, а в вашем примере это массив массивов int. Так что столбцов тоже не существует.

Хороший подход - просмотреть матрицу, например, абстрактный тип данных (с использованием гибких элементов массива ....) См. этот ответ для подробностей.

Рассмотрите также возможность использования (и, возможно, заглядывания внутрь исходного кода) библиотеки GNU scientifi c GSL и других библиотек, таких как OpenCV , см. Список здесь .

В некоторых случаях, арифметика произвольной точности c gmplib ) может понадобиться.

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