Форум программистов, компьютерный форум CyberForum.ru

Странная инструкция)) - C++

Восстановить пароль Регистрация
 
VorobeY1326
Ученик 11 класса)
 Аватар для VorobeY1326
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
15.07.2009, 21:56     Странная инструкция)) #1
Доброго времени суток!
Смутила функция, приведенная в примере одной книжки:
C++
1
2
3
4
5
6
7
 
int stringparcer::get_int()
{
        char *p = get();
        return atoi(p);
        delete [] p;
}
Может ли после return atoi(p); находится какая либо инструкция??
Мне казалось, что после этой инструкции функция передает управление в main()..
Или я не прав?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2009, 21:56     Странная инструкция))
Посмотрите здесь:

C++ Странная формула.
C++ инструкция if
Странная запись: 1L C++
C++ Инструкция break
C++ Странная ошибка
C++ Вычислить квадраты четных чисел 0 . 100, инструкция for
C++ Странная ошыбка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 22:12     Странная инструкция)) #2
VorobeY1326, вы правы.. за исключением того, что управление передается не функции main() а вызывающей функции ( той функции, из которой данная была вызвана )

но в вашем коде есть ошибка...
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
15.07.2009, 22:16     Странная инструкция)) #3
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Может ли после return atoi(p); находится какая либо инструкция??
нет. то ошибка.

Добавлено через 3 минуты 9 секунд
уже лучше так сделать
C++
1
2
3
4
5
6
7
8
int stringparcer::get_int()
{
       // char *p = get();
        char p[20];
        strcpy(p, get());
        return atoi(p);
        //delete [] p;
}
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Смутила функция, приведенная в примере одной книжки:
выкинь ту книгу.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16934 / 5339 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
15.07.2009, 22:16     Странная инструкция)) #4
VorobeY1326, данный пример даёт повод задуматься на предмет того, что может быть книгу "в печь"?
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
15.07.2009, 22:16     Странная инструкция)) #5
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
Может ли после return atoi(p); находится какая либо инструкция??
Находиться может. Только выполняться она не будет. Ибо
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
...после этой инструкции функция передает управление в ...
Только не в мейн, а вызывающую функцию.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.07.2009, 23:14     Странная инструкция)) #6
а в чем собсно ошибка, если и ошибка, то только логическая
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 23:33     Странная инструкция)) #7
alex_x_x, ошибка в
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
C++
1
char *p = get();
так делать нельзя
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.07.2009, 00:08     Странная инструкция)) #8
не понял, чтобы применить atoi надо скопировать строку?
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 00:23     Странная инструкция)) #9
alex_x_x, указатель не проинициализирован.. т.е. он указывает на случайную область памяти.. и может стереть и записать данные в область, используемую другой программой (хоть ось и пытается предотвратить это.. но риск все равно существует)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.07.2009, 00:26     Странная инструкция)) #10
ну другой программы допустим не может, не в век реальной памяти живем, и почему не инициализирован если get() возвращает указатель на некоторую строку
Search..
Заказ софта
 Аватар для Search..
339 / 184 / 10
Регистрация: 26.05.2009
Сообщений: 863
16.07.2009, 00:31     Странная инструкция)) #11
Ага, все, что стоит после оператора return - игнорируется..
interferent
5 / 4 / 0
Регистрация: 15.07.2009
Сообщений: 7
16.07.2009, 04:19     Странная инструкция)) #12
Подозреваю, что они хотели примерно такого:
C++
1
2
3
4
5
6
7
int stringparcer::get_int()
{
        char *p = get();
        int i=atoi(p);
        delete [] p;
        return i;
}
И компиляторы часто предупреждают: unreachable code.... :-)
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:26     Странная инструкция)) #13
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16934 / 5339 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
16.07.2009, 10:32     Странная инструкция)) #14
Цитата Сообщение от Gravity Посмотреть сообщение
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup). Или get это какая-то стандартная вещь (просто я что-то про такое не слышал)?
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:50     Странная инструкция)) #15
Цитата Сообщение от Evg Посмотреть сообщение
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup).
Тоже вариант. Для разъяснений пожалуй нужно обратиться к текстам упомянутой книги.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16934 / 5339 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
16.07.2009, 10:57     Странная инструкция)) #16
Кстати, а не был ли данный пример в разделе типа "как НЕ надо писать программы"?
VorobeY1326
Ученик 11 класса)
 Аватар для VorobeY1326
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
16.07.2009, 13:15  [ТС]     Странная инструкция)) #17
Спасибо всем, кто участвовал в обсуждении!
Я понял, что функция корявая..) Перехожу на Страуструпа..)

Насчет указателя *р вы правы, предполагалось, что функция stringparser::get() возвращает указатель, предоставляя пользователю очистить память самому.

насчет "но в вашем коде есть ошибка..." - код не мой, ошибку понял.)

То есть функция работает даже, и работает относительно правильно, но НЕ очищает память и компилятор выдает пару предупреждений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2009, 13:44     Странная инструкция))
Еще ссылки по теме:

Инструкция SWITCH C++
C++ Странная(или не странная, незнаю) реакция на буквы, знаки операций
Странная штука C++
C++ Есть ли инструкция по использованию std::regex
Странная функция C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Paulie
Айхрень...
 Аватар для Paulie
306 / 174 / 4
Регистрация: 02.06.2009
Сообщений: 1,078
16.07.2009, 13:44     Странная инструкция)) #18
VorobeY1326, а позвольте узнать - что за книжка (автор, название, глава и страница где была ошибка).
Yandex
Объявления
16.07.2009, 13:44     Странная инструкция))
Ответ Создать тему
Опции темы

Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru