Войти

Показать полную графическую версию : [решено] Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n?


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;
}

Admiral
09-11-2009, 18:13
BacuJIuu KypraHoB, что Borland C++ 5.5.1 for Win32 пишет в ответ на данный исходник?

Вместо while (GetMessage(&msg, NULL, 0, 0)) лучше написать while (GetMessage(&msg, NULL, 0, 0)>0) иначе в случаи если GetMessage(&msg, NULL, 0, 0) вернёт -1, что тоже не ноль, будет ошибка.
GetMessage Function (http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx)
Возвращая результат return msg.wParam; его можно привести к целому - return (int)msg.wParam;
Но это уже на усмотрение.

BacuJIuu KypraHoB
10-11-2009, 08:13
Вроде всё нормально пишет, но не рисует... Вот что пишет.

D:\csrc>bcc32 -W gdi32.lib "drakon.c"
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
drakon.c:
Warning W8057 drakon.c 120: Parameter 'hPrevInst' is never used in function WinMain
Warning W8057 drakon.c 120: Parameter 'lpszCmdLine' is never used in function WinMain
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

BacuJIuu KypraHoB
10-11-2009, 17:00
Решено.

Всё-таки Си - отличный язык. Надо всегда учить матчасть. Вот 2 рабочих варианта.

#include <windows.h>

const int storona = 2;
char szTitle[] = "Драконова ломаная";

void drakon(HDC hdc, int d, int *n, int 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, 0, x, y); // Правый дракон порядка d-1
switch (p)
{
case 0: //поворот направо
if (*n == 1)
*n = 4;
else if (*n == 2)
*n = 3;
else if (*n == 3)
*n = 1;
else if (*n == 4)
*n = 2;
break;
case 1: // ... или поворот налево
if (*n == 1)
*n = 3;
else if (*n == 2)
*n = 4;
else if (*n == 3)
*n = 2;
else if (*n == 4)
*n = 1;
break;
}
drakon(hdc, d - 1, n, 1, x, y); // Левый дракон порядка d-1
}
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x, y;
int N = 1;

switch (msg)
{
case WM_SIZE:
x = LOWORD(lParam) * 0.3;
y = HIWORD(lParam) * 0.8;
break;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

drakon(hdc, 19, &N, 0, &x, &y);

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) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}



#include <windows.h>

const int storona = 2;
char szTitle[] = "Драконова ломаная";

void drakon(HDC hdc, int d, char *n, char p, int *x, int *y)
{
if (d == 0)
{
MoveToEx(hdc, *x, *y, NULL);
if (*n == 'N')
*y -= storona; // Шаг на север
if (*n == 'S')
*y += storona; // Шаг на юг
if (*n == 'W')
*x -= storona; // Шаг на запад
if (*n == 'E')
*x += storona; // Шаг на восток
LineTo(hdc, *x, *y);
}
else
{
drakon(hdc, d - 1, n, 'P', x, y); // Правый дракон порядка d-1
switch (p)
{
case 'P': //поворот направо
if (*n == 'N')
*n = 'E';
else if (*n == 'S')
*n = 'W';
else if (*n == 'W')
*n = 'N';
else if (*n == 'E')
*n = 'S';
break;
case 'L': // ... или поворот налево
if (*n == 'N')
*n = 'W';
else if (*n == 'S')
*n = 'E';
else if (*n == 'W')
*n = 'S';
else if (*n == 'E')
*n = 'N';
break;
}
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 x, y;
char N = 'N';

switch (msg)
{
case WM_SIZE:
x = LOWORD(lParam) * 0.3;
y = HIWORD(lParam) * 0.8;
break;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

drakon(hdc, 19, &N, 'P', &x, &y);

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) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

Admiral
11-11-2009, 03:00
BacuJIuu KypraHoB, если ошибка была в алгоритме, то фраза DM делает нормально » некорректна, так как по исходнику из первого поста, к примеру компилятор Микрософт, собирает программу делающую следующие
http://i066.radikal.ru/0911/dd/990edc3bfb8b.png
что никак не связанно с кривой дракона.
А вот по первому исходнику из поста №4
http://i074.radikal.ru/0911/14/daa64525f5be.png
строит вполне знакомую картинку.

BacuJIuu KypraHoB
11-11-2009, 08:01
строит вполне знакомую картинку »
Я и говорю - матчасть учить надо лучше (мне :)). Там не в алгоритме дело, а именно в тонкостях языка.




© OSzone.net 2001-2012