2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 18:26 
Аватара пользователя


05/06/08
479
Есть подозрение, что что позоимсвованный в сети самописный класс C++ для integer произвольной точности и байтовой длины перемнной имеет некие дефекты, которые выходят боком при инициализации. Самое смешное, что два алгоритма, написанные под этим классом работают как часы. С использованием визуального контроля с изображениями png.
А вот стоило мне что-то модифицировать в этом контроле, и полезли всякие бяки.

-- Чт ноя 10, 2022 19:32:14 --

TheRuinedMap в сообщении #1569647 писал(а):
mihaild в сообщении #1569637 писал(а):
Покажите более содержательный кусок кода, и без bb тегов. Что такое true(204) - непонятно, это не скомпилируется.


Речь, очевидно, идет не о коде в программе, а об выводе значения переменной в окне дебаггера

Изображение

mihaild в сообщении #1569637 писал(а):
bool в дебагере может показываться как угодно, стандарт ничего про битовое представление true не требует.


Стандарт - не требует. Стандарт говорит, что оно implementation-defined (как, впрочем, и почти все остальные представления), то есть битовое представление будет требовать конкретная реализация. И, разумеется, показываться валидный bool в уважающем себя дебаггере конкретной реализации будет не "как угодно", а как true или false. А вот true(204) в дебаггере MSVC говорит о проблемах...

А почему true(204), а не false(204)?
По смыслу это значение именно false

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 18:34 
Аватара пользователя


28/10/21
103
MGM в сообщении #1569649 писал(а):
Есть подозрение, что что позоимсвованный в сети самописный класс C++ для integer произвольной точности и байтовой длины перемнной имеет некие дефекты, которые выходят боком при инициализации.


Туманных подозрений можно напридумывать много.

Из реального же кода как правило все прекрасно видно. Понятное дело, что если у вас происходит вылет за пределы массива где-то на другом конце программы, то мгновенно увидеть это по коду будет трудно, но если проблема локализована (как вы утверждаете), то все должно выясниться быстро.

-- 10.11.2022, 07:36 --

MGM в сообщении #1569649 писал(а):
А почему true(204), а не false(204)?


Потому что так выводит это значение дебаггер MSVC. Правильнее, конечно, было бы выводить его как undefined (204) или invalid (204).

MGM в сообщении #1569649 писал(а):
По смыслу это значение именно false


Это откуда вы такое взяли? О каком "смысле" вы здесь ведете речь?

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 18:38 
Заслуженный участник
Аватара пользователя


16/07/14
9644
Цюрих
TheRuinedMap в сообщении #1569647 писал(а):
Речь, очевидно, идет не о коде в программе, а об выводе значения переменной в окне дебаггера
Мне не очевидно, что должно быть где-то написано, чтобы это цитировать как
MGM в сообщении #1569536 писал(а):
Код:
if([b]true [/b]&& [b]true(204)[/b]) = false;
Я спросил выше у ТС, о чем там была речь, но ответа пока не получил.
MGM в сообщении #1569649 писал(а):
А почему true(204), а не false(204)?
Потому что отладчик решил каким-то образом оказавшееся в этой ячейке памяти 204 показать как true. Но скорее всего этого числа по этому адресу быть не должно было вообще, поэтому показывать его там как true или false - не очень важно.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 18:48 
Аватара пользователя


05/06/08
479
Выход за границы памяти в MS VS дебагере отслеживается очень точно прерыванием.
А вот если определен некий класс на базе <vector>, это уже трудно отследить.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 19:07 
Аватара пользователя


28/10/21
103
MGM в сообщении #1569652 писал(а):
Выход за границы памяти в MS VS дебагере отслеживается очень точно прерыванием.


Чудес не бывает. Если вы непрерывно перетрете память за пределами локальной переменной, тем самым разрушив "контрольно-следовую полосу" вокруг этой переменной - то это будет поймано отладчиком. Если же вы случайно "застрелите" отдельностоящий чужой байт - поймать это дебаггер не сможет никак.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 20:24 
Аватара пользователя


05/06/08
479
TheRuinedMap в сообщении #1569650 писал(а):
MGM в сообщении #1569649 писал(а):
По смыслу это значение именно false


Это откуда вы такое взяли? О каком "смысле" вы здесь ведете речь?

Чисто функционально. По результату работы.
из bool a == 204 следует, что код рассматривает переменную а, как false.

Ну и код в рассширенном варианте (тело функции даю в явной форме):
Код:
bool equ_y = equal(BQ_LTYPE a = rct_fr[fr_i].qy, BQ_LTYPE b = rct_fl[fl_i].qy)
{
return a.ch == b.ch && a.z == b.z;
}
bool equ_x = equal(BQ_LTYPE a = rct_fr[fr_i].qx, BQ_LTYPE b = rct_fl[fl_i].qx)
{
return a.ch == b.ch && a.z == b.z;
}
if (equ_x  && equ_y) {
      rct_fr[fr_i].qx = set_BQ_LT(0, 1);
      rct_fr[fr_i].qy = set_BQ_LT(0, 1);
      rct_fr[fr_i].tx = set_BQ_LT(0, 1);
      rct_fr[fr_i].ty = set_BQ_LT(0, 1);
      return 0;
   }

Если equ_y == 204 и equ_x == true
То блок
Код:
if (equ_x * equ_y) {
      rct_fr[fr_i].qx = set_BQ_LT(0, 1);
      rct_fr[fr_i].qy = set_BQ_LT(0, 1);
      rct_fr[fr_i].tx = set_BQ_LT(0, 1);
      rct_fr[fr_i].ty = set_BQ_LT(0, 1);
      return 0;
   }

Не выполнялся. После того, как заменил последовательность вычисления
переменных equ_x и equ_y перестановкой строк, все заработало и 204 пропало.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 20:36 
Аватара пользователя


28/10/21
103
MGM в сообщении #1569663 писал(а):
TheRuinedMap в сообщении #1569650 писал(а):
MGM в сообщении #1569649 писал(а):
По смыслу это значение именно false


Это откуда вы такое взяли? О каком "смысле" вы здесь ведете речь?

Чисто функционально. По результату работы.
из bool a == 204 следует, что код рассматривает переменную а, как false.


Я, кажется, детально объяснил вам выше, что "код" может рассматривать такую переменную и как false, и как true, и как ни false, ни true, и как false и true одновременно.

В одном if ваша переменная повела себя как false, а в следующем if в вашем же коде она запросто поведет себя как true. А вы зачем-то прицепились к этому первому if и делаете на его основе какие-то далеко идущие выводы, хотя на самом деле поведение этого if не значит вообще ничего.

MGM в сообщении #1569663 писал(а):
Ну и код в рассширенном варианте (тело функции даю в явной форме):
Код:
bool equ_y = equal(BQ_LTYPE a = rct_fr[fr_i].qy, BQ_LTYPE b = rct_fl[fl_i].qy)
{
return a.ch == b.ch && a.z == b.z;
}
bool equ_x = equal(BQ_LTYPE a = rct_fr[fr_i].qx, BQ_LTYPE b = rct_fl[fl_i].qx)
{
return a.ch == b.ch && a.z == b.z;
}


Это что за язык программирования? Что это за загадочный синтаксис?

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 20:55 
Аватара пользователя


05/06/08
479
TheRuinedMap в сообщении #1569665 писал(а):
В одном if ваша переменная повела себя как false, а в следующем if в вашем же коде она запросто поведет себя как true. А вы зачем-то прицепились к этому первому if и делаете на его основе какие-то далеко идущие выводы, хотя на самом деле поведение этого if не значит вообще ничего.

Вы правы. Я не сильно понимаю, как современный компилятор ассемблирует текст программы. И как этот связано с константами дебагера.

TheRuinedMap в сообщении #1569665 писал(а):

MGM в сообщении #1569663 писал(а):
Ну и код в рассширенном варианте (тело функции даю в явной форме):
Код:
bool equ_y = equal(BQ_LTYPE a = rct_fr[fr_i].qy, BQ_LTYPE b = rct_fl[fl_i].qy)
{
return a.ch == b.ch && a.z == b.z;
}



Это что за язык программирования? Что это за загадочный синтаксис?

Вариант классического С:

Код:
inline bool  equal(BQ_LTYPE a, BQ_LTYPE b)
{
return a.ch == b.ch && a.z == b.z;
}

bool equ_y = equal(rct_fr[fr_i].qy,  rct_fl[fl_i].qy);
bool equ_x = equal(rct_fr[fr_i].qx,  rct_fl[fl_i].qx);

как-то не зашел.
Спасибо всем за полезные советы.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение10.11.2022, 21:25 
Заслуженный участник
Аватара пользователя


16/07/14
9644
Цюрих
Я ставлю на то, что либо fr_i выходит за границу, либо внутри rct_fr что-то не инициализированное.
TheRuinedMap в сообщении #1569665 писал(а):
Я, кажется, детально объяснил вам выше, что "код" может рассматривать такую переменную и как false, и как true, и как ни false, ни true, и как false и true одновременно.
И даже еще хуже. Если компилятор обнаружит, что где-то есть чтение из неинициализированной переменной, то он может спокойно начать выбрасывать случайные блоки кода, вызывать какие придется функции и т.д. (и на практике иногда так делает).

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение11.11.2022, 09:10 


31/08/22
183
mihaild в сообщении #1569672 писал(а):
Я ставлю на то, что либо fr_i выходит за границу, либо внутри rct_fr что-то не инициализированное.

Поддерживаю. Такие же ощущения.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение11.11.2022, 19:12 
Аватара пользователя


05/06/08
479
Понял, что ничего не понял.
Код:
Код:
   bool fls = false;
   memset(&fls, 204, 1);
   int n = fls ? 1 : 0;
   cout << n << endl;
   if (fls) exit(204);


Четко выплевывает процесс со значением n=1;
1

F:\Problem\Release\segment.exe (process 13024) exited with code 204.
То есть в все, как в Букваре.
Значит, в моем коде дебагер неправильно засветил значение переменной.
И на самом деле моя функция сравнения чисел вместо очевидного (по всем другим значениям из того же дебагера) true (!=0) возвращала false (0).
Могила. Ну да ладно, баг купировал горбушкой, и ладно.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение11.11.2022, 19:48 
Заслуженный участник
Аватара пользователя


16/07/14
9644
Цюрих
MGM в сообщении #1569746 писал(а):
Понял, что ничего не понял.
Объясняю: наличие в коде UB означает, что проверка, как он работает, имеет очень мало смысла. Он может стабильно делать одно и то же, и кардинально поменять поведение при смене версии компилятора, машины, или изменении порядка объявления функций в каком-то вообще непонятном месте.
TheRuinedMap в сообщении #1569644 писал(а):
Ничего вы не купировали. Вы просто "спугнули" неопределенное поведение, скорее всего временно.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение11.11.2022, 22:30 
Аватара пользователя


28/10/21
103
MGM в сообщении #1569746 писал(а):
Значит, в моем коде дебагер неправильно засветил значение переменной.


Дебагер "засветил" все правильно. Но вы соврешенно ничего не поняли из тех объяснений, что вам тут приводили. Или даже не читали их?

MGM в сообщении #1569746 писал(а):
И на самом деле моя функция сравнения чисел вместо очевидного (по всем другим значениям из того же дебагера) true (!=0) возвращала false (0).


"...вместо очевидного true (!=0)..." Вы продолжаете пребывать в плену каких-то загадочных инопланетных теорий о том, что такое true... ¯\_(ツ)_/¯

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение15.11.2022, 15:19 
Аватара пользователя


05/06/08
479
mihaild в сообщении #1569752 писал(а):
MGM в сообщении #1569746 писал(а):
Понял, что ничего не понял.
Объясняю: наличие в коде UB означает, что проверка, как он работает, имеет очень мало смысла. Он может стабильно делать одно и то же, и кардинально поменять поведение при смене версии компилятора, машины, или изменении порядка объявления функций в каком-то вообще непонятном месте.
TheRuinedMap в сообщении #1569644 писал(а):
Ничего вы не купировали. Вы просто "спугнули" неопределенное поведение, скорее всего временно.

И чего делать?
Если не принимать во внимание радикальное решение: просто выкинуть позаимствованный из сети класс BigInteger.
Собственно основной алгорим (даже серия алгоритмов) работал и работает правильно. Плюс начальная простая визуализация процесса.
Однако захотелось построить более внятную математическую модель с более детальной визуализацией. И все как-то поехало.
Не принципиально, поначалу.

А теперь вот даже не могу обмануть компилятор в простой передаче (int) параметра.
Код:
float a = 0;
int st =0; while(st++<N)a+=tree(...,..,  st,...);
inline int tree(...,.., int st,...){
cout << st <<endl;
a code;
}

То есть перед выполнением inline функции tree() значение st одно, а сразу же перед певым оператором внутри функции другое ( согласно cout << st).
Причем все остальные параметры, включая как простые, так и указатели на довольно стложные структуры - передаются правильно.
Иакое впечатление, что компилятор оптимизируя создает какие-то свои представления о значениях параметра. Повторяя предыдущий параметр цикла.


Но самое смешное, что если код функции непосредвсвенно вписать ручками - все ОК.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение15.11.2022, 15:26 
Аватара пользователя


28/10/21
103
MGM в сообщении #1570064 писал(а):
А теперь вот даже не могу обмануть компилятор в простой передаче (int) параметра.
Код:
float a = 0;
int st =0; while(st++<N)a+=tree(...,..,  st,...);
inline int tree(...,.., int st,...){
cout << st <<endl;
a code;
}

То есть перед выполнением inline функции tree() значение st одно, а сразу же перед певым оператором внутри функции другое ( согласно cout << st).


И это тоже, как и в предыдущем случае, скорее всего говорит о том, что вы чего-то не договариваете.

Вы делаете что-то не то. Но вместо реального кода вы снова рассказываете нам какие-то байки про код или показываете какие-то схематические огрызки кода, из которых ничего понять невозможно.

Чудес не бывает. Баги компиляторов - бывают. Но я почти уверен, что дело здесь все таки в ваших косяках, а не в багах компилятора.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild, wrest


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group