Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cout,cin 
:(
    Опции темы
Vassik
Дата 21.2.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 31.1.2006

Репутация: нет
Всего: нет



Короче такой вот простенький код в консолевском режиме в Builder -е

int main(int argc, char* argv[])
{char *ch;
//int a;
cin >>ch;
cout << ch;
return 0;
}
Все работает замечательноsmile
Как только раскоментируем переменную ,а вообщем даже неважно какого она типа, то появляется ошибка доступа: "Access violation at adress 32657C73. Write to address 00000001 "
Возможно мой вопрос покажится забавным, но просто не пойму в чем причина, может кто объяснит мне почему возникает такая ошибка?
PM MAIL   Вверх
Romikgy
Дата 21.2.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(Vassik @ 21.2.2006, 14:43 Найти цитируемый пост)
char *ch;

А выделять память под переменную кто будет?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 21.2.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



ошибка в том, что ты память под ch не выделяеш


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
DeadMan83
Дата 21.2.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.2.2006
Где: Минск

Репутация: нет
Всего: нет



Глюк компилятора Borland, визуалка такое сразу не пропускает.

Это сообщение отредактировал(а) DeadMan83 - 21.2.2006, 16:24
PM MAIL WWW ICQ Skype GTalk   Вверх
Romikgy
Дата 21.2.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

int main(int argc, char* argv[])
{char ch[255];
int a;
cin >>ch;
cout << ch;
return 0;
}

smile

Цитата(DeadMan83 @ 21.2.2006, 15:09 Найти цитируемый пост)
Глюк компилятора Borland

неа глюк рук smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
DeadMan83
Дата 21.2.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.2.2006
Где: Минск

Репутация: нет
Всего: нет



Romikgy
а если я введу строку длиной больше 256 символов?smile
твой код тож глючит
Цитата

неа глюк рук

глюк не в том что выдаеться ошибка, а втом что она в первом случае не возникает. Если посмотретькуда указывает ch, то в первом случае указатель равен чтото типа 0x007а21с0, а во втором случае 0x01. Почему в первом случае инициализация не происходи, в отличии от второго - на совести Borland.
PS. А с "ручками" конечно я согласенsmile, указатель надо инициализировать.
кстати вот рабочий код
Код

int main(int argc, char* argv[])
{

 std::string ch;
 std::cin >> ch;
 std::cout << ch;
 return 0;
}

PM MAIL WWW ICQ Skype GTalk   Вверх
_hunter
Дата 21.2.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



локальные переменные никто не обязан ( я имею в виду компилятор ) инициализировать.
поэтому таки руки виноваты


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
DeadMan83
Дата 21.2.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.2.2006
Где: Минск

Репутация: нет
Всего: нет



Цитата(_hunter @ 21.2.2006, 16:47 Найти цитируемый пост)
локальные переменные никто не обязан ( я имею в виду компилятор ) инициализировать.
поэтому таки руки виноват

с тобой нельзя не согласитьсяsmile
вот только хотелось бы однозначности от компилятора, если инициализировать, то уж всегда, или вообще не инициализировать (тоже всегда), чтоб была однозначность. да и варнинг можно было бы сгенерить. программист - тоже человек.

PM MAIL WWW ICQ Skype GTalk   Вверх
Romikgy
Дата 21.2.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



DeadMan83,
Цитата(DeadMan83 @ 21.2.2006, 15:36 Найти цитируемый пост)
а если я введу строку длиной больше 256 символов?

Я это для примера привел, и думаю , что юзер захарится с клавы 255 символов набивать smile
А число можно и другое поставить и динамически выделять smile
Цитата(DeadMan83 @ 21.2.2006, 15:36 Найти цитируемый пост)
Если посмотретькуда указывает ch, то в первом случае указатель равен чтото типа 0x007а21с0, а во втором случае 0x01.

Смысл куда то смотреть при кривом коде?
_hunter, согласен smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 21.2.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(DeadMan83 @ 21.2.2006, 15:55 Найти цитируемый пост)
вот только хотелось бы однозначности от компилятора, если инициализировать, то уж всегда, или вообще не инициализировать (тоже всегда), чтоб была однозначность. да и варнинг можно было бы сгенерить. программист - тоже человек.

так это и есть однозначность -- переменная ВСЕГДА устанавливается в случайное значение smile
насчет варнинга... а смысл? может ты специально так задумал.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
DeadMan83
Дата 21.2.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.2.2006
Где: Минск

Репутация: нет
Всего: нет



Цитата(_hunter @ 21.2.2006, 17:06 Найти цитируемый пост)
так это и есть однозначность -- переменная ВСЕГДА устанавливается в случайное значение

в том то и фишка что значение во втором случае (когда выдаеться сообщение) не случайно (0x0000001).

Цитата(_hunter @ 21.2.2006, 17:06 Найти цитируемый пост)
насчет варнинга... а смысл? может ты специально так задумал

smile задумал получитиь значение от неинициализированной переменной? чтото не придумываеться такого случая.
гораздо чаще возникает необходимость сделать чтото типа if(a = proc(b)){...} причем сдесь-то варнинг выдаеться.
Цитата(Romikgy @ 21.2.2006, 16:58 Найти цитируемый пост)
А число можно и другое поставить и динамически выделят

интересно как выделять char динамически не зная какая будет длина строки? да и 255 - это не так уж и много

PM MAIL WWW ICQ Skype GTalk   Вверх
Fin
Дата 21.2.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Попробуй переписать функцию ввода с клавиатуры. Выделяеш например под буффер ввода 64 байта, устанавливаеш счетчик введенных символов, как только счетчик дошел до предела, расширяй буфер (realloc). Как правило расширяют размер буфера в два раза.

В VC в дебаг режиме, все переменные сразу иницилизируются кодом 0xCC. Иницилизация прописана автоматически.

Это сообщение отредактировал(а) Fin - 21.2.2006, 17:33


--------------------
Пролетал мимо.
PM MAIL   Вверх
_hunter
Дата 21.2.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(DeadMan83 @ 21.2.2006, 16:24 Найти цитируемый пост)
в том то и фишка что значение во втором случае (когда выдаеться сообщение) не случайно (0x0000001).

ты значение переменной смотри до _выполнения_ следующей _комманды_.
Цитата(DeadMan83 @ 21.2.2006, 16:24 Найти цитируемый пост)
задумал получитиь значение от неинициализированной переменной? чтото не придумываеться такого случая.

а если ты планируеш позже эту переменную инициализировать ( да еще и по условию ( да еще и не в одном месте ) )? ты этк проверку себе представляеш?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
DeadMan83
Дата 21.2.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.2.2006
Где: Минск

Репутация: нет
Всего: нет



Цитата(Fin @ 21.2.2006, 17:30 Найти цитируемый пост)
Попробуй переписать функцию ввода с клавиатуры. Выделяеш например под буффер ввода 64 байта, устанавливаеш счетчик введенных символов, как только счетчик дошел до предела, расширяй буфер (realloc). Как правило расширяют размер буфера в два раза.

а зачем изобретать велосипед? не лучше ли воспользоваться тем что уже написано и оттестировано, STL например;)

Цитата(Fin @ 21.2.2006, 17:30 Найти цитируемый пост)
В VC в дебаг режиме, все переменные сразу иницилизируются кодом 0xCC. Иницилизация прописана автоматически

в VC все хорошо обрабатывает, проверял и там, выдает ошибку что произошло обращение к неинициалезированной переменной, что собственно и ожидалось. А вот в Builder все не так.
Добавлено @ 17:46
Цитата(_hunter @ 21.2.2006, 17:39 Найти цитируемый пост)
а если ты планируеш позже эту переменную инициализировать ( да еще и по условию ( да еще и не в одном месте ) )? ты этк проверку себе представляеш?

имелось виду выдавать варнинг при обращении к переменной (получения ее значения) ДО ее инициализации.
Цитата(_hunter @ 21.2.2006, 17:39 Найти цитируемый пост)
ты значение переменной смотри до _выполнения_ следующей _комманды_.

значение я смотрю когда еще выполнение "cin>>ch" не началось. (брейкпоинты ставить умею)
PM MAIL WWW ICQ Skype GTalk   Вверх
_hunter
Дата 21.2.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



следующая _команда_ это int a smile
Цитата(DeadMan83 @ 21.2.2006, 16:42 Найти цитируемый пост)
имелось виду выдавать варнинг при обращении к переменной (получения ее значения) ДО ее инициализации.

это варниг ты можеш ( и должен ) сам реализовать...



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.