![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
в принципе даже так проканает
Ulysses4j, твой вариант скомпилится только для известного размера массива. Это сообщение отредактировал(а) Fazil6 - 11.6.2007, 13:19 |
|||
|
||||
| _stranger_ |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
а если вот так
|
|||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Fazil6, мне кажется, что выполнение условия: "размер массива известен на стадии компиляции" (если я правильно понял твои слова) - необходимо для обеих вариантов - шаблонного и нешаблонного. Другое дело, что для массивов разных размеров мой вариант, действительно не подойдет. В случае шаблона генерируется много функций, каждая из которых вроде эквивалентна тому, что я предложил.
Я не спорю, что шаблонный вариант куда более расширяемый и удобный Это сообщение отредактировал(а) Ulysses4j - 11.6.2007, 13:27 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
так, но я имел в виду. что нельзя написать
и поэтому для каждого отдельного массива разной размерности придется писать свою функцию, что вобщем-то несовсем входит в условие задачи. Какой смысл определять размер массива внутри функции если он и так жестко задан в объявлении параметра этой функции? |
|||
|
||||
| Ulysses4j |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Мне кажется, именно жесткость здесь и желанна: внутри функции хочется быть уверенным, что мы имеем массив определенного размера. В отличие от распространенного подхода:
- где нам могут подсунуть что-угодно, в случае с ссылками цифры не врут. Если на протяжении программы функция вызывается для массива одной и той же длинны, заданной константами, то все нормально - это полностью эквивалентно шаблонному варианту. Под эквивалентностью понимается следующее: если захочется изменить размеры того массива, с которым работает функция - нужно придать новые значения константам и перекомпилировать весь файл - здесь важно, что константы должны находиться в одной единице трансляции, что и вызывающий код и, к тому же, в одной единице трансляции, что и определяемая функция. С шаблонами история такова, что нужно весь шаблон включать в клиентский код (естественно, опять же все вместе перекомпилируется). Еще неизвестно, что удобней. Это сообщение отредактировал(а) Ulysses4j - 11.6.2007, 13:49 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
||||
|
|||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
так причем здесь определение размера? Он ведь известен... В твоем варианте проблема как таковая не стоит.
это ведь тоже самое что и
|
||||
|
|||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
||||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Всем спасибо, за столь развернутые примеры!
Но полное понимание сего вопроса еще не пришло, посмотрите плиз примерчик:
на отмеченной проблемной строке компилятор VC7.1 выдает ошибку:
Это особенность компилятора, или это и не должно работать? |
||||
|
|||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
zkv, MinGW скомпилировал. VC++ (я восьмеркой пробовал - та же история) выделывается: ссылка - это хоть и константа, но константы бывают времени компиляции и времени выполнения. И если у компилятора не получается на этапе компиляции определить, то надо оставлять на потом. Возможно, правила более хитрые, и я чего-то не понимаю.
-------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
у меня VC 80 проглотил нормально. Насчет VC71. Здесь всетаки оператор и видимо какая-то шняга получается с преобразованием массива к указателю (как в параметрах функции) Дальше имя массива не lvalue , а чтобы инициализировать ссылку сущностью, которая не является lvalue, эта ссылка должна быть константной (блин задвинул... короче только const ссылки позволяется инициализировать себя не lvalue). Так что понять его можно, хотя повторяю, что 80 схавал нормально |
|||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Ух-ты, тогда я уточню, что у меня не захотел компилировать этот код с такой же ошибкой компилятор MS Visual C++ 8.0 из состава VS Express Edition. Хотя я все время думал, что сам компилятор EE ничем от оного из "большой" VS не отличается. Это сообщение отредактировал(а) Ulysses4j - 12.6.2007, 07:28 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Я пробовал тоже на восьмёрке, профессиональной, выдалась та же ошибка, что и у zkv. Пробовал менять настройки в проекте, что-то не получилось. Пробовал обмануть компилятор в 2 этапа:
был наказан тем, что, хотя и не получил ни одного ворнинга, получил неправильно работающую функцию. Ничего лучше, чем
придумать не сумел. Вряд ли это то, что нужно zkv, но, возможно, кому-нибудь и пригодиться. Это сообщение отредактировал(а) Ln78 - 12.6.2007, 08:09 |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
не будет. Это же совсем не то, что ты хочешь, насколько я понимаю. Обычно данные проблемы решаются с помощью указателей:
Неужели так необходимы ссылки? |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
да я наврал много, сразу намека Daevaorn'a не понял обычно так и делал, но вот вспомнил слова Страуструпа, что указатели в С++ всегда можно заменить ссылками (где-то он такое говорил...), и решил раскопать, как это делается в таком случае |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |