Виникає проблема в передачі двовимірного статичного масиву в функцію
Намагався просто передати як int ** array int A [3] [4]; transp (A, 3, 4);
[Error] can not convert 'int (*) [3]' to 'int **'
- Як правильно передати статич масив у функцію. При цьому функція повинна також приймати динамічні масиви. Перевантаження, шаблони і STL не пропонувати.
- Статичні 2D масиви зберігаються в пам'яті лінійно. Динамічні зберігаються теж лінійно чи ні?
- Яку зв'язок має статичний 2D масив з покажчиками?
заданий 6 Листопада '15 о 18:53
Якщо у вас є масив, оголошений як
то нешаблонне функція, приймаюча даний масив як аргумент може виглядати, наприклад, як
і викликатися як
Або її можна оголосити як
Що стосується даної функції
то ви не можете в неї передати масив, оголошений як
Тобто передати можна, використовуючи різні хитрощі, але скоріше за все функція не працюватиме так, як ви припускаєте.
Є такий універсальний підхід. Це інтерпретувати будь-який двовимірний масив, як одновимірний, і передавати значення розмірів кожної розмірності масиву.
Ось демонстраційна програма
Її висновок на консоль
Якщо ж писати програму на C, а не на C ++, то там є масиви змінної довжини, і тому вам було б простіше.
У C ++ для цих цілей краще використовувати стандартний клас std :: vector
Що стосується вашого питання
2) Статичні 2D масиви зберігаються в пам'яті лінійно. Динамічні зберігаються теж лінійно чи ні?
то якщо ви будете розподіляти його в пам'яті як двовимірний масив, то природно його елементи будуть зберігатися лінійно по рядках. наприклад
А що стосується цього питання
3) Яку зв'язок має статичний 2D масив з покажчиками?
то будь-який масив в виразах (за рідкісним винятком) неявно перетвориться в покажчик на свій перший елемент.
У gcc зробити це зовсім просто.
Ви можете передавати у функцію розмірності матриці (досить тільки "нижчих") і звертатися до елементів за індексами естестственним чином. наприклад:
Ось приклад файлу, в якому представлені обидві версії програми і результати його запуску:
Якщо питання ще залишилися, задавайте.
Ось варіант з покажчиками на рядки "щільною" матриці.
Беремо статичну матрицю, робимо для неї масив покажчиків, передаємо його в функцію транспонування, яка робить в динамічної пам'яті "щільну" транспоновану матрицю і повертає новий масив покажчиків на її рядки.
Ну, пам'ять перед виходом Ви вже самі звільніть?