Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n?

Ответить
Настройки темы
C/C++ - [решено] Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n?

Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вот эти две классические штуки компилят по-разному вот такую маленькую прогу. 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;
}

Отправлено: 16:09, 09-11-2009

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


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;
Но это уже на усмотрение.

Отправлено: 18:13, 09-11-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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 в 08:26.


Отправлено: 08:13, 10-11-2009 | #3


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Решено.

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

Отправлено: 17:00, 10-11-2009 | #4


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


BacuJIuu KypraHoB, если ошибка была в алгоритме, то фраза
Цитата BacuJIuu KypraHoB:
DM делает нормально »
некорректна, так как по исходнику из первого поста, к примеру компилятор Микрософт, собирает программу делающую следующие

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

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

Отправлено: 03:00, 11-11-2009 | #5


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:01, 11-11-2009 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Сравнение: Borland C++ 5.5.1 for Win32 и Digital Mars Compiler Version 8.42n?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Mars Installer (выбор устанавливаемых приложений) Snakus Автоматическая установка Windows 2000/XP/2003 19 06-02-2012 13:04
Разное - [решено] Компиляция при помощи Innno Setup Compiler 5.1.0-beta Baw17 Программирование и базы данных 3 21-02-2010 18:27
[решено] последствие Digital Access Пострадавшийотвируса Лечение систем от вредоносных программ 40 21-12-2009 19:58
[решено] обнаружены вирусы Trojan.Win32.Patched.fr и Trojan.Win32.ВНО.isy levss_09 Лечение систем от вредоносных программ 6 25-11-2009 23:00
Звук - Digital Audio Out Coaxial (SPDIF RCA) -> Digital input (AES/EBU XLR) MiDNiGhT MaN Прочее железо 0 16-03-2009 19:47




 
Переход