Название: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 11:18 Есть 3 массива, из них один - двумерный, + int.
Как правильно написать вызов и саму процедуру по их заполнению? Похожая тема (http://www.prog.org.ru/topic_1230_0.html) не помогла. ??? Пытаюсь сделать так: Код: MainClass::MainClass() Цитировать no matching function for call to 'MainClass::INTdBds (double&, double&, double [9], double(*)[6], double(*)[(((unsigned int)(((int)kt1)+1))][2], long int*)' Совсем я запутался с этими указателями...candidates are: void MainClass::INTdBds(double, double, double*, double**, double**, long int*) Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: kambala от Июль 20, 2011, 12:25 третий параметр ожидается double, а ты туда подставляешь массив;
чтоб передать указатель на двумерный массив, в сигнатуре функции поменяй на double B[][2] или double **B; при передаче массива в качестве параметра писать перед ним & необязательно; при обращении к элементам массива, даже если он и передан в виде указателя, ставить перед ними * не нужно Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: shirushizo от Июль 20, 2011, 12:38 Ваша процедура:
Код: void MainClass::INTdBds(double S, double ho, double *NU, double *REZ, double **B, long int &i) Вызов: Код: INTdBds (LGL, h1, EF, V, BL1, kt1 ); Массив - указатель на первый элемент (m == &m[0]) и в функции обычно передается как указатель, т.е. адрес первого элемента. Передавая параметры по ссылке мы также передаем адрес, но работаем с параметром как с обычной переменной, т.е. разадресация не нужна (i = 2; вместо *i = 2;). Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 13:19 shirushizo, вот теперь всё понятно стало. ;D
Спасибо огромное! Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: LisandreL от Июль 20, 2011, 13:29 Передавая параметры по ссылке мы также передаем адрес, но работаем с параметром как с обычной переменной, т.е. разадресация не нужна (i = 2; вместо *i = 2;). Недоправили: B[*i-1] => B[i-1]Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 13:42 ...хотя поторопился я.
Пишу: Цитировать void MainClass::INTdBds(double S, double ho, double *NU, double *REZ, double **B, long int &i) и вызываю: INTdBds (LGL, h1, EF, V, BL1, kt1 );Пишет опять: Цитировать no matching function for call to 'MainClass::INTdBds (double&, double&, double [9], double[6], double[(((unsigned int)(((int)kt1)+1))][2], long int&)' Когда правлю наcandidates are: void MainClass::INTdBds(double, double, double*, double*, double**, long int&) Цитировать void MainClass::INTdBds(double S, double ho, double *NU, double *REZ, double B[][2], long int &i) Все собирается, но есть подозрение что вЦитировать MainClass::MainClass() BL1 - не заполнится... Или я не прав?{ ... INTdBds (LGL, h1, EF, V, BL1, kt1 ); ... } Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: shirushizo от Июль 20, 2011, 14:02 LisandreL, проглядел :).
Martiro, да в случае, double B[][2] будет передано значение, т.е. копия массива, а не указатель. Массив BL1 не изменится. выдели память ручками: Код: double *EF= new double[9]; Код: void MainClass::INTdBds(double S, double ho, double *NU, double *REZ, double **B, long int &i) Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Igors от Июль 20, 2011, 14:04 BL1 - не заполнится... Или я не прав? У Вас данные организованы настолько безобразно, что трудно что-то понять/сказать. Вы не хотите использовать stl, контейнеры - хорошо, но тогда создайте структуру и засуньте в нее все потроха, напрКод А то бегать с разбросанными массивами можно очень долго Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: kambala от Июль 20, 2011, 14:07 Martiro, да в случае, double B[][2] будет передано значение, т.е. копия массива, а не указатель. Массив BL1 не изменится. массивы никогда не передаются по значениюНазвание: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 14:43 Я прошу прощения за это "безобразие". Позже переделаю. А пока, для экономии места, написал так.
И спрашиваю для того чтобы увидеть советы от людей лучше меня разбирающихся в Си. Поэтому заранее прошу прощения за неграмотность в некоторых вопросах. Вы не хотите использовать stl, контейнеры - хорошо... Так научите, подскажите! Однако, здесь использование сторонних библиотек не желательно.Далее по теме: Как после этого вытащить значения из BL1? Создал массив на подобии того, как Вы советовали (http://www.prog.org.ru/index.php?topic=18870.msg127139#msg127139): Код пытаюсь заполнить например так: Код компилятор ругается: Цитировать invalid types 'double[int]' for array subscript Оно и понятно. Массив создался одномерный. Как сделать двумерный?Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: kambala от Июль 20, 2011, 14:55 Вы не хотите использовать stl, контейнеры - хорошо... Так научите, подскажите!Код пытаюсь заполнить например так: Код компилятор ругается: Цитировать invalid types 'double[int]' for array subscript Оно и понятно. Массив создался одномерный. Как сделать двумерный?Код
Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: m_ax от Июль 20, 2011, 15:00 Я прошу прощения за это "безобразие". Позже переделаю. А пока, для экономии места, написал так. Укуси меня пчела))И спрашиваю для того чтобы увидеть советы от людей лучше меня разбирающихся в Си. Поэтому заранее прошу прощения за неграмотность в некоторых вопросах. Вы не хотите использовать stl, контейнеры - хорошо... Так научите, подскажите!Далее по теме: Как после этого вытащить значения из BL1? Создал массив на подобии того, как Вы советовали (http://www.prog.org.ru/index.php?topic=18870.msg127139#msg127139): Код пытаюсь заполнить например так: Код компилятор ругается: Цитировать invalid types 'double[int]' for array subscript Оно и понятно. Массив создался одномерный. Как сделать двумерный?Код: Оно и понятно. Массив создался одномерный. Как сделать двумерный? Код kambala меня опередил)) А вообще, лучше использовать уже готовые контэйнеры. В качестве двумерного массива могу посоветовать такую реализацию: Код
Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 15:13 Код
Код вылетает на Segmentation fault. Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 15:16 m_ax, спасибо за классы! Если сейчас ничего не получится, буду их прикручивать. ;D
Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: kambala от Июль 20, 2011, 15:20 ищи ошибку у себя - может где-то обращаешься за границу массива. и не забудь освободить память в конце работы массива.
Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Igors от Июль 20, 2011, 17:54 Оно и понятно. Массив создался одномерный. Как сделать двумерный? "Физически" нет 2-мерных, на самом деле все это дела адресной арифметики. Лучше сказать "как мне сделать так чтобы можно было обращаться" Код: BL[0][0] = 1.0; Код Да и так уж нужен именно 2-мерный? Спокойно можно все делать с одномерным Код
Позже переделаю. А пока, для экономии места, написал так. Хм... нет ничего более постоянного чем временное :) Попробуйте снести все написанное к чертовой бабушке и написать "капитально" с продуманными структурами данных. Это совсем не так страшно как на первый взгляд. А цепляясь за имеющийся код Вы намного больше времени потеряете, да и не очень приятно то старье латать. Живите красиво/шикарно :)Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: Martiro от Июль 20, 2011, 20:49 Проблема вся в том, что изначально приходится переписывать код написанный на VB. А нет ничего хуже, чем копаться в чужом коде. Да еще и написанном на другом языке с другими возможностями и правилами. Написал бы всё сам изначально, но слишком сложная мат. часть... :(
Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: shirushizo от Июль 21, 2011, 09:09 массивы никогда не передаются по значению Пардон, тупанул, просто сижу по локоть в отладке проекта на бейсике, прошу простить :-[Название: Re: Как передать в функцию указатель на (двумерный) массив? Отправлено: lenny от Август 02, 2011, 08:01 Передача двумерного массива в функцию.
В качестве бонуса получаем информацию о количестве элементов: Код: template <class T, ptrdiff_t i, ptrdiff_t j> |