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