![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Собственно тема задана раньше, но неявно. Захотелось вывести это в отдельный топик.
Есть функция void f(int **) {return;} Как в эту функцию передать двумерный массив, созданный статически. Вот так не получается void f1() { int i[2][2]; f(i); } Компилятор ругается на приведение типов. -------------------- С уважением. Gray. |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Это сообщение отредактировал(а) Ars - 14.11.2003, 16:41 -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Не понял, совсем плохой стал наверное под конец рабочей недели
![]() В вопросе было: как в функцию у которой параметр - указатель на двумерный массив (размер заранее не известен) - f(int **) передать из другой функции массив, созданный статически и локально внутри этой функции. -------------------- С уважением. Gray. |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Передать-то можно все, что угодно, на крайняк используя явное преобразование типов. Даже можно указатель передать через int. И совсем другое - что потом с этим добром делать в функции. Как функция узнает размерность массива?
Если хочется через функцию, ничего не выйдет. Но можно попробовать через шаблоны -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Передать размер массива проблем нет. А если использовать явное приведение типов
f((int **) MyArray) - то внутри функции при попытке обращения к элементу массива выскакивает Access Violation. -------------------- С уважением. Gray. |
|||
|
||||
Oksiv |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 17.10.2003 Где: Санкт-Петербург, Гражданка Репутация: нет Всего: нет |
Любой двумерный массив можно представить ввиде одномерного так что думай
![]() |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
А мне кажется, что статический массив передать невозможно.
Т.к. при объявлении массива, типа int А[5][5], память выделяется сразу. Т.е. элементы будут идти по-порядку: А[0][0], A[0][1], ....,A[0][4],A[1][0],... При int **А. Элементы идут не по-порядку. Это же указатель на массив указателей. |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
1. Так можно передать динамический массив
2. При передаче статическго массива обязательно указывать вторую размерность void f(int mas[][10]) 3. Если вышеуказанным образом передавать статический массив, то обращатся к его элементам надо не mas[i][j], а через указтели вручную расчитывая номер элемента. -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
Waters |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.11.2003 Репутация: нет Всего: нет |
Позвольте я обобщу все вышесказанное...
wbr. |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Обобщение просто супер
![]() Это и так сразу было понятно. Вопрос то был про статический массив и указатель в функции. Я почему его задал. Например есть у вас метод или функция к исходнику которой нет доступа, но вызывать в программе его можно. В качестве параметров передеётся (int **, int x, int y). Как загнать туда двумерный массив обявленный статически. Из всего вышесказанного можно сделать вывод, что необходимо либо пользоваться динамическим массивом, либо действовать через временный массив. -------------------- С уважением. Gray. |
|||
|
||||
knave |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 6.3.2003 Где: Санкт-Питербург ( Россия) Репутация: 1 Всего: 5 |
Вот это без проблем откомпилировалось
void f(int ar[2][2]) { return; } int main(int argc, char* argv[]) { int i[2][2]; f(i); return 0; } -------------------- С наилучшими пожеланиями !!! |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Ну блин, устал уже
![]() Вопрос - есть функция. В списке аргументов у неё указатель на двумерный массив (int **) и его размеры. Как в такую функцию передеть статический массив? -------------------- С уважением. Gray. |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Никак. Статический массив нельзя привести к int**
|
|||
|
||||
Waters |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.11.2003 Репутация: нет Всего: нет |
int ** это не указатель на двумерный массив (в том виде, в каком это требует стандарт). Это сообщение отредактировал(а) Waters - 18.11.2003, 19:09 |
|||
|
||||
akul |
|
|||
Unregistered |
to gray_k:
Сначала надо понять, что все массивы в С есть линейные последовательности, потом - что int ** есть указатель на указатель на инт. Тогда станет понятно, что для работы этой функции, скорее всего, требуется как сам массив int, так массив указателей на начала его строк, адрес которого и передается. Первое у тебя есть, второго - нет. Значит, надо его сформировать и передать его адрес. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |