BacuJIuu KypraHoB
09-11-2009, 16:09
Вот эти две классические штуки компилят по-разному вот такую маленькую прогу. DM делает нормально, а Borland не делает вааще. Я уже башку сломал. Помогите, пожалуйста. Вот код (drakon.c):
#include <windows.h>
const int storona = 2;
char szTitle[] = "Драконова ломаная";
void drakon(HDC hdc, int d, int *n, char *p, int *x, int *y)
{
if (d == 0)
{
// 1-N 2-S 3-W 4-E
MoveToEx(hdc, *x, *y, NULL);
if (*n == 1)
*y -= storona; //Шаг на север
if (*n == 2)
*y += storona; //Шаг на юг
if (*n == 3)
*x -= storona; //Шаг на запад
if (*n == 4)
*x += storona; //Шаг на восток
LineTo(hdc, *x, *y);
}
else
{
drakon(hdc, d - 1, n, "P", x, y); //Правый дракон порядка d-1
if (p == "P") //поворот направо
{
if (*n == 1)
*n = 4;
else if (*n == 2)
*n = 3;
else if (*n == 3)
*n = 1;
else if (*n == 4)
*n = 2;
}
else if (p == "L") //... или поворот налево
{
if (*n == 1)
*n = 3;
else if (*n == 2)
*n = 4;
else if (*n == 3)
*n = 2;
else if (*n == 4)
*n = 1;
}
drakon(hdc, d - 1, n, "L", x, y); //Левый дракон порядка d-1
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x0, y0;
int N = 1;
switch (msg)
{
case WM_SIZE:
x0 = LOWORD(lParam) * 0.3;
y0 = HIWORD(lParam) * 0.8;
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
drakon(hdc, 19, &N, "P", &x0, &y0);
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "myWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
#include <windows.h>
const int storona = 2;
char szTitle[] = "Драконова ломаная";
void drakon(HDC hdc, int d, int *n, char *p, int *x, int *y)
{
if (d == 0)
{
// 1-N 2-S 3-W 4-E
MoveToEx(hdc, *x, *y, NULL);
if (*n == 1)
*y -= storona; //Шаг на север
if (*n == 2)
*y += storona; //Шаг на юг
if (*n == 3)
*x -= storona; //Шаг на запад
if (*n == 4)
*x += storona; //Шаг на восток
LineTo(hdc, *x, *y);
}
else
{
drakon(hdc, d - 1, n, "P", x, y); //Правый дракон порядка d-1
if (p == "P") //поворот направо
{
if (*n == 1)
*n = 4;
else if (*n == 2)
*n = 3;
else if (*n == 3)
*n = 1;
else if (*n == 4)
*n = 2;
}
else if (p == "L") //... или поворот налево
{
if (*n == 1)
*n = 3;
else if (*n == 2)
*n = 4;
else if (*n == 3)
*n = 2;
else if (*n == 4)
*n = 1;
}
drakon(hdc, d - 1, n, "L", x, y); //Левый дракон порядка d-1
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x0, y0;
int N = 1;
switch (msg)
{
case WM_SIZE:
x0 = LOWORD(lParam) * 0.3;
y0 = HIWORD(lParam) * 0.8;
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
drakon(hdc, 19, &N, "P", &x0, &y0);
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "myWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}