Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n? (http://forum.oszone.net/showthread.php?t=156445)

BacuJIuu KypraHoB 09-11-2009 16:09 1265771

Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n?
 
Вот эти две классические штуки компилят по-разному вот такую маленькую прогу. 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 1265899

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
Возвращая результат return msg.wParam; его можно привести к целому - return (int)msg.wParam;
Но это уже на усмотрение.

BacuJIuu KypraHoB 10-11-2009 08:13 1266353

Вроде всё нормально пишет, но не рисует... Вот что пишет.

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 1266741

Решено.

Всё-таки Си - отличный язык. Надо всегда учить матчасть. Вот 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 1267195

BacuJIuu KypraHoB, если ошибка была в алгоритме, то фраза
Цитата:

Цитата BacuJIuu KypraHoB
DM делает нормально »

некорректна, так как по исходнику из первого поста, к примеру компилятор Микрософт, собирает программу делающую следующие

что никак не связанно с кривой дракона.
А вот по первому исходнику из поста №4

строит вполне знакомую картинку.

BacuJIuu KypraHoB 11-11-2009 08:01 1267238

Цитата:

Цитата Admiral
строит вполне знакомую картинку »

Я и говорю - матчасть учить надо лучше (мне :)). Там не в алгоритме дело, а именно в тонкостях языка.


Время: 18:50.

Время: 18:50.
© OSzone.net 2001-