Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.59.136.170] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Как передать двумерный массив в функцию?Помогите, пожалуйста!!!
|
Сообщ.
#2
,
|
|||
|
Либо использовать массив указателей Или
Добавлено в Второй метод будет и быстрее (к многомерным массивам доступ происходит медленнее) |
Сообщ.
#3
,
|
|
|
Совсем вылетело из головы, что все равно в элементам надо обращаться в стиле a[j*n+i]
|
Сообщ.
#4
,
|
|
|
void f(int ** arr, int n, int m)
{ } int a[20][20]; ... f(a,20,20); должно работать можно фунцию даже так определить: void f(int arr[20][]); или void f(int arr[20][20]); . можно еще для разнообразия использовать vector<vector<int> > (вектор векторов) |
Сообщ.
#5
,
|
|||
|
Demo_S
Ты сам такую фишку пробовал? Я как-то писал прожку и тоже воспоользовался такой штукой.. И вот у меня возникало исключение.. Долго искал ошибку, потом дошло, что двумерный массив это не указатель на указатель... Так что это не сработает. А вот это должно сработать: void f(int arr[20][]); или void f(int arr[20][20]); |
Сообщ.
#6
,
|
|||||
|
Это работает, если двумерный массив создать динамически, тогда получается массив указателей на указатели |
Сообщ.
#7
,
|
|
|
да. сори, так
void f(int ** arr, int n, int m) { } int a[20][20]; ... f(a,20,20); низя. Lavrik правильно сказал, я просто давно уже статические массивы не использую int **a=new int* a[10]; for(int i=0;i<10;i++) a[i]=new int[10]; .... f(a,10,10); ... for(int i=0;i<10;i++) delete[] a[i]; delete[] a; вот что имелось ввиду:) |
Сообщ.
#8
,
|
|||
|
Вариант одобренный стандартом (во всяком случае так стоит у меня в книге ) Но по-моему лучше написать один раз шаблон, когда одномернуй массив эмулирует двумерний. Немного больше проблем с массивами большей размерности. |
Сообщ.
#9
,
|
|
|
Поднимаю тему.
Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ? И лучшим по простоте и понятности( ) способом остается int a[2][2]; f(&a[0][0],2,2); ? Еще, нам говорили что можно передать таким способом: int a[10][10], **st; *st=*a; func(st); но он не работает. |
Сообщ.
#10
,
|
|
|
Цитата Ilar @ Поднимаю тему. Интересно с какой целью? Новую создать так тяжело? Блин сообщения за 2003 год откопал... |
Сообщ.
#11
,
|
|
|
Сообщ.
#12
,
|
|
|
оффтоп
n0rd, а потом мы жалуемся, что люди не пользуются поиском... Ilar, правильно сделал Цитата Ilar @ Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ? объяву func покажи *st=*a; куда ты записываешь *a? скажи словами Добавлено Цитата ElcnU @ недавно обсуждали гы, тогда не очень правильно сделал |
Сообщ.
#13
,
|
|
|
Цитата Alek86 @ n0rd, а потом мы жалуемся, что люди не пользуются поиском... Если поиск не дал ответов на вопрос, нефиг заниматься некромантией. |
Сообщ.
#14
,
|
|
|
n0rd, проблема актуальна, написанный ранее код/утверждения так же верны сейчас, как и тогда. Почему же вас так смущает дата ?
ElcnU, я не С++ Builder использую, да и в той теме автору нужно передать массив не меняя объявление функции. Здесь же вопрос как лучше передать такой массив. Alek86, объявление простое, для проверки: void func(**a) |
Сообщ.
#15
,
|
|
|
Цитата Ilar @ Действительно, тема поднималась неоднократно. Поищи получше или (что ещё лучше) попробуй понять сам, основываясь на том, что Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ? int a[5][5]; int **b; const size_t size1 = sizeof(*a); // == sizeof(int)*5 const size_t size2 = sizeof(*b); // == sizeof(int*) const bool equals = size1==size2; // == false (Win32 and x86) |