![]() |
|
Модераторы: bsa |
![]()
|
|
| semibug |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
Если некоторая функция принимает указатель на char, например:
то имея массив объявленный как
можно вызвать функцию foo так:
либо так:
Причем второй способ встречался чаще. Есть ли разница в этих двух способах вызова функции? |
||||||||
|
|||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Голосую за второй вариант- можно потом заменить тип array на vector или string без изменения твоего кода
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: нет Всего: 5 |
мне тоже стало интересно почему эти варианты идентичны ? я второй понял бы как передача ссылки на первый элемент массива, но вроде как передается весь массив
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
если смотреть со стороны ф-ции то передаётся, все-таки, указатель на начало массива -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
оператор индекса ведь есть и у вектора и у стринга. или что? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Если Вы имели в виду, что необходимо проверять строку на предмет empty(), то да - изменения потребуются (как, впрочем, и с вектором). Или, может, Вы имели в виду, что operator[] строки не обязан возвращать указатель на, так сказать, raw-данные строки ? В общем, хотелось бы комметариев Это сообщение отредактировал(а) borisbn - 19.11.2011, 09:25 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Голосую за первый вариант, потому что второй - напрасное усложнение.
-------------------- You're face to face With man who sold the world |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
operator[] возвращает ссылку на элемент под этим индексом
IMHO, всё зависит от реализации контейнера, поэтому второй вариант гарантирует портабельность кода, а первый нет. Это сообщение отредактировал(а) Леопольд - 19.11.2011, 11:28 -------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
а разве существуют реализации std::string/std::vector возвращающие не ссылку на элемент? нет, конечно, в Qt`ешных контейнерах это нормально, там и множество не сортированное. но это ничего. все равно никто(почти) из пользователей этого и не заметил. почти уверен в том, что и borisbn об этом не знал ;) Это сообщение отредактировал(а) boostcoder - 19.11.2011, 12:07 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
да без разницы как сделаешь, лишь бы самому было понятно, но лучше второй вариант, так будет понятней что передаешь указатель массива, а не какую нить переменную (чисто так чтение кода упрощается со вторым вариантом).
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
существуют (законы по стандарту) реализации std::string в которых расположение элементов не плоское.. (в отличие от vector`а).. Это мы еще не впомнили про возможное отсутствие признака конца строки.. речь не о них, а о stl.. Добавлено через 2 минуты и 53 секунды поэтому конструкция типа &str[ 0 ] (для std::string) - это путь к длительному и весьма занятному времяпровождению за дебагом |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Теоретически эти данные могут быть расположены не последовательно в памяти. Мы не знаем какой внутренний механизм у стринга. Чтобы расположить данные последовательно, и завершить их нулем, существует .c_str(); Одна из вещей которая меня всегда удивляет в С++, (как впрочем видимо и в других языках), есть вещи которые работают в реале всегда, но теоретически нарушают некое правило, и тем самым вызвают бурю возражений (одну из этих вы привели). И есть обратное, когда код прямо не нарушает правило, но в реале, глючит абсолютно везде и абсолютно всегда! (хотя бы тот же самый utf-8). И это почему-то, ни у кого не вызывает бурю эмоций! |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
volatile,у вас вроде VS (или кто нибудь другой у кого она есть)..
какой sizeof у std::string ? VS желательна старой версии, на новой будет скорей всего будет 4 байта ( из за cow).. Это сообщение отредактировал(а) mes - 19.11.2011, 12:36 |
|||
|
||||
| semibug |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
mes, VS2005/Win7x64, Default Project Settings for Console App:
Debug 32 bytes Release 28 bytes попробовал в VS2010 - результат тот же Это сообщение отредактировал(а) semibug - 19.11.2011, 12:53 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
mes, В студии стринг маленькие строки (кажется до 14 байт, точно не помню) хранит внутри себя, без выделения памяти. Поэтому размер не 4 байта, а как сказал semibug, Это сообщение отредактировал(а) volatile - 19.11.2011, 13:04 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 1 минуту и 55 секунд это не проверял, но я все ж надеюсь что у них именно так, а не потому как в противном случае, пдобная проблема всплывала бы часто.. Добавлено через 6 минут и 13 секунд я говорил : а эт несколько иное значение Добавлено через 11 минут и 53 секунды как когда то было с прямым приведением строки к указателю.. аргументы, что указатель может быть не первым членом отвергались возмущением, а зачем разроботчикам мудрить, если и так работает.. т.е разработчики знали что пользователи могут привести, и располагали указатель первым, а пользователи в свою очередь знали, что разработчики думают о них и со спокойной душой приводили.. и было счастье и работало все всегда.. пока не пришла корова по английски |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
где-то на винграде это обсуждалось. но я не понимаю где здесь хоть намек на эффективность? вот нужно создать мильен строк размером больше того буфера, и что мы получим? - пустые расходы памяти. ведь 14*1000000 = 14мб |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Это же не объективный (специально подобранный) тест, чтобы дескредитировать такой алгоритм. Почему-бы не взять (тоже не объективный) тест с мульеном строк, но размером чуть меньше этого буфера. Впрочем я не защищаю их алгоритм. У стл-порт короткий sizeof (string), можно поставить его - выбор есть всегда. Но реального быстродействия, и экономии памяти при использовании стл-порт::string, у я не заметил.
Вот здесь ударение надо поставить на бы. mes, я не возражаю что это нарушение правил, и что так делать нельзя. Я только хочу сказать, что в реале я не встречал (возможно даже они где-то есть, но я не видел) реализаций стринга которые бы не работали, так как преположил borisbn. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если это правило случайно ( VS была специально приведена дкак пример вполне не ожидаемой реализации) не было нарушено, это не дает нам право никаких оснований на спокойное их нарушение.. volatile, по поводу высказываниях о возмущениях я практически полностью согласен... нужно адекватно оценивать степень риска, а не просто кричать что это зло.. Приведенная обсуждаемая конструкция ничего кроме осложнения и потенциальных проблем не дает, поэтому применять подобное лишено какого либа смысла, даже если (ударение на бы) в текущее время нет нарушений правил.. ситуация с коровой вполне показательно отражает возможные казусы.. Это сообщение отредактировал(а) mes - 19.11.2011, 15:29 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
mes, абсолютно согласен.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |