Передать в функцию двумерный статический массив
int MasPer[20][20];
Есть функция со след. заголовком:
void vyvesti(int** Mas_2x, int Razm1, int Razm2, ofstream& fileMas);
И участок кода:
vyvesti(MasPer, KolPotr, KolPost, fileOut);
Подскажите, пожалуйста, как сделать так, чтобы это все работало?
Выдает ошибку
error C2664: 'vyvesti' : cannot convert parameter 1 from 'int [20][20]' to 'int ** '
Нужно обязательно оставить возможность передавать в ф-ю динамические массивы и желательно объявить MasPer как статический массив
а можно так
void vyvesti(T& Mas_2x, ofstream& fileMas);
Только вот скажи, почему бы тебе не использовать контейнеры, раз уж ты пишешь на C++ с использованием STL ?
А выглядит как автомобиль Ferrari с деревянными колесами от телеги.
error C2664: 'vyvesti' : cannot convert parameter 1 from 'int [20][20]' to 'int ** '
Дело в том, что int [20][20] - это, с точки зрения машинной логики, одномерный линейный массив, посему передаваться в функцию должен указателем первого порядка (int*)
А для правильного подставления в функцию параметра int** (указатель второго порядка), нужно объявлять динамический двумерный массив, выделять под него память в куче.
Вот только код выделения/освобождения памяти будет очень длниный :(
Это с точки зрения логики каких таких машин? :)
С точки зрения С++ это двумерный массив конкретной размерности, который можно передавать по ссылке или по указателю на двумерный массив этой же размерности.
void vyvesti( int (*Mas_2x)[20][20] );
Либо можно передать указатель на первый элемент этого массива, который будет одномерным массивом конкретной размерности.
void vyvesti( int Mas_2x[][20] );
void vyvesti( int Mas_2x[20][20] );
Можно завернуть это дело в шаблон для любых размерностей.
Но лучше использовать КОНТЕЙНЕРЫ.
void Func1(int * pBuff);
{
....
}
int * pBuffer = (int *)malloc(sizeof(int) * 20 * 20);
Func1(pBuffer);
а уже в самой функции - конвертить типа:
counter = innercounter + outercounter * 20;
//n и m - константы размера
int func(clas1 * b)
{
//..........
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
( *(b+(j*mpwdth)+i) )=0;
//.......................................
}
//вызов:
clas1* tmp=&a[0][0];
func (tmp);
извращение конечно но работает по крайней мере
//n и m - константы размера
int func(clas1 * b)
{
//..........
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
( *(b+(j*mpwdth)+i) )=0;
//.......................................
}
//вызов:
clas1* tmp=&a[0][0];
func (tmp);
извращение конечно но работает по крайней мере
Ну и зачем оно нужно?
НЕ НУЖНО НИКАКИХ КОНТЕЙНЕРОВ!
using namespace std;
int mass[20][20];
void output (int *mass) // преобразуем к одномерн. массиву
{
cout << mass[20*0 + 0] << endl;
cout << mass[20*0 + 1] << endl;
cout << mass[20*3 + 7] << endl; //если размерность известна
}; // то все добро :)
int main(int argc, char *argv[])
{
mass[0][0] = 1;
mass[0][1] = 2;
mass[3][7] = 3;
output (&mass[0][0]);//передаем адрес певрого элемента масс.
system("PAUSE");
return EXIT_SUCCESS;
}
Если неизвестна размерность массива, то ее можно тоже передать в функции - типа
void output (int *mass, int SIZE_X, int SIZE_Y)
НЕ НУЖНО НИКАКИХ КОНТЕЙНЕРОВ!
Ну так и cout не нужен, и двумерный массив не нужен.
Нафига тебе вообще C++ ?
До чего же народ любит забивать гвозди микроскопом...
ну, не знаю. мне так удобно.
[QUOTE=Green;193587]Ну а ещё можно ухо почесать ногой... :)
ну, не знаю. мне так удобно.[/QUOTE]
Попробуй почесать рукой. Вот увидишь, это удобнее. :D
Нафига тебе вообще C++ ?
До чего же народ любит забивать гвозди микроскопом...
ааааааааааааааа... как сказал! как сказал!!!!! :D
[/offtop]
а если не известна, то о чем вообще речь? чем пукать сказал бы по делу что-нибудь!
хотя у автора топика передается в функцию размер массива.
дзен рядом! но судя по всему не для всех... мир не спасти...
а то что Вы привели в качестве мегарешения, простите, бред =)
PS: речь о том, что массив может быть и динамическим
Речь о том, что такие ситуации должны быть предусмотрены в программе, а ты видимо, предлагаешь принцип - "Если я не знаю, как это реализовать, то это надо просто выбросить из ТЗ";).
Как ты сам сказал в предыдущем своем посте, размерность массива можно передавать в функцию отдельными аргументами. Но у этого подхода есть объективные недостатки:
1) Это просто неудобно. Ее придется хранить в отдельной переменной/переменных, передавать ее везде, где требуется работа с массивом.
2) Если передавать размерность массива отдельно от него, то можно допустить ошибку - передать ее некорректно. И тогда ошибка пойдет дальше, в функцию-обработчик, и т.д.
3) Массив фиксированной длины сам по себе не слишком удобен.
А теперь правильное решение поставленной задачи. По шагам.
1) Ясно, что размерность массива есть его неотъемлемая характеристика.
2) Значит, их нужно хранить вместе, причем обеспечивать корректную установку значений этой характеристики при создании массива, при его резайзе, и прочих изменениях, а так же обеспечить возможность получение актуального значения этой характеристики в любой момент времени.
3) Поразмыслив немного, придем к выводу, что было бы неплохо написать собственный шаблонный класс, реализующий описанные в п. 2 возможности.
4) Заглянув в std::vector, видим, что такой класс уже есть, причем реализующий, дополнительно, большое кол-во других ценнейших возможностей, описанный в известных книгах по стандартной библиотеке С++ и имеющий полную документацию.
Ну и каков будет твой выбор?...
хотя у автора топика передается в функцию размер массива.
Возможно, автор просто не знает других способов. Но зачем отвергать их, если они намного лучше?
дзен рядом! но судя по всему не для всех... мир не спасти...
Зачем упрекать кого-то в том, что он постит не по теме, и самому тут же вляпываться в какую-то пессимистичную философию?;)
А если неизвестна размерность массива перед его обработкой и если передаются переменные в функцию с искажением размерности, то искать причину надо в ждругом месте :)
Тут только либо искусственный интеллект, либо лсб.
P. S. Вот и смайлик низкоуровневый
P. P. S. Кто-нибудь обязательно предложит программировать на асме. Пробовал, но по ряду причин выбрал C++.
Он совершенно корректен, не спорю. Он будет компилиться и прекрасно работать, для этой конкретной задачи. Но в реальной жизни твой вариант будет малопригоден. Использовать-то можно, но ЗАЧЕМ, если есть варианты гораздо лучше.
А если неизвестна размерность массива перед его обработкой и если передаются переменные в функцию с искажением размерности, то искать причину надо в ждругом месте :)
Именно сказал, хорошо - в ДРУГОМ месте.
1. В проектировании. Механизмы передачи и обработки настолько непрозрачные, что в них данные исчезают, как в черных дырах.
2. В нерациональном использовании средств и незнании стандартных реализаций тривиальных вещей.
Вопрос на засыпку - для чего была создана Стандартная библиотека? ;)