#define MAX 1000
int matrix[MAX][MAX];
/*Fill the array with the numbers the user inputs*/
for (i=0; i<tam[0]; i++)
{
for (j=0; j<tam[1]; j++)
{
scanf("%d", &matrix[i][j]);
}
}
Учитывая это определение матрицы, ваши данные 2x2 заканчиваются на matrix[0][0]
, matrix[0][1]
, matrix[1][0]
и matrix[1][1]
.Ничего удивительного там нет, но если рассматривать их как линейный список ячеек, заполненные ячейки:
base_address + 0
base_address + 1
base_address + 1000
base_address + 1001
(где, конечно, base_address = &matrix[0][0]
)
Там нет никакого способа для вашегокод для проверки двух последних ячеек в коде Qsort()
.
Здесь можно сделать несколько выводов.
- Узнайте, как напечатать хорошую диагностику.
- Печать данных при входе в рутину.(Если вы напечатаете массив при вводе в
Qsort()
, вы увидите, что у вас нет значений, с которыми вы должны работать. Это гарантирует, что вы точно знаете, как получить доступ к данным.) - Выберите хорошие тестовые данные.Не повторяйте числа в ваших тестовых данных (например, 11, 12, 13, 14 - лучший набор входных данных).
- Понимание двухмерных массивов и их срезов.
Рассмотрим следующую диаграмму: matrix[4][7]
:
0 1 2 3 4 5 6
+---+---+---+---+---+---+---+
0 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | A | B | C | | | |
+---+---+---+---+---+---+---+
2 | | D | E | F | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
Если вы хотите передать 6-буквенные ячейки функции как субматрицу, вам нужно передать адрес ячейки, содержащей A,вам нужно знать, что есть 3 столбца и 2 строки, и вам также нужно знать, что ширина всей матрицы равна 7. Без этого 7 вы не найдете ячейки D, E, F. Этоконечно, миниатюрная версия массива 1000x1000.
Ваша подматрица - это верхний левый угол всей матрицы, но применяются те же правила: вам нужен начальный адрес, ширина и высота элемента.-матрица и общая ширина всей матрицы для доступа к нужным элементам.
(Между прочим, когда я впервые начал это объяснение, матрица выше была 4x6, а не 4x7. Затем объяснили, что 6 должно бытьпрошло ваs не имеет отношения к продукту 2x3 - размер подматрицы - стал хитрым, поэтому я изменил свой «контрольный пример», чтобы избежать проблемы - именно так, как предложено в разделе «выбрать хорошие тестовые данные».)
Как исправить свой код?
Есть много способов, в зависимости от того, что вы хотите сделать.Трудный путь обходит жизненно важный параметр matrix-width.Более простые способы, вероятно, выделяют одномерный массив ячеек, а затем вычисляют подписки вручную.Тем не менее, я не уверен, что вы хотите, учитывая входные значения 14, 13, 12, 11 (обратный порядок), выходная матрица должна быть ... что?
12 11
14 13
Это означает, что вынужно поменять местами целые строки матрицы.