С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 22.07.2016
Сообщений: 16

Объясните, на что ругается компилятор, и как это понимать?

22.07.2016, 23:12. Показов 2930. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане.
Изучаю материал "Принципы и практика использования C++" Страуструпа.
Остановился на главе "Ошибки".
А именно не могу разобраться с примером, связанным с исключениями.
Вот текст программы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void error(string s)
{
    throw runtime_error(s);
}
 
int main()
try {
    vector<int> v;
    int x;
    string s = "Ошибка";
    while (cin>>x) v.push_back(x);
    if (!cin) error("Ошибка");
    for (int i = 0; i<=v.size(); ++i) cout << "v[" << i << "] == " << v[i] << endl;
}
//catch (out_of_range)
//{
//  cerr << "Ой! Ошибка диапазона!\n";
//  return 1;
//}
catch (exception& e)
{
    cerr << "runtime error: " << e.what() << '\n';
    return 1;
}
catch (...)
{
    cerr << "Ой: неизвестное исключение!\n";
    return 2;
}
Компилятор выдаёт ошибку
.
Но стоит поменять строку
C++
1
if (!cin) error("Ошибка");
на
C++
1
if (!cin) error(s);
, как компиляция проходит успешно.
Также я думаю, стоит упомянуть, что определение функции "error()" производится в заголовочном файле "std_lib_facilities.h" вот так вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inline void error(const string& s)
{
    throw runtime_error(s);
}
 
inline void error(const string& s, const string& s2)
{
    error(s+s2);
}
 
inline void error(const string& s, int i)
{
    ostringstream os;
    os << s <<": " << i;
    error(os.str());
}
Объясните пожалуйста, почему компилятор так реагирует на разницу между передачей аргумента в виде строки и в виде строковой переменной?

P.S. Пользуюсь Dev-C++.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2016, 23:12
Ответы с готовыми решениями:

Задача - Кольца. Кто сможет, объясните мне , как это понимать?
Дано M колец с равными радиусами, расположенными таким образом, что они образуют цилиндр, каждое имеет N шариков (N&gt;=3 , M &gt;=3 )...

Это как понимать? Забанили что ли?
Вчера навел на сайте порядок, облегчил шаблон, убрал кучу спама вместе со всеми комментариями, которые там были. Добавил сайт в панель...

Что это такое? Как понимать этот код?
temp_hpt := copy(temp_hpt,4,11); Пожалуйста подскажите как понимать, что здесь написано, что происходит при выполнении этого кода?

48
0 / 0 / 0
Регистрация: 22.07.2016
Сообщений: 16
24.07.2016, 17:51  [ТС]
Студворк — интернет-сервис помощи студентам

Это всё "std_lib_facilities.h" делает.
Вот ссылка на него. Скачать не получается почему-то. Создаётся файл текстовый. Кидается в него текст, сохраняется как std_lib_facilities.h и подключается через "#include". И будет и ошибка в моём примере, и исключение будет.

P.S. Автор просит использовать этот заголовочный.
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
24.07.2016, 17:53
Работает для int в Visual Studio Community 2015, у тебя свой max int может быть другой
C++
1
2
3
int a = 4444774;
    int b = a;
    cout << b*a;
Добавлено через 29 секунд
mikhalxaos, Посмотри год издания книги
0
0 / 0 / 0
Регистрация: 22.07.2016
Сообщений: 16
24.07.2016, 17:54  [ТС]
Есть)
Если перемножить два больших положительных числа и результат "не влезет" в int, то будет переполнение и "а" будет отрицательным. Так?)
Это точно. Не подумал. Спасибо. Мелочь, а приятно.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.07.2016, 17:55
А, там какой-то свой вектор, а не std::vector.
Тогда понятно.
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
24.07.2016, 17:57
C++
1
2
3
4
5
6
7
vector<int> v(3);
    try {
        cout << v.at(4); //если заменить на v[4], то ошибку заметит только отладчик и catch не сработает, следовательно [] исключение не бросает.
    }
    catch (out_of_range a) { 
        cout << "Выход за пределы!";
    }
Добавлено через 54 секунды
mikhalxaos, В программировании надо мозгом маленько за пределы математики вылезать, тут свои правила есть еще)
1
0 / 0 / 0
Регистрация: 22.07.2016
Сообщений: 16
24.07.2016, 18:00  [ТС]
Хорошо, всем спасибо. Будем стараться вылезать за пределы математики и не вылезать за пределы векторов.
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
24.07.2016, 18:05
mikhalxaos, Удачи)
0
Заблокирован
24.07.2016, 18:45
Цитата Сообщение от mikhalxaos Посмотреть сообщение
Но, обрати внимание, что я использую заголовочный "std_lib_facilities.h"(забыл в текст проги вставить) вместо списка, который у тебя. Я в сообщении упомянул что функция error определена как в моём файле, так и в этом заголовочном.
- и чё?Т.е ты хочешь чтобы у тебя в коде аттачилось ещё вот это http://www.stroustrup.com/Prog... cilities.h ? http://codepad.org/qBk8jocq - т.е ты понял что по коду std_lib_facilyties уже есть претензии ну да ладно подправим их плюс для особо непонятливых компиллер пишет вот это
error: call of overloaded 'error(const char [13])' is ambiguous
compilation terminated due to -Wfatal-errors.
итак идём к вот этому коду http://codepad.org/DpAq5slJ (там уже всё исправлено, хотя конечно я сомневаюсь чтобы Страустурп написал условие unsigned int i < 0, ну да ладно). Так вот что ты там сказал, у тебя всё аналогично без кавычки после мэйна, ну давай покажи мне это http://codepad.org/rKlxzlHZ

Добавлено через 1 минуту
Правилось вот так вобщем error(string("Ошибка")); (т.е задаём конкретную реализацию перегруженной функции), на счёт всего остального, конечно же без скобки после мэйна работать не будет, сказки конечно можно рассказывать долго, факты просто другие.

Не по теме:

(м.б ты фейк/клон угги? :))

0
0 / 0 / 0
Регистрация: 22.07.2016
Сообщений: 16
24.07.2016, 18:56  [ТС]
С трудом понял, что тебе показать.
Да, я сам уже начинаю понимать что этот std_lib_facilyties какие то неясности в моё обучение вводит.
Притом что я его прочитать его затрудняюсь из недостатка знаний.
Насчёт фигурной скобки после main() в этом коде http://codepad.org/rKlxzlHZ.
1 вариант - это вставить скобку после main() перед try.
2 вариант - это убрать самую последнюю скобку, а "return 0" переместить в конец блока try{}.
В обоих вариантах на моей Dev-C++ работает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.07.2016, 19:12
Цитата Сообщение от mikhalxaos Посмотреть сообщение
У Страуструпа в книге блок try{}начинается сразу после названия функции(в нашем случае main());
есть такой особый синтаксис (называется function-try-block),
который позволяет объявить ловушку исключений не внутри функции,
а совместить такое объявление с объявлением самой функцией.
или с конструктором.

с конструктором есть некоторые нюансы:

http://rextester.com/UYK20591
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
 
 
struct base
{
    base():m_var()
    {
        m_var.at(10);
    }
    
    std::vector<int> m_var;
};
 
struct sample: base
{
    // пример-иллюстрация 'function-try-block' для конструктора
    sample() try: base() {
        
        std::cout <<"body of sample`s constructor\n";
    
    }
    catch (const std::exception& e)
    {
        std::cout << "поймали исключение в конструкторе: " << e.what() << std::endl;
        
        std::cout << "\nВАЖНО!!! имейте ввиду, что даже если мы смогли "
                     "поймать исключение в конструкторе\n"
                     "и обработали его - мы все равно не сможем сохранить объекту жизнь\n"
                     "исключение все равно пролетит дальше\n"
                     "если снаружи не стоит ловушка - приложение погибнет"
                  << std::endl;
    }
};
 
 
// пример-иллюстрация 'function-try-block' для обычной функции
int main() try {
    
    try 
    {
        std::cout << "создаю объект... сейчас вылетит птичка..." << std::endl;
        sample s;
    }
    catch (const std::exception& e)
    {
        std::cout << "поймали птичку вылетевшую из конструктора!" << std::endl;
    }
     
    std::cout <<"\n\nтеперь ловим исключение в обычной функции..." << std::endl;
    
    std::vector<int> v;
    v.at(10);
    return 0;
}
catch (const std::exception& e)
{
    std::cout << "поймали исключение в функции main\n";
    std::cout << "main catched exception: " << e.what() << '\n';
    return 1;
}

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

ну и самое главное: если исключение полетело из конструктора,
то уже нет возможности сохранить ему жизнь.
никакие ловушки его уже не спасут.
1
Заблокирован
24.07.2016, 19:18
mikhalxaos, я тебе сказал что правится всё вот так
Цитата Сообщение от Unknownx Посмотреть сообщение
error(string("Ошибка")); (т.е задаём конкретную реализацию перегруженной функции),
, в остальном я думаю не грузить тебя инфой, т.к явно не понимаешь что такое
C++
1
2
3
main(){
    try{}catch(...){}
}
и
C++
1
2
3
4
5
6
main() try{
 
}
catch(...){
 
}
, т.е не думаю что уловишь суть, раз такие простые вещи ещё тебе не очевидны
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.07.2016, 19:20
Цитата Сообщение от hoggy Посмотреть сообщение
с конструктором есть некоторые нюансы
Не только с конструктором, но и с деструктором:
The currently handled exception is rethrown if control reaches the end of a handler of the function-try-block of a constructor or destructor. Otherwise, a function returns when control reaches the end of a handler for the function-try-block (6.6.3). Flowing off the end of a function-try-block is equivalent to a return with no value; this results in undefined behavior in a value-returning function (6.6.3).
1
Заблокирован
24.07.2016, 19:22
Цитата Сообщение от mikhalxaos Посмотреть сообщение
В обоих вариантах на моей Dev-C++ работает.
- ну и чтобы быть до конца честным, не ври пожалуйста(по крайней мере людям это читающим), хотя чёрт с ним, какая у тебя версия дев-с?Скачаю гляну как она такое безобразие как main try{}catch(){}catch(...){} пропустить может
Миниатюры
Объясните, на что ругается компилятор, и как это понимать?  
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
24.07.2016, 19:22
hoggy, Толково все расписали
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.07.2016, 19:26
Цитата Сообщение от Croessmah Посмотреть сообщение
Не только с конструктором, но и с деструктором:
о да, точно.
про деструктор я забыл.

правда мне не понятно, какой смысл от этой конструкции в деструкторе то?
успеть заллогировать, что сейчас процессу приключится секир-башка?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.07.2016, 19:32
Цитата Сообщение от hoggy Посмотреть сообщение
правда мне не понятно, какой смысл от этой конструкции в деструкторе то?
успеть заллогировать, что сейчас процессу приключится секир-башка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Test
{
    
    ~Test() try{
        throw 1;
    }catch(...){//Исключение вылетит из деструктора
        return;
    }//только если дойдем до сюда, а мы не дойдем, т.к. return
};
 
int main()
{
    Test t;
}//Не получим исключения из деструктора
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.07.2016, 19:40
Цитата Сообщение от Croessmah Посмотреть сообщение
только если дойдем до сюда, а мы не дойдем, т.к. return
я различаю два кейса:
1.
когда эксепшен вылетает из нашего диструктора.
мы можем внутри поставить ловушку,
и все будет ок.
это то, что описали вы.

но это тоже самое,
как если бы ловушка стояла внутри функции.

2.
вообще то киллер-фича function-try-block
заключается жеж в том, что можно выловить эксепшены,
которые просыпались из базовых классов:

http://rextester.com/NVWD77994


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//g++  4.9.3
 
#include <iostream>
 
struct Base
{
    ~Base(){ throw 1; }
};
 
 
struct Test: Base
{
    
    ~Test() try{
        std::cout <<"ok\n";
    }catch(...){//Исключение вылетит из деструктора
        return;
    }// и мы умрем. никакой return нас не спасет
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    Test t;
} // до сюда мы уже не дойдем
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.07.2016, 19:44

Не по теме:

Unknownx, ошибка permission denied :D



Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вообще то киллер-фича function-try-block
заключается жеж в том, что можно выловить эксепшены,
которые просыпались из базовых классов:
Добавьте вывод в catch
C++
1
2
3
4
catch(...){
        std::cout << "x" << std::endl;//Этого мы не увидим :)
        return;
    }
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.07.2016, 19:47
Цитата Сообщение от Croessmah Посмотреть сообщение
Добавьте вывод в catch
а ну да... блин.
деструктор же базы выполняется после деструктора наследника.

ну тогда я вообще не понимаю, в чем профит для деструктора)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.07.2016, 19:48
hoggy,
If a return statement appears in a handler of the function-try-block of a constructor, the program is ill-formed.
в конструкторе нас точно ничего не спасет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2016, 19:48
Помогаю со студенческими работами здесь

Что значит условие окончания цикла i<=x/i? Как это понимать?
Вот простой пример из книжки, который возвращает true, если x простое число: public bool IsPrime(int x) { if(x&lt;=1) return false; ...

Почему компилятор ругается на то, что else относится к if?
Kомпилятор ругается на то,что else относится к if 'else' without a previous 'if' Вот собственно код: #include &lt;stdio.h&gt; ...

Не могу понять на что ругается компилятор
Задание такое: Нужно написать программу для обработки информации о предлагаемых к продаже автомобилей. Информация включает следующие...

Как быть с "\", если компилятор ругается, что отсутствует закрывающая скобка в регулярке
Допустим я задаю некий путь в программе строкой: string pat = &quot;D:\\Downloads\\&quot;; И хочу ее потом в регулярку затолкать: ...

Компилятор ругается, не разрешенная внешняя ссылка, что не так?
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int Resistance( int n); int n =0; int main() ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru