- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
HIMAGELIST ImageList_LoadImageV(PVOID ImageBase, PCWSTR a[], int level)
{
PIMAGE_RESOURCE_DATA_ENTRY pirde;
PBITMAPINFOHEADER pbih;
DWORD cx, cy, cb, n, ofs;
if (
0 <= LdrFindResource_U(ImageBase, a, level, &pirde) &&
0 <= LdrAccessResource(ImageBase, pirde, (void**)&pbih, &cb) &&
cb > sizeof(BITMAPINFOHEADER) &&
pbih->biSize >= sizeof(BITMAPINFOHEADER) &&
(cx = pbih->biWidth) <= (cy = pbih->biHeight) &&
!(cy % cx) &&
pbih->biBitCount == 32 &&
(ofs = pbih->biSize) + (cx * cy << 2) == cb
)
{
n = cy / cx, cb = cx * cx << 2;
if (HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR32, n, 0))
{
BITMAPINFO bi = { {sizeof(BITMAPINFOHEADER), cx, cx, 1, 32 } };
if (HDC hdc = GetDC(0))
{
if (HBITMAP hbmp = CreateCompatibleBitmap(hdc, cx, cx))
{
do ; while (
SetDIBits(hdc, hbmp, 0, cx, RtlOffsetToPointer(pbih, ofs), &bi, DIB_RGB_COLORS) &&
0 <= ImageList_Add(himl, hbmp, 0) &&
(ofs += cb, --n)
);
DeleteObject(hbmp);
}
ReleaseDC(0, hdc);
}
if (!n) return himl;
ImageList_Destroy(himl);
}
}
return 0;
}
wvxvw 14.12.2014 21:36 # +4
А вообще, хакер, вылитый хакер. Особенно do ; while - я даже не знал, что так можно.
bormand 14.12.2014 21:39 # +1
Нельзя, емнип. Так что это кресты.
Abbath 18.12.2014 00:48 # +1
bormand 18.12.2014 06:23 # 0
kipar 18.12.2014 15:51 # 0
bormand 18.12.2014 15:52 # 0
kipar 18.12.2014 15:59 # +1
roman-kashitsyn 14.12.2014 21:47 # +1
Можно в начале любого блока, даже в C89.
bormand 14.12.2014 21:48 # +1
roman-kashitsyn 15.12.2014 00:25 # +1
bormand 14.12.2014 22:26 # +1
Кстати, а это же ничем не отличается от while (...);
inkanus-gray 14.12.2014 22:31 # +3
3.14159265 15.12.2014 14:31 # +1
Зачем писать уродливые костыли, боясь мифических do, если можно юзать for, как единый цикл с предусловием и не париться?
zhukas 14.12.2014 23:06 # +1
while (func());
@@1: call func
text rax,rax
jz @@2
jmp @@1
@@2:
--------------------------
do ; while (func());
@@1: call func
text rax,rax
jnz @@1
bormand 14.12.2014 23:09 # 0
zhukas 14.12.2014 23:27 # 0
goto check;
do
{
body;
check:
}
while( func() );
в данном случае тоже есть 1 дополнительная инструкция - jmp check - НО она выполняется только 1 раз, а не в цикле
bormand 14.12.2014 23:14 # 0
bormand 14.12.2014 23:22 # 0
bormand 14.12.2014 23:24 # 0
zhukas 14.12.2014 23:51 # 0
3.14159265 15.12.2014 03:43 # +1
Ну for же можно. И if. И обычный while.
Я за принудительные операторные скобки и возможно отказ от коварного оператора запятая.
Хотя крестоблядь везде болото найдёт, чтобы в нём застрелиться в ногу.
wvxvw 15.12.2014 08:41 # 0
Я не против того, чтобы не писать скобки там где не нужно. Что мне кажется не хорошо - скобки выполняют две функции (в Си) - лексические блоки, и просто грамматическую функцию объединения нескольких выражений в одно. И иногда используя их ради одной из функций зачем-то получаешь вторую.
3.14159265 15.12.2014 14:26 # 0
Ну есть case без выражений, для того чтобы перечислить несколько значений.
switch(1) {
case 1:case 2:;
}
Да в том-то и дело что тут полная неконсистентность.
>Или тело функции, если в нем всего одно выражение?
>разные Си-подобные к этому по-разному относятся.
Хотя лямбды в C# (x => x+1;), Java (x -> x+1; ) и драфте ECMA6 допускают сахарную запись без фигурных скобок, если там один оператор. Не знаю насчёт крестов, может и там сделали.
bormand 14.12.2014 22:24 # +5
Raissya v pirde.
inkanus-gray 14.12.2014 22:28 # +1
codemonkey 15.12.2014 14:08 # 0