![]() |
|
|
![]()
|
|
| Vassik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 31.1.2006 Репутация: нет Всего: нет |
Короче такой вот простенький код в консолевском режиме в Builder -е
int main(int argc, char* argv[]) {char *ch; //int a; cin >>ch; cout << ch; return 0; } Все работает замечательно Как только раскоментируем переменную ,а вообщем даже неважно какого она типа, то появляется ошибка доступа: "Access violation at adress 32657C73. Write to address 00000001 " Возможно мой вопрос покажится забавным, но просто не пойму в чем причина, может кто объяснит мне почему возникает такая ошибка? |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
ошибка в том, что ты память под ch не выделяеш
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| DeadMan83 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
Глюк компилятора Borland, визуалка такое сразу не пропускает.
Это сообщение отредактировал(а) DeadMan83 - 21.2.2006, 16:24 |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
неа глюк рук -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| DeadMan83 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
Romikgy
а если я введу строку длиной больше 256 символов? твой код тож глючит
глюк не в том что выдаеться ошибка, а втом что она в первом случае не возникает. Если посмотретькуда указывает ch, то в первом случае указатель равен чтото типа 0x007а21с0, а во втором случае 0x01. Почему в первом случае инициализация не происходи, в отличии от второго - на совести Borland. PS. А с "ручками" конечно я согласен кстати вот рабочий код
|
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
локальные переменные никто не обязан ( я имею в виду компилятор ) инициализировать.
поэтому таки руки виноваты -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| DeadMan83 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
с тобой нельзя не согласиться вот только хотелось бы однозначности от компилятора, если инициализировать, то уж всегда, или вообще не инициализировать (тоже всегда), чтоб была однозначность. да и варнинг можно было бы сгенерить. программист - тоже человек. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
DeadMan83,
Я это для примера привел, и думаю , что юзер захарится с клавы 255 символов набивать А число можно и другое поставить и динамически выделять
Смысл куда то смотреть при кривом коде? _hunter, согласен -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
так это и есть однозначность -- переменная ВСЕГДА устанавливается в случайное значение насчет варнинга... а смысл? может ты специально так задумал. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| DeadMan83 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
в том то и фишка что значение во втором случае (когда выдаеться сообщение) не случайно (0x0000001). гораздо чаще возникает необходимость сделать чтото типа if(a = proc(b)){...} причем сдесь-то варнинг выдаеться. интересно как выделять char динамически не зная какая будет длина строки? да и 255 - это не так уж и много |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Попробуй переписать функцию ввода с клавиатуры. Выделяеш например под буффер ввода 64 байта, устанавливаеш счетчик введенных символов, как только счетчик дошел до предела, расширяй буфер (realloc). Как правило расширяют размер буфера в два раза.
В VC в дебаг режиме, все переменные сразу иницилизируются кодом 0xCC. Иницилизация прописана автоматически. Это сообщение отредактировал(а) Fin - 21.2.2006, 17:33 -------------------- Пролетал мимо. |
|||
|
||||
| _hunter |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
ты значение переменной смотри до _выполнения_ следующей _комманды_.
а если ты планируеш позже эту переменную инициализировать ( да еще и по условию ( да еще и не в одном месте ) )? ты этк проверку себе представляеш? -------------------- Tempora mutantur, et nos mutamur in illis... |
||||
|
|||||
| DeadMan83 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
а зачем изобретать велосипед? не лучше ли воспользоваться тем что уже написано и оттестировано, STL например;)
в VC все хорошо обрабатывает, проверял и там, выдает ошибку что произошло обращение к неинициалезированной переменной, что собственно и ожидалось. А вот в Builder все не так. Добавлено @ 17:46
имелось виду выдавать варнинг при обращении к переменной (получения ее значения) ДО ее инициализации.
значение я смотрю когда еще выполнение "cin>>ch" не началось. (брейкпоинты ставить умею) |
||||||
|
|||||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
следующая _команда_ это int a
это варниг ты можеш ( и должен ) сам реализовать... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| chwind |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 15.2.2006 Репутация: 1 Всего: 1 |
это варнинг есть
W8013 Possible use of 'identifier' before definition Compiler warning |
|||
|
||||
| DeadMan83 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
int a - это не команда (попробуй поставить брейкпоинт, посмотреть в режиме дизасма. а вот int a= 1; - уже команда. согласен что вызов cin>>ch сложно анализировать и VC ксатит ту варнинг не выводит. но вот попробуй такой код
и варнинг тут как тут
|
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Стандарт не требует инициализировать указатели с помощью Null или с помощью чего либо еще. Так что виноваты руки, а не компилятор.
Borland здесь ничего не нарушает -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Fin |
|
||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Единственное как я вижу этот варнинг, это только на стадии компиляции. Да и то, оно им надо (разработчикам). Пример:
Тут в принципе неизвестно что будет. И отследить данный трюк компилятору очень сложно. С ссылками намного проше, если программа пытается лезть в запрешенную зону, тут же синий экран смерти проги. Это сообщение отредактировал(а) Fin - 21.2.2006, 18:09 -------------------- Пролетал мимо. |
||||
|
|||||
| chwind |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 15.2.2006 Репутация: 1 Всего: 1 |
Fin, зайди в настройки проекта и включи соответствующий варнинг (W8013) после чего компилятор билдера (да и VC тоже) легко
|
|||
|
||||
| DeadMan83 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.2.2006 Где: Минск Репутация: нет Всего: нет |
сложно но можно. VC (как оказалось и Builder) отслеживает и варнинг выдает.
а зачем тогда вообще варнинги??? по мне так чтоб предупредить программиста, что возможно в коде ошибка. Это сообщение отредактировал(а) DeadMan83 - 21.2.2006, 18:15 |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Я привел пример в лоб. Если пустить кучу ветвлений (switch), то или Вы компилятор, или компилятор Вас.
-------------------- Пролетал мимо. |
|||
|
||||
| Vassik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 31.1.2006 Репутация: нет Всего: нет |
Всем спасибо и со всей критикой согласен, только вот то что в одном случае все зашибись, а в другом ошибка, все таки я думаю на совесте компилятора
|
|||
|
||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
Читай по одному символу и каждый раз увеличивай динамический массив
STL не является стандартом С++, если я не прав пусть гуру поправят -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
стандартом -- нет, стандартной библиотекой -- да
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Требования к STL описаны в стандарте языка в главе 17 и она обзывается там как С++ Standard Library и следовательно входит в стандарт
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |