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

 
 
> bool "третье состояние"
HEX
сообщение Jul 22 2009, 07:34
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Код
#include <stdbool.h>

int main()
{
  bool B;
  B = 13;                      //B = 1
  B = !B;                      //B = 0
  
  unsigned char* Ptr;
  Ptr = (unsigned char*)(&B);
  *Ptr = 13;                   //B = 13
  
  bool B2;
  B2 = B;                      //B2 = 12
  B2 = !B;                     //B2 = 13
  return 0;
}

Почему при присваивание непосредственно числа все нормально ( B = 13 ), а при присваивании другово bool ( B2 = B ) мусор остается?
Так и должно быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Oldring
сообщение Jul 22 2009, 08:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(HEX @ Jul 22 2009, 11:34) *
Ptr = (unsigned char*)(&B);
*Ptr = 13; //B = 13

...

Так и должно быть?


Явное преобразование типов указателей - это всегда очень опасная операция с возможно непредсказуемыми побочными эффектами. Ответственность за правильный результат лежит целиком на программисте, который должен понимать что делает. Компилятор же больше ни за что не отвечает. Если Вы не понимаете что хотите сделать и как будет результат интерпретирован - зачем пользуетесь такой опасной операцией? Взяли спички в руки, поигрались и удивляетесь, откуда пожар...


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
HEX
сообщение Jul 22 2009, 10:28
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



я в этом вижу потенциальную проблему, например, при чтении бинарного файла данных.Придется производить доп. операции, что бы избавиться от мусора:
Код
  //data.bin = {0x0D, 0x00, 0x00, 0x00}
  f = fopen("data.bin", "r");
  fread(&B, sizeof(B), 1, f); //B = 13
  fclose(f);
  //Избавляемся от мусора
  if (B)
    B = true;
  else
    B = false;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 22 2009, 11:11
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(HEX @ Jul 22 2009, 13:28) *
я в этом вижу потенциальную проблему, например, при чтении бинарного файла данных.Придется производить доп. операции, что бы избавиться от мусора:
Естественно придется. Но несколько иначе:
Код
  //data.bin = {0x0D, 0x00, 0x00, 0x00}
  f = fopen("data.bin", "r");
  uint8_t Tmp;
  fread(&Tmp, sizeof(Tmp), 1, f);
  B = Tmp;
  fclose(f);
Все. Компилятор знает, как преобразовать внутреннее представление uint8_t во внутреннее представление bool. Не надо мешать ему, пытаясь сделать его работу через неявное преобразование при помощи указателей. А если в вашем компиляторе bool будет 32 бита, что вы считаете из файла вашим методом?


Цитата(HEX @ Jul 22 2009, 11:56) *
Если бы не мешали я бы может и не заметил:
Код
//B = 13
  if (B == true)
    printf("true\n");
  else
    printf("false\n");
Еще раз: каким образом вы присвоили B значение 13? Оператором B = 13 вы не можете присвоить переменной типа bool значение, отличное от true и false. Если вы присвоили через указатель на другой тип - это жульничество, и компилятор ведет себя как считает нужным. Ибо запись B = 13 фактически означает B = bool(13), и 13 в B ну никак попасть не сможет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
HEX
сообщение Jul 22 2009, 14:57
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Цитата(Сергей Борщ @ Jul 22 2009, 15:11) *
А если в вашем компиляторе bool будет 32 бита
у меня собственно так и есть, универсальность эта другая тема.

Цитата(Сергей Борщ @ Jul 22 2009, 15:11) *
Если вы присвоили через указатель на другой тип - это жульничество

да жульничество, но интервейс вызова Read(void* Buff, int N) достаточно широко используется, есть и другие варианта попадание мусора в bool. Но проверять значение после подозрительных мест надо обязательно.
Потом такой момент, если используется swtich, пусть даже с параметром enum, все равно в голове помним о левых значениях, которые обработаем default. При работе с bool переменными думается true/false, а там может и вигная какая то быть, причем "заразная", передается присваиванием ( B2 = B1 ).
А явное преобразование B = (bool)( B ) по моему, должно работать четко.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- HEX   bool "третье состояние"   Jul 22 2009, 07:34
- - AHTOXA   Вероятно, компилятор производит преобразования тип...   Jul 22 2009, 07:47
|- - HEX   явное преобразование типа тоже не помогает:КодB2 =...   Jul 22 2009, 08:34
|- - AHTOXA   Цитата(HEX @ Jul 22 2009, 14:34) явное пр...   Jul 22 2009, 08:40
- - Xenia   Цитата(HEX @ Jul 22 2009, 10:34) Почему п...   Jul 22 2009, 08:38
|- - HEX   Цитата(Xenia @ Jul 22 2009, 12:38) Таким ...   Jul 22 2009, 08:56
|- - Xenia   Цитата(HEX @ Jul 22 2009, 11:56) выводит ...   Jul 22 2009, 11:00
||- - KRS   Цитата(Xenia @ Jul 22 2009, 15:00) Это по...   Jul 22 2009, 21:02
|- - tag   Цитата(HEX @ Jul 22 2009, 11:56) Если бы ...   Jul 22 2009, 12:13
||- - Oldring   Цитата(HEX @ Jul 22 2009, 18:57) А явное ...   Jul 22 2009, 15:34
|- - Oldring   Цитата(HEX @ Jul 22 2009, 14:28) я в этом...   Jul 22 2009, 11:17
- - sergeeff   Цитата(HEX @ Jul 22 2009, 11:34) Код#incl...   Jul 22 2009, 17:15
|- - ReAl   Цитата(sergeeff @ Jul 22 2009, 20:15) Суд...   Jul 22 2009, 19:52
|- - Сергей Борщ   Цитата(ReAl @ Jul 22 2009, 22:52) Код b1 ...   Jul 22 2009, 23:27
- - sensor_ua   Использование выражений типа Кодif(a == true...   Jul 23 2009, 08:28


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016