![]() |
Модераторы: 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, так массив указателей на начала его строк, адрес которого и передается. Первое у тебя есть, второго - нет. Значит, надо его сформировать и передать его адрес. |
|||
|
||||
GanZaleZ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 15.7.2003 Репутация: нет Всего: нет |
попробуй передать
int i[2][2]; f(i[2]); поидее веть имя массифа яфляеца указателем на перфый элемент , а элементы перфого масива яфляюца указателями на вторые масифы ! ![]() ![]() А такая на фид простенькая задачка ![]() ![]() |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Неверное представление о статических массивах. Двумерный статический массив на самом деле - одномерный, но его логически можно представить как двумерный. А если функция считает, что ей передали указатель на массив указателей, она возможно и отработает без эксцепшона, но все равно неправильно -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
GanZaleZ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 15.7.2003 Репутация: нет Всего: нет |
Ну это ясево что он одномерный
![]() ![]() |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
![]() Ну простите за неточность... Я имел ввиду, что он располагается в памяти одним непрерывным куском -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
Freeman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 29.11.2003 Репутация: нет Всего: нет |
Может понравиться, все равно я не долго думал
![]() #include <iostream.h> void f(int **h, int a, int b) { int *s; s=new int[a*b]; s=(int *)h; for(int i=0; i<a; i++) for(int j=0; j<b; j++) cout << *(s + i*b + j) << ' '; } void main() { int a[2][4]={{1,2,3,4},{10,20,30,40}}; f((int**)a, 2, 4); } |
|||
|
||||
Freeman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 29.11.2003 Репутация: нет Всего: нет |
![]() Это сообщение отредактировал(а) Freeman - 1.12.2003, 03:40 |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Что это? ![]() -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
Freeman |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 29.11.2003 Репутация: нет Всего: нет |
Ну как что , создание динамического массива общей размерностью a*b, чтобы компилятор знал размер памяти на которую указывает s или h, это точно работает проверял |
||||
|
|||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
С таким же успехом будет работать и следующий код, зато без утечек памяти
![]()
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
Freeman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 29.11.2003 Репутация: нет Всего: нет |
Ну ладно согласен , будет работать, но важна идея
![]() ![]() |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
по-моему, неплох такой вариант:
#include <iostream> void f(int **a,int n,int m) { std::cout<<a[0]<<std::endl; for (int i=0;i<n;++i) { for (int j=0;j<m;++j) { std::cout<<a[i][j]<<" "; } std::cout<<std::endl; } } typedef int *pint; int main(int argc, char* argv[]) { const int n = 3; const int m = 2; int i1[n][m] = {{1,2},{3,4},{5,6}}; int **i2 = new pint[n]; int **i3; int i = 0; for (i=0;i<n;++i) { i2[i] = new int[m]; for (int j=0;j<m;++j) { i2[i][j] = (n-1)*i + j + 1 + 100; } } i3 = new pint[n]; for (i=0;i<n;++i) { i3[i] = i1[i]; // скопировать только указатели, а не значения, // так что невелика потеря времени и памяти } f(i2,n,m); //dynamic f(i3,n,m); //static return 0; } |
|||
|
||||
Mellorn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2003 Репутация: 1 Всего: 1 |
Вот вы все используете такую весч!
void tratata(int ** array) - сколько помню себя кодющим "**" было указателем на указтель.. это ведь не двойной массив... (во всяком случае мой компилятор матерится почем зря) _________________________ С уважение Мэл. прошу обьясните мне эту фичу с ** =) |
|||
|
||||
Mellorn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2003 Репутация: 1 Всего: 1 |
P.S ->
Полностью согласен потому и задал вопрос вышк |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |