Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
1

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

15.07.2009, 21:56. Просмотров 1188. Ответов 17
Метки нет (Все метки)

Доброго времени суток!
Смутила функция, приведенная в примере одной книжки:
C++
1
2
3
4
5
6
7
 
int stringparcer::get_int()
{
        char *p = get();
        return atoi(p);
        delete [] p;
}
Может ли после return atoi(p); находится какая либо инструкция??
Мне казалось, что после этой инструкции функция передает управление в main()..
Или я не прав?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2009, 21:56
Ответы с готовыми решениями:

Странная(или не странная, незнаю) реакция на буквы, знаки операций
Всем добрый день. Делаю маленькую наработку, пока есть только начало. Ниже код: #include...

инструкция if
#include <iostream> using namespace std; int main() { std::locale().global(std::locale(""));...

Инструкция SWITCH
Есть программа поиска НОД - работает прекрасно. Нужно сделать выбор 1 - НОД по 2 простым числам 2...

Инструкция break
Эм, балуюсь с C++. Значит, отбираю простые числа, первый вариант программы: #include <iostream>...

17
2806 / 1396 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 22:12 2
VorobeY1326, вы правы.. за исключением того, что управление передается не функции main() а вызывающей функции ( той функции, из которой данная была вызвана )

но в вашем коде есть ошибка...
0
Maniac
Эксперт С++
1445 / 947 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 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 Посмотреть сообщение
Смутила функция, приведенная в примере одной книжки:
выкинь ту книгу.
1
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
15.07.2009, 22:16 4
VorobeY1326, данный пример даёт повод задуматься на предмет того, что может быть книгу "в печь"?
0
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,721
15.07.2009, 22:16 5
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
Может ли после return atoi(p); находится какая либо инструкция??
Находиться может. Только выполняться она не будет. Ибо
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
...после этой инструкции функция передает управление в ...
Только не в мейн, а вызывающую функцию.
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2009, 23:14 6
а в чем собсно ошибка, если и ошибка, то только логическая
0
2806 / 1396 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 23:33 7
alex_x_x, ошибка в
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
C++
1
char *p = get();
так делать нельзя
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:08 8
не понял, чтобы применить atoi надо скопировать строку?
0
2806 / 1396 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 00:23 9
alex_x_x, указатель не проинициализирован.. т.е. он указывает на случайную область памяти.. и может стереть и записать данные в область, используемую другой программой (хоть ось и пытается предотвратить это.. но риск все равно существует)
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:26 10
ну другой программы допустим не может, не в век реальной памяти живем, и почему не инициализирован если get() возвращает указатель на некоторую строку
0
Заказ софта
342 / 187 / 21
Регистрация: 26.05.2009
Сообщений: 863
16.07.2009, 00:31 11
Ага, все, что стоит после оператора return - игнорируется..
1
6 / 5 / 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.... :-)
1
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:26 13
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
16.07.2009, 10:32 14
Цитата Сообщение от Gravity Посмотреть сообщение
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup). Или get это какая-то стандартная вещь (просто я что-то про такое не слышал)?
1
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:50 15
Цитата Сообщение от Evg Посмотреть сообщение
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup).
Тоже вариант. Для разъяснений пожалуй нужно обратиться к текстам упомянутой книги.
1
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
16.07.2009, 10:57 16
Кстати, а не был ли данный пример в разделе типа "как НЕ надо писать программы"?
0
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
16.07.2009, 13:15  [ТС] 17
Спасибо всем, кто участвовал в обсуждении!
Я понял, что функция корявая..) Перехожу на Страуструпа..)

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

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

То есть функция работает даже, и работает относительно правильно, но НЕ очищает память и компилятор выдает пару предупреждений.
0
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,078
16.07.2009, 13:44 18
VorobeY1326, а позвольте узнать - что за книжка (автор, название, глава и страница где была ошибка).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2009, 13:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Инструкция if(.) continue
Объясните пожалуйста как работает эта инструкция на таком примере: #include <bits/stdc++.h>...

Goto и инструкция объявления
Здравствуйте, есть одна программа, которая вызвала у меня вопросы. Читаю книгу Липманна C++ для...

Инструкция if, курс валют
Добрый день. Подскажите, пожалуйста, в чём здесь ошибка? При выборе любого наименования валюты...

Есть ли инструкция по использованию std::regex
Есть какой-то мануальчик по использованию сего чуда в c++11? Ну или подскажите как найти в поле...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.