17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89
|
|||||||||||
1 | |||||||||||
Функции, передача массива в качестве параметра30.09.2009, 16:59. Показов 17615. Ответов 14
Метки нет (Все метки)
Приветствую)
Собственно, есть простенькое задание с двумерными массивами, оно выполнено:
(cannot convert parameter 1 from 'int [4][5]' to 'const int *') Помогите доделать, или подскажите, в каком направлении искать =)
0
|
30.09.2009, 16:59 | |
Ответы с готовыми решениями:
14
Передача временного массива в качестве параметра функции Передача двумерного массива указателей на char в качестве параметра функции Передача функции в качестве параметра Передача функции в качестве параметра |
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
|
30.09.2009, 17:01 | 2 |
Сообщение было отмечено как решение
Решение
это
int srch(const int* mas, const int a, const int b); заменить на int srch(const int (&mas)[str][stb], const int a, const int b);
3
|
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89
|
|
30.09.2009, 17:27 [ТС] | 3 |
Спасибо, сейчас попробую =0
0
|
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89
|
||||||
30.09.2009, 20:31 [ТС] | 4 | |||||
Работает) еще раз благодарю
вот окончательная версия, работает (двумерные массивы, функции, передача массива в качестве параметра, поиск строк с наибольшим количеством нулей). Может, понадобится кому)
0
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
|
30.09.2009, 21:13 | 5 |
кстати, в таком случае дополнительные переменные a и b не нужны (если они используются для передачи количества строк/столбцов, чего из кода не видно)
получить их можно так: const size_t H = sizeof(mas) / sizeof(mas[0]); const size_t W = sizeof(mas[0]) / sizeof(mas[0][0]);
2
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
01.10.2009, 03:01 | 6 |
Rififi, а почему не работало? Ведь если у функции есть параметр-указатель,то можно передавать и массивы? Или ошибка потому,что параметр передаётся как const,и это связано с неявными преобразованиями указателя в массив?
0
|
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
|
||||||
01.10.2009, 06:17 | 7 | |||||
может дело вкуса, но я отдаю предпочтение макросу
0
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
|
01.10.2009, 13:30 | 8 |
#pragma,
Rififi, а почему не работало? В этом случае не работало потому, что функция ожидала указатель, а передавался двумерный массив. Одно в другое не приводится. Ведь если у функции есть параметр-указатель,то можно передавать и массивы? Верно, но с некоторыми ограничениями. Самое главное из которых - когда компилятор неявно преобразует имя массива в указатель на первый элемент, то теряется информация о типе объекта. (был массив, имеющий вполне определённый размер, стал некий указатель) Ну и еще то, что нельзя таким образом передать имя двумерного массива в функцию, ожидающую int** - т.к. расположение данных в памяти отличается (это проявится только на стадии выполнения программы). Или ошибка потому,что параметр передаётся как const,и это связано с неявными преобразованиями указателя в массив? нет, const влияет только на то, что данные, которые адресует такой указатель нельзя изменить, причем об этом следит сам компилятор а не программист.
1
|
01.10.2009, 14:29 | 9 | ||||||||||
Двухмерный массив в приницпе не может передаваться. Просто ожидался параметр типа "указатель на int" или "указатель на одномерный массив int'ов" (оба термина эквивалентны), а передавался "указатель на двухмерный массив int'ов". В Си\Си++ подобные неявные преобразования между разными типами указателей запрещены
Однако я понимаю, чем вызван вопрос #pragm'ы, а потому просто отвечу конкретным исходником
В языке C99 (и в GNU C) есть понятие VLA - variable length array. Возможно, что на современных виндовых компиляторах это тоже поддерживается, а потому можнонаписатьболее элегантно. При этом надо понимать, что это не есть "станадртный Си" (условнообзову именно этим термином)
3
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
|
01.10.2009, 15:02 | 10 |
Evg,
Возможно, что на современных виндовых компиляторах это тоже поддерживается Что касается MS, то они по каким-то неведомым причинам не слишком жалуют С99 и не торопятся добавлять его поддержку в свой компиль. Так, даже новейшая скоро-выходящая VS2010 не обладает такой поддержкой. впрочем, имея C++ оно не особо-то и нужно. C++-эквивалент этого будет: template <typename T, const size_t n1, const size_t n2> void func(T (&arr)[n1][n2]); только, как видно, гораздо удобнее - не зависит от типа, и размерности массива считаюся автоматически компилятором
1
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
||||||
01.10.2009, 19:05 | 12 | |||||
Evg,
Где-то мы это уже обсуждали, но всё равно напиши сюда конкретный пример, чтобы люди не искали Собстна, твой пример может быть переписан так:
0
|
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 29
|
|
20.11.2009, 13:29 | 14 |
ага
0
|
21 / 21 / 2
Регистрация: 09.11.2010
Сообщений: 102
|
|
05.02.2011, 01:49 | 15 |
а как передать строку массива в качестве параметра?
0
|
05.02.2011, 01:49 | |
05.02.2011, 01:49 | |
Помогаю со студенческими работами здесь
15
Передача лямбда-функции в качестве параметра Передача CString в качестве параметра функции Передача функции в качестве параметра в другую функцию Передача функции с двумерным массивов в качестве параметра Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |