| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > cout,cin |
| Автор: Vassik 21.2.2006, 15:43 |
| Короче такой вот простенький код в консолевском режиме в 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 21.2.2006, 15:59 |
| А выделять память под переменную кто будет? |
| Автор: _hunter 21.2.2006, 15:59 |
| ошибка в том, что ты память под ch не выделяеш |
| Автор: DeadMan83 21.2.2006, 16:09 |
| Глюк компилятора Borland, визуалка такое сразу не пропускает. |
| Автор: Romikgy 21.2.2006, 16:25 | ||
неа глюк рук |
| Автор: DeadMan83 21.2.2006, 16:36 | ||||
| Romikgy а если я введу строку длиной больше 256 символов? твой код тож глючит
глюк не в том что выдаеться ошибка, а втом что она в первом случае не возникает. Если посмотретькуда указывает ch, то в первом случае указатель равен чтото типа 0x007а21с0, а во втором случае 0x01. Почему в первом случае инициализация не происходи, в отличии от второго - на совести Borland. PS. А с "ручками" конечно я согласен кстати вот рабочий код
|
| Автор: _hunter 21.2.2006, 16:47 |
| локальные переменные никто не обязан ( я имею в виду компилятор ) инициализировать. поэтому таки руки виноваты |
| Автор: Romikgy 21.2.2006, 16:58 | ||
| DeadMan83, Я это для примера привел, и думаю , что юзер захарится с клавы 255 символов набивать А число можно и другое поставить и динамически выделять
Смысл куда то смотреть при кривом коде? _hunter, согласен |
| Автор: _hunter 21.2.2006, 17:06 | ||
так это и есть однозначность -- переменная ВСЕГДА устанавливается в случайное значение насчет варнинга... а смысл? может ты специально так задумал. |
| Автор: DeadMan83 21.2.2006, 17:24 | ||
в том то и фишка что значение во втором случае (когда выдаеться сообщение) не случайно (0x0000001). гораздо чаще возникает необходимость сделать чтото типа if(a = proc(b)){...} причем сдесь-то варнинг выдаеться. интересно как выделять char динамически не зная какая будет длина строки? да и 255 - это не так уж и много |
| Автор: Fin 21.2.2006, 17:30 |
| Попробуй переписать функцию ввода с клавиатуры. Выделяеш например под буффер ввода 64 байта, устанавливаеш счетчик введенных символов, как только счетчик дошел до предела, расширяй буфер (realloc). Как правило расширяют размер буфера в два раза. В VC в дебаг режиме, все переменные сразу иницилизируются кодом 0xCC. Иницилизация прописана автоматически. |
| Автор: _hunter 21.2.2006, 17:39 | ||||
ты значение переменной смотри до _выполнения_ следующей _комманды_.
а если ты планируеш позже эту переменную инициализировать ( да еще и по условию ( да еще и не в одном месте ) )? ты этк проверку себе представляеш? |
| Автор: DeadMan83 21.2.2006, 17:42 | ||||||||
а зачем изобретать велосипед? не лучше ли воспользоваться тем что уже написано и оттестировано, STL например;)
в VC все хорошо обрабатывает, проверял и там, выдает ошибку что произошло обращение к неинициалезированной переменной, что собственно и ожидалось. А вот в Builder все не так. Добавлено @ 17:46
имелось виду выдавать варнинг при обращении к переменной (получения ее значения) ДО ее инициализации.
значение я смотрю когда еще выполнение "cin>>ch" не началось. (брейкпоинты ставить умею) |
| Автор: _hunter 21.2.2006, 17:56 | ||
следующая _команда_ это int a
это варниг ты можеш ( и должен ) сам реализовать... |
| Автор: chwind 21.2.2006, 18:04 |
| это варнинг есть W8013 Possible use of 'identifier' before definition Compiler warning |
| Автор: DeadMan83 21.2.2006, 18:06 | ||||
| int a - это не команда (попробуй поставить брейкпоинт, посмотреть в режиме дизасма. а вот int a= 1; - уже команда. согласен что вызов cin>>ch сложно анализировать и VC ксатит ту варнинг не выводит. но вот попробуй такой код
и варнинг тут как тут
|
| Автор: Vyacheslav 21.2.2006, 18:07 |
| Стандарт не требует инициализировать указатели с помощью Null или с помощью чего либо еще. Так что виноваты руки, а не компилятор. Borland здесь ничего не нарушает |
| Автор: Fin 21.2.2006, 18:08 | ||||
Единственное как я вижу этот варнинг, это только на стадии компиляции. Да и то, оно им надо (разработчикам). Пример:
Тут в принципе неизвестно что будет. И отследить данный трюк компилятору очень сложно. С ссылками намного проше, если программа пытается лезть в запрешенную зону, тут же синий экран смерти проги. |
| Автор: chwind 21.2.2006, 18:11 |
| Fin, зайди в настройки проекта и включи соответствующий варнинг (W8013) после чего компилятор билдера (да и VC тоже) легко |
| Автор: DeadMan83 21.2.2006, 18:13 | ||||||
сложно но можно. VC (как оказалось и Builder) отслеживает и варнинг выдает.
а зачем тогда вообще варнинги??? по мне так чтоб предупредить программиста, что возможно в коде ошибка. |
| Автор: Fin 21.2.2006, 18:18 |
| Я привел пример в лоб. Если пустить кучу ветвлений (switch), то или Вы компилятор, или компилятор Вас. |
| Автор: Vassik 21.2.2006, 21:39 |
| Всем спасибо и со всей критикой согласен, только вот то что в одном случае все зашибись, а в другом ошибка, все таки я думаю на совесте компилятора |
| Автор: Romikgy 22.2.2006, 09:49 | ||||
Читай по одному символу и каждый раз увеличивай динамический массив
STL не является стандартом С++, если я не прав пусть гуру поправят |
| Автор: _hunter 22.2.2006, 11:23 |
| стандартом -- нет, стандартной библиотекой -- да |
| Автор: Romikgy 22.2.2006, 12:18 |
| |
| Автор: Vyacheslav 22.2.2006, 12:59 |
| Требования к STL описаны в стандарте языка в главе 17 и она обзывается там как С++ Standard Library и следовательно входит в стандарт |