Как я могу вызвать initgraph более одного раза? - PullRequest
0 голосов
/ 21 января 2019

Пожалуйста, посмотрите на следующий код:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
using namespace std;
void drawrect()
{
    int gdriver = IBM8514, gmode;
    initgraph(&gdriver, &gmode, "");
    rectangle(500, 500, 700, 700);
    getch();
    cleardevice();
    closegraph();
}
int main()
{
    int f=1;
    while(f)
    {
        char c;
        printf("Press \"e\" to end, and any other character to draw a rectangle");
        scanf("%c",&c);
        c=='e' ? f=0:f=1;
        drawrect();
        fflush(stdin);
    }
}

при первом запуске этой программы, она работает правильно и рисует прямоугольник, но после первого раза функция прямоугольника не работаети экран графического интерфейса полностью пуст, хотя я очистил и закрыл предыдущий рисунок

Так почему же он не работает во второй раз?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Инициирование и закрытие должны вызываться только один раз и не вызываться в drawrect, но обычно вместо основного ... также наличие getch в процедуре рендеринга тоже не имеет смысла ...

Я не буду касаться здесь других вопросов вашего кода , поскольку я не кодирую консольные материалы годами и BGI даже дольше, но я бы начал с переупорядочения кода следующим образом:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
using namespace std;
void drawrect()
{
    rectangle(500, 500, 700, 700);
}
int main()
{
    int f=1;

    int gdriver = IBM8514, gmode;
    initgraph(&gdriver, &gmode, "");

    while(f)
    {
        char c;
        printf("Press \"e\" to end, and any other character to draw a rectangle");
        scanf("%c",&c);
        c=='e' ? f=0:f=1;
        drawrect();
        getch();
        fflush(stdin);
    }

    cleardevice();
    closegraph();
}

Также в будущем обращайтесь к библиотеке с ее настоящим именем BGI , потому что graphics.h не имеет смысла, так как почти все gfx api / libs получили файл с таким именем ...

0 голосов
/ 21 января 2019

Ваш код имеет неопределенное поведение . Звонок на initgraph

int gdriver = IBM8514, gmode;
initgraph(&gdriver, &gmode, "");

должен передать указатель на графический режим, который вы хотите использовать. Эта страница описывает функцию и ее аргументы, а также о режиме, в котором она написана:

* graphmode - это целое число, которое задает начальный графический режим (если * graphdriver не равен DETECT; в этом случае устанавливается * graphmode по initgraph с самым высоким разрешением, доступным для обнаруженных Водитель). Вы можете присвоить * graphmode значение, используя константу тип перечисления graphics_modes, который определен в graphics.h и перечислены ниже.

graphdriver и graphmode должны быть установлены на допустимые значения из Следующие таблицы, или вы получите непредсказуемые результаты. Исключение является графическим драйвером = DETECT.

Но вы не установили режим, и, как сказано во втором абзаце, результат непредсказуем. Это может быть: работать так, как вы хотели, не работать, работать странно или жарить процессор.

Так что установите графический режим, который вы хотите использовать, скажем,

int gdriver = IBM8514, gmode = 0;

или любой другой режим, который вам нужно использовать. В качестве альтернативы вы можете указать системе определять для себя, в этом случае вы можете использовать

int gdriver = DETECT, gmode;
...