Как правильно скомпилировать программу в Turbo C++ с graphics.h?

Рейтинг: 3Ответов: 1Опубликовано: 11.03.2023

Написал следующий код:

    #include <graphics.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       /* request auto detection */
       int gdriver = DETECT, gmode, errorcode;
       int midx, midy, midx2, midy2;
       int radius = 25;
    
       /* initialize graphics and local variables */
       initgraph(&gdriver, &gmode, "c:/turboc3/bgi");
    
       /* read result of initialization */
       errorcode = graphresult();
       if (errorcode != grOk)  /* an error occurred */
       {
          printf("Graphics error: %s\n", grapherrormsg(errorcode));
          printf("Press any key to halt:");
          getch();
          exit(1); /* terminate with an error code */
       }
    
       midx = midx2 = getmaxx() / 2;
       midy = midy2 = getmaxy() / 2;
       int i = 0;
       setfillstyle(1, 3);
       while (!kbhit())
       {
        cleardevice();
    
        setcolor(RED);
        setfillstyle(XHATCH_FILL, RED);
        fillellipse(midx2, midy2, radius, radius);
    
        setcolor(GREEN);
        setfillstyle(XHATCH_FILL, GREEN);
        fillellipse(midx, midy, radius, radius);
    
        setcolor(WHITE);
        line(midx2, midy2, midx, midy);
    
        i = getch();
        switch(i)
        {
            case 115: midy += 2; break;
            case 119: midy -= 2; break;
            case 97: midx -= 2; break;
            case 100: midx += 2; break;
            default: return 0;
        }
       }
    
    
       /* clean up */
       getch();
       closegraph();
       return 0;
    }

Скомпилировал, собрал и получил .exe - файл. При запуске через Turbo C++ (ctrl + F9) всё работает, отображается, рисуется. А когда запускаю просто сам exe-файл то вижу следующую картину: пустая консоль с моргающим курсором в начале строки: ничего не отрисовывается, ничего с клавиатуры не вводится (exe-шник после компиляции закинулся в папку Source и оттуда я его не вытаскивал). Пустая консоль

Я полазил на английских форумах и мало что понял, но вроде как проблема в том, что Турбо Си делает 16-битные программы, которые на 64 битах уже не запускаются. НО! 2 важных пункта: во-первых у меня 32-битная седьмая винда, а во-вторых кто-то на форуме говорил, что собирал 32-битную программу (но не объяснил как).

Короче вопрос: что я сделал не так, почему ничего не рисуется и как это исправить?

P.s. я знаю про то, что прога устарела, что есть sfml и т.д., но мне интересен конкретно этот момент.

Ответы

▲ 2Принят

Действительно, Turbo C++ создает 16 битные программы, которые по умолчанию не поддерживаются современными ОС. Что делать?

Windows 32-bit

Вам понадобится NTVDM (виртуальная машина DOS NT). Она не установлена по умолчанию, но может быть добавлена при помощи команды DISM. Для ее установки запустите PowerShell от имени администратора и выполните команду:

DISM /online /enable-feature /all /featurename:NTVDM

Если же вам потребуется удалить этот компонент, выполните:

DISM /online /disable-feature /featurename:NTVDM

Windows 64-bit

В 64-разрядных системах Windows компонент NTVDM больше недоступен. Для того, чтобы запускать 16-разрядные приложения, вам понадобится сторонняя виртуальная машина, например, DOSBox.

Почему при запуске через Turbo C++ все работает?

Turbo C++ как раз запускается через виртуальную машину DOSBox, что и позволяет вашим программам корректно работать.