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

Тип bool, ошибка обработки

28.09.2013, 01:25. Показов 2794. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
при вводе любого значения отличного от 0 или 1 тело в условии выполняется, т.е. введённое число 100 в type генерирует исключение:
C++
1
2
3
4
bool type;
cin>>type;
if(type!=0 && type!=1 || !cin.good())
       {throw "error";}
а в конструкторе структуры он действительно распознает тип как 0=0 и 1=всё отличное от нуля, и при вводе в конструктор,например, type0=100 исключение не срабатывает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct cleat{     //type: 0 = OUTPUT , 1 = INPUT
    bool type;
    int connections;
    char state;
    cleat(bool type0=1, int c0=1, char state0='x'):type(type0),connections(c0),state(state0)
    {
        if(type0!=0 && type0!=1)
           throw "Illegal input for cleat type";
        ...
    }
    
};
хочется сделать тип bool действительно булевым, чтобы в констукторе структуры жестко пресекались попытки записи рода type0=100, при этом оставив тип переменной type как bool.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2013, 01:25
Ответы с готовыми решениями:

как правильно понять тип bool ? bool true(const string &str) и что дает это значение ?
задам может глупый вопрос, но прошу ответить. как правильно понять тип bool ? bool true(const string &str) и что дает это...

Тип BOOL
Что API функции возвращают в качестве TRUE? 1? Или любой не 0?

Поменять тип на bool
Не знаю как переделать программу на тип бул , помогите плиз , нужно что бы было как то полегче типо написать что бы короче было и понятней...

8
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 01:46
Можно как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct cleat{     //type: 0 = OUTPUT , 1 = INPUT
    bool type;
    int connections;
    char state;
    cleat(bool type0 = 1, int c0 = 1, char state0 = 'x') : connections(c0), state(state0)
    {
        if(type0 != 0 && type0 != 1)
           throw "Illegal input for cleat type";
        else if (type0 == 1) type = true;
        type = false;
        ...
    
};
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
28.09.2013, 10:36
freakz, вы хотите странного. Это стандартное поведение языка, булев тип имеет только два значения - true и false. Запись bool f = 100 возможна потому, что int приводится к bool. Такое правило - все числа, отличные от нуля, превращаются в true. И если вы булеву переменную сравниваете с числом, то число тоже будет сначала приводиться к bool, а затем эти два булевых значения будут сравниватья. То есть:
C++
1
2
3
4
5
6
bool type = 100;
type == 1;  // истинно
type == 1000; // истинно
type == true; // истинно
type == 0; // ложно
type == false; // ложно
Если вы хотите, чтоб можно было присваивать только true и false (а не 1 и 0 - это целочисленные, а не булевы литералы), то вам нужно пользоваться каким-нибудь другим языком, имхо.
alsav22, вам не кажется, что ваш код не имеет смысла?
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.09.2013, 10:43
да у вас там cin потом просто портится и cin.good() == false.
почему так - выше уже объяснили. 1 или 0 нужен. возможно при установки флажков всяких начнет хавать "true" и "false".
0
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 15:27  [ТС]
спасибо, описание типа bool я знаю, просто интересует возможность существования записи такого типа, который будет содержать лишь true или false без приведения int к bool, чтобы этот тип занимал минимум памяти. Почему тогда в конструкторе все кроме нуля - true, а в cin.good пишется false из-за введения числа, отличного от 0 или 1, хотя по логике любое отличное от нуля число должно преобразоваться в true и ввод должен стать успешным???
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 16:29
Цитата Сообщение от zenw Посмотреть сообщение
alsav22, вам не кажется, что ваш код не имеет смысла?
Согласен, тупанул, не учёл неявное приведение типов.

Добавлено через 8 минут
Цитата Сообщение от DU Посмотреть сообщение
да у вас там cin потом просто портится и cin.good() == false.
Если там проверку cin убрать, всё равно будет так же работать.

Добавлено через 4 минуты
Тут, возможно, что-то с работой cin связано.

Добавлено через 3 минуты
Т.е., если так написать:
C++
1
2
3
4
5
bool type = 100;
if(type != 0 && type != 1)
{
     throw "error";
}
, то исключения уже не будет.
0
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 16:37  [ТС]
а мне желательно ограничиться только двумя значениями - ноль или один.Иначе получается, что часть программы, отвечающая за ввод с потока, работает правильно и фильтрует всё, кроме 0 и 1, а другая её часть, отвечающая за заполнение переменной через конструктор, принимает любые целочисленные значения, что есть непорядок. Суть остаётся той же, но пользователь может инициализировать type любым числом, а надо ли это
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 17:26
Значения для конструктора откуда берутся? Может где-нибудь раньше отсеивать, до предачи в конструктор?

Добавлено через 44 минуты
Цитата Сообщение от freakz Посмотреть сообщение
чтобы в констукторе структуры жестко пресекались попытки записи рода type0=100, при этом оставив тип переменной type как bool.
Цитата Сообщение от freakz Посмотреть сообщение
чтобы этот тип занимал минимум памяти.
Самое простое решение для этого - передавать в конструктор int. Не знаю только, насколько это подходит для решения общей задачи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct cleat
{     
    bool type;
    int connections;
    char state;
    cleat(int type0 = 1, int c0 = 1, char state0 = 'x') : connections(c0), state(state0)
    {
        if(type0 != 0 && type0 != 1)
           throw "Illegal input for cleat type";
        else if (type0 == 1) type = true;
             else type = false;
    }
 };
1
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2013, 17:55
freakz, а все остальные методы класса cleat будут в итоге выглядить так?
C++
1
2
3
4
5
6
7
8
9
void cleat::foo()
{
  if (type) {
    // ...
  }
  else {
    // ...
  }
}
Может полиморфизмом лучше разрулить?

А по поводу решения int -> bool конверсии, можно сделать небольшую функцию
C++
1
2
3
4
5
6
7
bool int_to_bool(int i_value)
{
  if (i_value < 0 || i_value > 1) {
    throw std::exception("error int to bool");
  }
  return static_cast<bool>(i_value);
}
И вызывать ее везде, где нужно такое преобразование
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2013, 17:55
Помогаю со студенческими работами здесь

Тип bool. Логические выражения
По правилам этикета при приветствии «Доброе утро» говорят только с 8:00 до 10:59, «Добрый день» — с 11:00 до 17:59, «Добрый вечер» — с...

Тип bool возвращает 1,а не true
Задание: Даны числа A, B, C (число A не равно 0). Рассмотрев дискриминант D = B2 − 4·A·C, вернуть значение true, если квадратное...

Почему компилятор не понимает тип bool?
#include &lt;stdio.h&gt; #include &lt;iostream .h&gt; #include &lt;fstream.h&gt; #include &lt;iomanip.h&gt; #include &lt;math.h&gt; #include &lt;string.h&gt; ...

Обработка ошибок cin (тип bool)
Доброго времени суток. Собственно, проблема. Надо поймать все ошибки при вводе в тип bool: буквы, ентеры, пробелы, цифры, отличные от 0 и...

Можно ли каким-то образом наследовать тип bool
Здраствуйте, можно ли каким то образом наследовать тип bool типо что бы 1 - man типо что бы 0 - woman что то в таком роде: class...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru