Войти
ПрограммированиеФорумОбщее

С++ баг!! стандартный или MS-specific ? (7 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 5 6 7
#90
12:19, 10 фев. 2010

ashujon
> А это тут вообще причем?
  Мы тут вроде как говорим о том, очевиден или нет перевод DWORD в bool. И это тут совсем причём, потому что числовое значение можно трактовать как угодно и все аргументы в пользу очевидности основываются только на том, что в Plain-C не было как такового логического типа данных, поэтому там логические величины представлялись именно как 0-false, не ноль - true.


#91
12:28, 10 фев. 2010

> Мы тут вроде как говорим о том, очевиден или нет перевод DWORD в bool
Очевиден конечно, но у них разные размеры, и bool всегда приводится к 0 или к 1, это не бесплатно разумеется, об этом и варнинг, компилятор просто обязан тыкнуть при попытке неявного приведения

#92
22:37, 10 фев. 2010

0-false, не ноль - true.
это всего-лишь удобное соглашение.
булево значение никаким образом ни к нулю ни к 1 ни к другим числам, по сути, отношения не имеет. это истинность или ложность выражения.
соглашение это основано на том, что булевы операции и\или очень хорошо при этом соглашении переносятся на числовые сложнение и умножение. вот только отрицание логическое не представляется элементарным арифметическим действием. очевидно, что отрицание арифметическое булево значение не меняет. что 1 что -1 - это true, 0 и -0 - это false. 1-а - это fail, так как при тру не равном 1 он даст неверный результат. а если принять то, что тру всегда 1, то тогда сложение не будет так похоже на логическое или. вот вам и грабли, а о граблях компилятор должен предупреждать =))
булево значение - это всегда результат булева выражения, т.е. результат операций сравнения, либо элементарных логических операций и\или\не, а используется исключительно в оператора цикла, и ветвлениях. все - замкнутый круг. другими словами никакой "физической" связи булева значения  с числовым нету - это просто проведенная аналогия.
то что все более-менее серьезные API используют числовые значения вместо булевых, обусловлено лишь тем, что внутреннее устройство bool, в разных компиляторах разное, и рисковать из за такой фигни не стоит. - кому надо приведет к булеву значению согласно соглашению "не нолевое значение - истина", которое на C++ записывается не иначе, как boolval = intval != 0;

УПД
если не ошибаюсь MSVS выдает ворнинг, в котором что-то говорится про perfomance, такчто мешать компилятору оптимизировать - не стоит.

#93
15:15, 11 фев. 2010

Вот по начитался вас)) и решил тоже перейти на ворнинг левел "4") нашло 66 ошибок( в большинстве, возможная потеря данных), все исправил кроме C4201
в математике( пока что отключил эту ошибку )

stuct vec3
{
 union 
{ 
     struct { float x,y,z};
     struct { float r,g,b};
     struct { vec2 xy};
}
};

#94
16:10, 11 фев. 2010

ReeV, этот варинг не страшен, он предупреждает о совместимости кода с остальными компиляторами, т.к. подобные структуры не по стандарту ANSI, и считаются мс расширением
В настройках проекта если включен флаг /Za, то подобные предупреждения будут считаться ошибками

#95
16:20, 11 фев. 2010

ashujon
Ну я просто отключил именно эту ошибку)) что бы не мылило глаз)) а так я "чист"))) проект полностью на левел 4)))

Правко: тогда каким образом в GLSL испл vec[x] там можно изменять xy, r,g,b,s,t и так далее как быть?

#96
19:28, 11 фев. 2010

ReeV
Ворнинги прячутся :).
Советую поставить 2010 студию и там вшторить флаг /Wall.

#97
19:47, 11 фев. 2010

ReeV
> Правко: тогда каким образом в GLSL испл vec[x] там можно изменять xy, r,g,b,s,t
> и так далее как быть?

xyzw
rgba
stpq

#98
23:22, 11 фев. 2010

innuendo
иииииии, хочешь сказать что там не union?
vonrims
И что дает этот /Wall ?

#99
23:26, 11 фев. 2010

ReeV
> иииииии, хочешь сказать что там не union?
эээ... ты про GLSL? GLSL это не с++, это SL с синтаксисом похожий на Си, и гибкая работа с координатами векторами это просто особенность этого языка и целевого процессора, и не повторимы на с++

#100
23:37, 11 фев. 2010

почему не повторимы? скачай glm :))
http://glm.g-truc.net/

я так понимаю нужно курить в сторону Swizzle operator?
Или это только в HLSL есть..
float3 h;
h.yx = float2(0.0,0.0);
h.xz = float2(0.0,0.0);
h.xzy = float2(0.0,0.0,0.0);

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорумОбщее

Тема в архиве.