Как я могу вызвать initgraph более одного раза?

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

#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 ответа

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

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

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

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

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

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

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

int gdriver = IBM8514, gmode = 0;

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

int gdriver = DETECT, gmode;

Инициирование и закрытие должны вызываться только один раз и не вызываться в 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 получили файл с таким именем...

Другие вопросы по тегам