• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Режим чтения 0a

  • Автор темы BattleMage
  • Дата начала
B

BattleMage

Ещё раз добрый день. Подскажите пожалуйста,что я тут не так делаю. Понимаю, что в чужих кодах разбираться нелегко, но все же... Задача такая. Экран состоит из четырех прямогульников разных цветов. Пользователь вводит координату точки (x,y) и должен вывести цвет той точки, которую он выбрал. ФУнкцию getpixel() или как она там называется не предлагать...

код такой:
Код:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<graphics.h>

void main()
{
unsigned int x,y;
printf("Введите координаты:");
scanf("%d %d",&x,&y);
if ((x<0)||(x>640)||(y<0)||(y>480))
{
printf("Ошибка! Некорректные координаты!");
getch();
return;
}
else
{
clrscr();
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "d:\\BC\\BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Графическая ошибка: %s\nНажмите любую клавишу для выхода", grapherrormsg(errorcode));
getch();
return;
}

//1
setfillstyle(1,1);
bar(0,0,160,480);

//2
setfillstyle(1,2);
bar(160,0,320,480);

//3
setfillstyle(1,4);
bar(320,0,480,480);

//4
setfillstyle(1,14);
bar(480,0,640,480);

//MK_FP - это макроопределение, которое создаёт дальний указатель из адреса сегмента (seg) смещения (ofs)
unsigned char far *mem = (char*)MK_FP(0xa000,0);
unsigned int q;
unsigned short w[4];
unsigned short u;

asm mov ax, 0x12
//Десятое прерывание BIOS-а
asm int 0x10

//регистр графического режима
outp(0x3CE, 0x5);
outp(0x3CF, 3);

for(q=0;q<=(480*80);q++) *((unsigned char far*)mem+q)=255;
//настраиваем видеокарту на режим чтения 0а
outp(0x3CE, 0x5);
outp(0x3CF, 0x0);
for(u=0;u<=3;u++)
{
outp(0x3CE, 0x4);
outp(0x3CF, u);
w[u]=*((unsigned char far*)mem+y*80+x/8);
}
for(u=0;u<=3;u++) w[u]=w[u]>>7;
if(w[0]==0 && w[1]==0 && w[2]==0 && w[3]==0) printf("\nЧёрный");
if(w[0]==1 && w[1]==0 && w[2]==0 && w[3]==0) printf("\nСиний");
if(w[0]==0 && w[1]==1 && w[2]==0 && w[3]==0) printf("\nЗелёный");
if(w[0]==1 && w[1]==1 && w[2]==0 && w[3]==0) printf("\nЦиановый");
if(w[0]==0 && w[1]==0 && w[2]==1 && w[3]==0) printf("\nКрасный");
if(w[0]==1 && w[1]==0 && w[2]==1 && w[3]==0) printf("\nМалиновый");
if(w[0]==0 && w[1]==1 && w[2]==1 && w[3]==0) printf("\nКоричневый");
if(w[0]==1 && w[1]==1 && w[2]==1 && w[3]==0) printf("\nСветлый серый");
if(w[0]==0 && w[1]==0 && w[2]==0 && w[3]==1) printf("\nТёмный серый");
if(w[0]==1 && w[1]==0 && w[2]==0 && w[3]==1) printf("\nГолубой");
if(w[0]==0 && w[1]==1 && w[2]==0 && w[3]==1) printf("\nСветлый зелёный");
if(w[0]==1 && w[1]==1 && w[2]==0 && w[3]==1) printf("\nСветлый циановый");
if(w[0]==0 && w[1]==0 && w[2]==1 && w[3]==1) printf("\nСветлый красный");
if(w[0]==1 && w[1]==0 && w[2]==1 && w[3]==1) printf("\nСветлый малиновый");
if(w[0]==0 && w[1]==1 && w[2]==1 && w[3]==1) printf("\nЖёлтый");
if(w[0]==1 && w[1]==1 && w[2]==1 && w[3]==1) printf("\nБелый");
getch();
closegraph();
return;
}
}

Не обращайте внимания,что экран раскрашен всего в 4 цвета, а условий аж для 16-ти...
 
E

European

Хардкорных любителей ДОСовской графики еще поискать надо :)
 
P

Pasha

Для: BattleMage
У тебя не так много вариантов:
1. Научится работать в видео через VESA, вкурить (вроде оно).
2. Снять странное ограничение на getpixel.
 
B

BattleMage

думаете я сам себе задание такое придумал. в универе дали такое. и по vesa лабу будет и много чего ещё... и функция getpixel() - хероватая....
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!