PDA

View Full Version : شبيه سازي تابع ()clrscr



mgmreza
پنج شنبه 16 آبان 1387, 02:25 صبح
با سلام
در زبان c تحت داس چگونه ميتوان بدون استفاده از تابع ()clrscr ، تابعي نوشت که صفحه نمايش را در حالت خروجی پاک کرد ؟ لطفا در اين مورد هرچه ميدانيد توضيح دهيد و در صورت امکان نمونه اي از اين برنامه را قرار دهيد.
با تشکر

sasan_vm
پنج شنبه 16 آبان 1387, 09:58 صبح
سلام

با استفاده از interrupt 10 BIOS می توانید به توابعی که با صفحه نمایش کار می کنند دسترسی داشته باشید:


void Cls(void)
{
union REGS Regs;
Regs.x.ax=0x600;
Regs.h.bh=0x7;
Regs.x.cx=0;
Regs.x.dx=0x184f;
int86(0x10,&Regs,&Regs);
}


مرجع کامل این بحث کتاب برنامه نویسی سیستم اثر مایکل تیشر است.

shask00l
پنج شنبه 16 آبان 1387, 16:28 عصر
در روشی که دوست عزیز . جناب ساسان شرح دادند از توابع bios استفاده شده .

روش دیگری هم وجود دارد . دسترسی مستقیم به حافظه .
اول باید تعین کنید که در کدام مد هستید . text با graphic .چون آدرس محتویات صفحه نمایش در این دو مد با هم فرق میکند . بعد از تعین این موضوع با یک حلقه for میتوان بخش مربوطه در حافظه را تغییر داد . در مورد آدرس این دو بخش هم اگر جستجو کنید . حتما پیدا میکنید .

موفق باشید

pswin.pooya
یک شنبه 26 آبان 1387, 21:26 عصر
راه حل ساده :

system ("cls")

راه حل دوم : استفاده از بایوس سیستم: که در بالا شرح داده شده.

راه حل سوم: استفاده از حافظه در صورت نداشتن بایوس و موارد دیگه مثل داس پیشنهاد میشه که به درد نوشتن سیستم عامل می خوره:

من برای توسعه سیستم عاملی که دارم اونو طراحی میکنم یه conio.h نوشتم که کد زیر قسمتی از اون هستش:


void clrscr()
{
unsigned char* p = (unsigned char*)VIDEO_START_MEMORY;

for (int i=0; i<VIDEO_MEMORY_SIZE; i+=TEXT_MODE_CHAR_STEP)
{
p[i] = ' ';
if (TEXT_MODE_CHAR_STEP > 1 )
p[i+1] = current_color;
}

// set cursor position to 0 , 0
gotoxy(0,0);
}


void _cdecl gotoxy (unsigned x, unsigned y)
{
unsigned memadd = y * 80 + x;
char MSB = memadd / 256;
char LSB = memadd - (MSB * 256 );
outp (0x3D4,14);
outp (0x3D5,MSB);
outp (0x3D4,15);
outp (0x3D5,LSB);
_y = memadd / 80 ;
_x = memadd - (_y * 80);

}
اینم بقیه کد:


// video memory and attribs
#define VIDEO_START_MEMORY 0xB8000
#define VIDEO_MEMORY_SIZE 160*25
#define TEXT_MODE_CHAR_STEP 2

// current color
static unsigned current_color=0;
static unsigned _x = 0 , _y = 0;کد بالا باید بهینه سازی شه. توی این حالت فقط برای مودهای متنی رنگی جواب میده برای مودهای تک رنگ باید آدرس رو تغییر بدین و قسمت اضافه کردن رنگ رو هم حذف کنید.

asm.coder
یک شنبه 26 آبان 1387, 21:59 عصر
در کل چیزی به اسم clear screen وجود نداره . برای این کار شما باید کل صفحه که حدود 80*25 کارکتر هست رو با کارکتر space با رنگ background سیاه ‍ر کنید . بعد cursor رو برگردونید اول صفحه.

alcatra
سه شنبه 28 آبان 1387, 18:20 عصر
با سلام
من از Microsoft Visual C++ 6.0 برای برنامه نویسی به زبان C استفاده می کنم،اما برای کامپایل کردن از تابع clrscr() ارور میگیره.

error C2065: 'clrscr' : undeclared identifier Error executing cl.exe

علتش چیه؟

shask00l
سه شنبه 28 آبان 1387, 18:46 عصر
با سلام
من از Microsoft Visual C++ 6.0 برای برنامه نویسی به زبان C استفاده می کنم،اما برای کامپایل کردن از تابع clrscr() ارور میگیره.

error C2065: 'clrscr' : undeclared identifier Error executing cl.exe

علتش چیه؟

هدف شما از استفاده clrscr در vc++ 6 چیست ؟ برای چی از این دستور استفاده میکنید .؟ اگه کنسولی هم وجود داشته باشه فکر نکنم این راه صحیح پاک کردن باشه .؟

1 خورده update تر کد بنویسید ..

emad_67
سه شنبه 28 آبان 1387, 19:15 عصر
من از Microsoft Visual C++ 6.0 برای برنامه نویسی به زبان C استفاده می کنم،اما برای کامپایل کردن از تابع clrscr() ارور میگیره.
توی vc++ همچین تابعی وجود نداره. شما باید اینجوری بنویسی:


system("cls");

هدر stdlib.h رو هم include کن.


هدف شما از استفاده clrscr در vc++ 6 چیست ؟ برای چی از این دستور استفاده میکنید .؟ اگه کنسولی هم وجود داشته باشه فکر نکنم این راه صحیح پاک کردن باشه .؟

1 خورده update تر کد بنویسید ..
update ترش رو هم شما بگو.

alcatra
چهارشنبه 29 آبان 1387, 19:47 عصر
هدف شما از استفاده clrscr در vc++ 6 چیست ؟ برای چی از این دستور استفاده میکنید .؟ اگه کنسولی هم وجود داشته باشه فکر نکنم این راه صحیح پاک کردن باشه .؟

1 خورده update تر کد بنویسید ..

من رشتم کامپیوتر نیست.به ما سه واحد برنامه نویسی دادن منم واسه تمرین اینا رو می نویسم.

javadbidel
پنج شنبه 19 آذر 1394, 02:19 صبح
سلام
من هم تو محیط Devc++ و هم Codeblocks وقتی ی پروژه از نوع C تعریف میکنم
برای هردوتابع clrscr() و تابع gotoxy() خطا میگیره و نمیشناسه...از پری پراسسور conio.h هم استفاده میکنم....
راه حلی نیست؟