Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.82.244] |
|
Сообщ.
#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) |
Сообщ.
#16
,
|
|
|
Цитата Ilar @ я не С++ Builder использую не принципиально для данного вопроса, синтаксис тот же, С++ Цитата Ilar @ Здесь же вопрос как лучше передать такой массив. как передать именно такой статический массив там есть решение(9й,12й пост) но это при определенных условиях #include <iostream> typedef int arrayint5x5_t [5][5]; void foo(arrayint5x5_t arr) { for(int i=0;i<5;++i) for(int ii=0;ii<5;++ii) std::cout<<arr[i][ii]<<" "; } int main() { int ar[5][5]; for(int i=0;i<5;++i) for(int ii=0;ii<5;++ii) ar[i][ii]=i*ii+ii; foo(ar); } там есть еще варианты, посмотри |
Сообщ.
#17
,
|
|
|
Цитата Ilar @ Здесь же вопрос как лучше передать такой массив. Если размерность фиксированная (size1 * size2), то так f(Type (&arr)[size2][size1]); или так f(Type (*arr)[size2][size1]); |
Сообщ.
#18
,
|
|
|
Здраствуйте. Подскажите пожалуйста, как передать массив строк, количество которых n? Задал я его динамически таким способом:
char **str; str=(char**)calloc(n,sizeof(char*)); for(int i=0;i<n;i++) str[i]=(char*)calloc(MAX_LEN,sizeof(char)); А передать его в функцию никак не могу..(( Когда пишу вот так: ExcStr(str,n); то Builder ругается: E2034 Cannot convert 'char * *' to 'char ( *)[10240]' E2342 Type mismatch in parameter 'str' (wanted 'char ( *)[10240]', got 'char * *') З.Ы. Эту тему читал полностью, но как передать вот такое, как у меня, к сожалению не понял |
Сообщ.
#19
,
|
|
|
Странный вопрос - компилятор же тебе прямо написал, как переделать:
... ExcStr(char** str, int n); |
Сообщ.
#20
,
|
|
|
Пожалуй самый казуальный способ передачи массива в функцию - это применение структуры
using namespace std; struct MyStruct{ float arr[2][2]; }; void AnyFunc(MyStruct ); int main() { MyStruct a; a.arr[0][0]=1.1; a.arr[0][1]=2.2; a.arr[1][0]=3.3; a.arr[1][1]=4.4; AnyFunc(a); system("pause"); return 0; } void AnyFunc(MyStruct a) { for(int i=0; i<2; i++) for(int j=0; j<2; j++) cout<<a.arr[i][j]<<" : "; cout<<endl; } Никаких указателей, все четко и просто... |
Сообщ.
#21
,
|
|
|
Не самый, но вполне достаточно. Далеко не всегда в цели входит передача копии массива постоянного размера.
|
Сообщ.
#22
,
|
|
|
Цитата Qraizer @ Далеко не всегда в цели входит передача копии массива постоянного размера. Это как это далеко не всегда ? я не в том смысле что наехать, я спрашиваю, обычно передают по: const MyStruct& perem Просот есл иамперсанд убрать бред получица полный, этож будет весь массив скопирован во внутрений объект, я просто не видел случаев на своей практике, когда бы это понадобилось... |
Сообщ.
#23
,
|
|
|
KILLER, я чёт не понял. Ты согласился или споришь?
|
Сообщ.
#24
,
|
|
|
Цитата Qraizer @ KILLER, я чёт не понял. Ты согласился или споришь? Я спрашиваю, нафига передавать структуру с массивом по значению а не поссылке ?? |
Сообщ.
#25
,
|
|
|
Значит согласился.
|