Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 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   Вверх
chwind
Дата 21.2.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



это варнинг есть smile
W8013 Possible use of 'identifier' before definition Compiler warning
PM MAIL   Вверх
DeadMan83
Дата 21.2.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(_hunter @ 21.2.2006, 17:56 Найти цитируемый пост)
следующая _команда_ это int a

int a - это не команда (попробуй поставить брейкпоинт, посмотреть в режиме дизасма.
а вот int a= 1; - уже команда.
Цитата(_hunter @ 21.2.2006, 17:56 Найти цитируемый пост)
это варниг ты можеш ( и должен ) сам реализовать...

согласен что вызов cin>>ch сложно анализировать и VC ксатит ту варнинг не выводит. но вот попробуй такой код

Код

int _tmain(int argc, _TCHAR* argv[])
{
    char *ch;
    a = (int)ch;
    std::cin>>ch;
    std::cout<<ch;
    return 0;
}

и варнинг тут как тут
Цитата

d:\progs\vistestbug\vistestbug.cpp(11) : warning C4700: local variable 'ch' used without having been initialized

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Стандарт не требует инициализировать указатели с помощью Null или с помощью чего либо еще. Так что виноваты руки, а не компилятор.
Borland здесь ничего не нарушает




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Fin
Дата 21.2.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Единственное как я вижу этот варнинг, это только на стадии компиляции. Да и то, оно им надо (разработчикам).
Пример:
Код

int i;
int a=i;

Тут в принципе неизвестно что будет. И отследить данный трюк компилятору очень сложно. С ссылками намного проше, если программа пытается лезть в запрешенную зону, тут же синий экран смерти проги.

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


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


Шустрый
*


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

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



Fin, зайди в настройки проекта и включи соответствующий варнинг (W8013) после чего компилятор билдера (да и VC тоже) легко smile будет отлавливать подобные обращениия с переменными
PM MAIL   Вверх
DeadMan83
Дата 21.2.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fin @ 21.2.2006, 18:08 Найти цитируемый пост)
Пример:

Код
Код

int i
int a=i;


Тут в принципе неизвестно что будет. И отследить данный трюк компилятору очень сложно. С ссылками намного проше, если программа пытается лезть в запрешенную зону, тут же синий экран смерти проги

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

Цитата(Fin @ 21.2.2006, 18:08 Найти цитируемый пост)
Единственное как я вижу этот варнинг, это только на стадии компиляции. Да и то, оно им надо (разработчикам)

а зачем тогда вообще варнинги??? по мне так чтоб предупредить программиста, что возможно в коде ошибка.

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


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


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

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



Я привел пример в лоб. Если пустить кучу ветвлений (switch), то или Вы компилятор, или компилятор Вас.


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


Шустрый
*


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

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



Всем спасибо и со всей критикой согласен, только вот то что в одном случае все зашибись, а в другом ошибка, все таки я думаю на совесте компилятора
PM MAIL   Вверх
Romikgy
Дата 22.2.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Читай по одному символу и каждый раз увеличивай динамический массив

Цитата(DeadMan83 @ 21.2.2006, 16:42 Найти цитируемый пост)
не лучше ли воспользоваться тем что уже написано и оттестировано, STL например;)

STL не является стандартом С++, если я не прав пусть гуру поправят


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

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


Эксперт
****


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

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



стандартом -- нет, стандартной библиотекой -- да


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


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


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

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



Цитата(_hunter @ 22.2.2006, 10:23 Найти цитируемый пост)
стандартом -- нет, стандартной библиотекой -- да

smile Отож smile


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

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Требования к STL описаны в стандарте языка в главе 17 и она обзывается там как С++ Standard Library и следовательно входит в стандарт


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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