نمایش نتایج 1 تا 30 از 30

نام تاپیک: خواندن ورودی کاربر از کیبرد

  1. #1

    خواندن ورودی کاربر از کیبرد

    در حال نوشتن یک هسته کوچک و جمع جور هستم (که کدش رو اینجا میتونید بخونید) ، و الان میتونه با استفاده از GRUB بوت شه و یه رشته رو به کاربر نشون بده. الان قصد دارم از کاربر یه سری ورودی بگیرم، و به این کد رسیدم :

    /*
    PS/2 keyboard code.
    Dependencies:
    inb function and scancode table.
    */
    char getScancode()
    {
    char c=0;
    do {
    if(inb(0x60)!=c)
    {
    c=inb(0x60);
    if(c>0)
    return c;
    }
    }while(1);
    }
    char getchar()
    {
    return scancode[getScancode()+1];
    }


    توابع inb و outb رو نوشتم ، ولی این تابع یکم گنگه. به نظر میرسه نیاز به آرایه ای از حروف دارم، واقعا همینطوره؟

  2. #2

    نقل قول: خواندن ورودی کاربر از کیبرد

    سلام
    برای خواندن از صفحه کلید نیاز دارید که با کنترلر و انکودر صفحه کلید که به ترتیب برروی مادربرد و خود صفحه کلید قرار دارند ارتباط برقرار کنید. روشی که شما در بالا به کار بردید در دانشنامه osdev آورده شده و از طریق پورت 0x60 که برای خواندن از بافر انکودر صفحه کلید از و این کار زمانی مجاز است که بافر پر شده باشد. در عمل شما مرتبط به این بافر سرکشی میکنید. تا اینکه کاربر کلیدی را بفشارد.

    هرکلید برروی صفحه کلید در سه حالت فشرده شدن، نگهداشته شدن و رها شدن سه کد متفاوت تولید میکند که در دو وضعیت اول کد make و در زمان رها شدن کلید کد break آن کلید در بافر درج میشود. پس شما نیاز دارید که آرایه ای برای نگاشت این کدها به کدهای ASCII داشته باشید. به این جدول نگاشت جدول scancode میگویند.

    من از جدولی که در مجموعه ی BrokenThorn بود استفاده کردم که شما میتوانید از فایل ضمیمه شده در شاخه ی SysCore/keyboard در دوفایل kybrd.h و kybrd.cpp پیدا کنید ابتدا یک enum برای نامگذاری کلیدها در فایل kybrd.h تعریف کرده و سپس در فایل kybrd.cpp یک آرایه بعنوان جدول نگاشت تعریف کرده که شما میتوانید عمل نگاشت را از روی آن انجام دهید.

    البته در این مجوعه برای گرفتن ورودی صفحه کلید برای صفحه کلید یک تابع مدیر وقفه در نظر گرفته شده است.

    در گام بعدی شما باید IDT خودتان را راه اندازی کنید. بطور خلاصه میشه گفت IDT به شما این امکان رو میده که برای وقفه های سخت افزاری و نرم افزاری توابعی بنویسید که آن ها را مدیریت کنید.
    البته پیش از این باید برای تراشه PIC کد نویسی کنید. اگر در کتاب های سیستم عامل خوانده باشید وظیفه ی کنترل ارسال سیگنال های وقفه از دستگاه های ورودی بر عهده این تراشه است.
    و شما باید به این سمت بروید که وقفه ی صفحه کلید را مدیریت کنید و از امکانات صفحه کلید هم بهره ببرید. و سطح کار خودتان را بهبود بدهید.

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

    یا علی
    فایل های ضمیمه فایل های ضمیمه

  3. #3

    نقل قول: خواندن ورودی کاربر از کیبرد

    خیلی ممنون. ولی حقیقتا فعلا قصد ندارم توی چند تا کد جداگانه بنویسمش. بلکه قصدم اینه که یک کد واحد داشته باشم. به همین دلیل ترجیح میدم با همون روش OSDev پیش برم. پیشنهادی دارید؟

  4. #4

    نقل قول: خواندن ورودی کاربر از کیبرد

    در گام بعدی شما باید IDT خودتان را راه اندازی کنید. بطور خلاصه میشه گفت IDT به شما این امکان رو میده که برای وقفه های سخت افزاری و نرم افزاری توابعی بنویسید که آن ها را مدیریت کنید.
    اول IDT رو پیاده سازی کنید بعد به کمک سمافور روی هر کدوم از وقفه ها که خواستین تمرکز کنید. یعنی سرویس شما مثلا کی برد میره روی سمافور وقفه ۱۳ قفل می کنه بعد از اینکه وقفه ۱۳ رسید قفل رو آزاد می کنه و سرویس می فهمه که یک کلید زده شده. خود سرویس کی بردهم می تونه یک فایل رو بهتش اختصاص داد و با API ها برنامه های سعی کنن از فایل بخونن. اگر کلید جدیدی رسید که هیچی اگر نرسید اونها هم به مراتب روش قفل می کنن و تا زمان رسیدن داده قفل می مونن.

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

  5. #5

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    اول IDT رو پیاده سازی کنید بعد به کمک سمافور روی هر کدوم از وقفه ها که خواستین تمرکز کنید. یعنی سرویس شما مثلا کی برد میره روی سمافور وقفه ۱۳ قفل می کنه بعد از اینکه وقفه ۱۳ رسید قفل رو آزاد می کنه و سرویس می فهمه که یک کلید زده شده. خود سرویس کی بردهم می تونه یک فایل رو بهتش اختصاص داد و با API ها برنامه های سعی کنن از فایل بخونن. اگر کلید جدیدی رسید که هیچی اگر نرسید اونها هم به مراتب روش قفل می کنن و تا زمان رسیدن داده قفل می مونن.
    یعنی با وقفه ی صفحه کلید مثل مسئله ی تولید کننده و مصرف کننده برخورد کنیم ؟
    جایی خوانده بودم که از یک آرایه با طول n بعنوان بافر صفحه کلید استفاده میکنند منظور شما از فایل در واقع ایفای نقش بافر برای صفحه کلید است ؟

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    این مجموعه اصلا برای طراحی نهایی سیستم عامل خوب نیست و ایرادهای اساسی داره که باعث شد حتی یکسری از اول نوشته بشه. اما برای درک برخی از ساختارها خوبه.
    ابرادات اساسی رو متوجه نمیشوم. اشکالاتی در مجموعه هست من هم با نویسنده این سایت در ارتباط هستم هر از چند گاهی اشکالاتی پیدا میکنم و به طرف اطلاع میدم منتها بنده خدا کم پیداست.

  6. #6

    نقل قول: خواندن ورودی کاربر از کیبرد

    یعنی با وقفه ی صفحه کلید مثل مسئله ی تولید کننده و مصرف کننده برخورد کنیم ؟
    جایی خوانده بودم که از یک آرایه با طول n بعنوان بافر صفحه کلید استفاده میکنند منظور شما از فایل در واقع ایفای نقش بافر برای صفحه کلید است ؟
    دقیقا. بافر رو توی مصرف کننده قرار بدید. برخی از کاربردها real time هستن. مثل بازیها استفاده از بافر برای اونها اشتباه هست.
    ابرادات اساسی رو متوجه نمیشوم. اشکالاتی در مجموعه هست من هم با نویسنده این سایت در ارتباط هستم هر از چند گاهی اشکالاتی پیدا میکنم و به طرف اطلاع میدم منتها بنده خدا کم پیداست.
    بعد از یه مدت دیگه نمی تونید جلو برید. گفتم که ساختارش اصولی نیست و براتون محدودیت های زیاد ایجاد می کنه. مثلا یه مدت بعد احتیاج به ماژول لودر برای درایورها و ... دارید که بوت لودرش این قابلیت رو نداره. همیطور باید مواردی مثل قفلها رو اضافه کنید که اصلا برای خودشون داستانی هستند اونها. و بگذریم از چند برنامه گی و ...

  7. #7

    نقل قول: خواندن ورودی کاربر از کیبرد

    بسیار خوب، راه حلی نیست که راحت تر بشه انجام داد این کارو؟ بدون نیاز به IDT ؟

    پ.ن : فعلا زیادی بی تجربه ام

  8. #8

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    بسیار خوب، راه حلی نیست که راحت تر بشه انجام داد این کارو؟ بدون نیاز به IDT ؟

    پ.ن : فعلا زیادی بی تجربه ام
    از جدول زیر استفاده کنید خروجی را هم اطلاع بدید تو تست من جالب نشد.
    unsigned char scancode[128] =
    {
    0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */
    '9', '0', '-', '=', '\b', /* Backspace */
    '\t', /* Tab */
    'q', 'w', 'e', 'r', /* 19 */
    't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter key */
    0, /* 29 - Control */
    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */
    '\'', '`', 0, /* Left shift */
    '\\', 'z', 'x', 'c', 'v', 'b', 'n', /* 49 */
    'm', ',', '.', '/', 0, /* Right shift */
    '*',
    0, /* Alt */
    ' ', /* Space bar */
    0, /* Caps lock */
    0, /* 59 - F1 key ... > */
    0, 0, 0, 0, 0, 0, 0, 0,
    0, /* < ... F10 */
    0, /* 69 - Num lock*/
    0, /* Scroll Lock */
    0, /* Home key */
    0, /* Up Arrow */
    0, /* Page Up */
    '-',
    0, /* Left Arrow */
    0,
    0, /* Right Arrow */
    '+',
    0, /* 79 - End key*/
    0, /* Down Arrow */
    0, /* Page Down */
    0, /* Insert Key */
    0, /* Delete Key */
    0, 0, 0,
    0, /* F11 Key */
    0, /* F12 Key */
    0, /* All other keys are undefined */
    };


  9. #9

    نقل قول: خواندن ورودی کاربر از کیبرد

    با استفاده از جدول که مشکلی پیش نیومد. ولی وقتی getScancode رو مینویسم این ارور داده میشه :

    kernel.c: In function 'getScancode':
    kernel.c:152:4: error: void value not ignored as it ought to be
    if(inb(0x60)!=c)
    ^
    kernel.c:154:2: error: void value not ignored as it ought to be
    c=inb(0x60);
    ^


  10. #10

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    با استفاده از جدول که مشکلی پیش نیومد. ولی وقتی getScancode رو مینویسم این ارور داده میشه :

    kernel.c: In function 'getScancode':
    kernel.c:152:4: error: void value not ignored as it ought to be
    if(inb(0x60)!=c)
    ^
    kernel.c:154:2: error: void value not ignored as it ought to be
    c=inb(0x60);
    ^

    بنظر میرسه که تابع inb شما خروجی void برمیگرداند.
    از این تابع استفاده کنید :
    static inline uint8_t inb(uint16_t port){
    uint8_t ret;
    asm volatile ( "inb %1, %0" : "=a"(ret) : "Nd"(port) );
    /* TODO: Is it wrong to use 'N' for the port? It's not a 8-bit constant. */
    /* TODO: Should %1 be %w1? */
    return ret;}


  11. #11

    نقل قول: خواندن ورودی کاربر از کیبرد

    اگر کد های من رو چک کنید الان متوجه خواهید شد که میتونه کیبرد رو بفهمه و از این بابت ازتون تشکر میکنم چون واقعا کمک کردید.

    اما الان این مشکلات رو دارم :

    ۱. کرکترهایی مثل

    \n

    رو نیاز دارم و وارد کردم اما کار نمیکنن. باید چه کنم براشون؟

    ۲. برای نمایش چیزی که کاربر تایپ کرده باید چه کنم؟

    با تشکر.

  12. #12

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    اگر کد های من رو چک کنید الان متوجه خواهید شد که میتونه کیبرد رو بفهمه و از این بابت ازتون تشکر میکنم چون واقعا کمک کردید.

    اما الان این مشکلات رو دارم :

    ۱. کرکترهایی مثل

    \n

    رو نیاز دارم و وارد کردم اما کار نمیکنن. باید چه کنم براشون؟

    ۲. برای نمایش چیزی که کاربر تایپ کرده باید چه کنم؟

    با تشکر.
    1. منظورتون n\ است ؟

    2. برای نمایش چیزی که کارب در تایپ کرده یعتی ورودی که گرفتید را نتوانستید روی صفحه نمایش نشان دهید یا اینکه میخواهید ورودی را جایی نگهداری کنید ؟

  13. #13

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط reza_noei مشاهده تاپیک
    1. منظورتون n\ است ؟

    2. برای نمایش چیزی که کارب در تایپ کرده یعتی ورودی که گرفتید را نتوانستید روی صفحه نمایش نشان دهید یا اینکه میخواهید ورودی را جایی نگهداری کنید ؟
    1. بله
    2. چیزی که کاربر تایپ میکنه رو به صورت همزمان نشون بدم (دقیقا یه Prompt).

  14. #14

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    1. بله
    2. چیزی که کاربر تایپ میکنه رو به صورت همزمان نشون بدم (دقیقا یه Prompt).
    در مورد چاپ کاراکتر برروی صفحه نمایش : برخی از دستگاه های ورودی / خروجی مثل صفحه نمایش به آدرس های خاصی از حافظه ی اصلی نگاشت میشوند یعنی به محض اینکه شما در آن آدرس ها داده وارد کنید تغییرات روی این دستگاه ها اعمال می شود. برای صفحه نمایش شما میتوانید از آدرس 0xB8000 برای نوشتن مستقیم برروی صفحه نمایش استفاده کنید. هر سلول در صفحه نمایش در این نگاشت شامل دو بایت کاراکتر و مشخصه ی رنگ کاراکتر میباشد. بایت اول کد کاراکتر و بایت دوم مشخصه ی رنگ.

    اگر کتاب های زبان اسمبلی را مطالعه کرده باشید قالب رنگ B RGB I RGB هشت بیتی که سه بیت کم ارزش آن یعنی RGB اول رنگ کاراکتر یا ForeColor و بیت چهارم (I) غلظت این رنگ و سه بیت RGB بعدی مشخص کننده رنگ پس زمینه یا Background Color آن سلول می باشد. بیت آخر هم اگر یک شود نمایش کاراکتر بصورت چشمک زن خواهد شد. من تو شبیه ساز ها این چشمک زدن کاراکترها را مشاهده نکردم ولی وقتی روی سخت افزار واقعی بوت شدم تاثیر آن کاملا مشهود بود.

    پس شد بایت اول کد کاراکتر و بایت دوم مشخصه ی رنگ کاراکتر. البته در مد فعلی صفحه نمایش ما 80 ستون و 25 سطر داریم و با در نظر داشتن اینکه آدرس 0xB8000 آدرس شروع است و این آدرس خطی است برای رفتن به سطر i ام و ستون j ام باید از فرمول (0xB8000 + 2 * (i*80+j استفاده کنیم.

    پس برای شروع :
    char *VideoMemory = (char *) 0xB8000;

    *(VideoMemory++) = 'H';
    *(VideoMemory++) = 15; // White on Black


    اگر بخواهید از نوع داده ای Short int یا متداول تر آن برای توسعه دهندگان uint16_t که از روی همین نوع داده ای تعریف شده برای کار با صفحه نمایش استفاده کنید باید بدانید که در کامپیوترهای ما نحوه ی ذخیره ی مقادیر بصورت little endian میباشد یعنی در ذخیره ی یک عدد دوبایتی ابتدا بایت کم ارزش ذخیره میشود و سپس بایت پر ارزش پس در این مواقع باید شماره ی کاراکتر 8 بیت کم ارزش باشد و مشخصه ی رنگ 8 بیت با ارزش.

    مثلا :
    uint16_t *VideoMemory = (uint16_t *)0xB8000;
    *(VideoMemory++) = 'H' | (15<<8);

    در مورد n\ : شما باید تابع printf خودتان را بنویسید (: . در انجام این کار کاملا مختار هستید میتواند هر طور که خواستید طراحی کنید.
    تابع printf یک تابع با تعداد ورودی نا مشخص است و پیاده سازی آن برای شما در شروع کار کمی مشکل است. فعلا میتوانید یک تابع معمولی داشته باشید که یک رشته را چاپ کند.
    پس از نوشتن شما می توانید تابعی بنویسید که بطور خودکار شما را به سطر بعدی ببرد. اگر احساس میکنید الان وقت نوشتن printf جدیدتان است شروع کنیم ؟

    البته در هنگام نوشتن برروی صفحه نمایش مشاهده میکنید که اشاره گر سر جای خود ثابت مانده. این امر طبیعی است شما برای حرکت دادن این اشاره گر باید در پورت صفحه نمایش مکان جدید اشاره گر را بنویسید.
    هر موقع علاقمند بودید وارد اون مبحث هم میشویم.

    موفق باشید
    آخرین ویرایش به وسیله reza_noei : چهارشنبه 25 آذر 1394 در 22:26 عصر

  15. #15

    نقل قول: خواندن ورودی کاربر از کیبرد

    دوست عزیز من همین الان مایلم این امکانات رو اضافه کنم.
    فقط خواهشا نگاه کنید به کد، الان یه terminal_writestring دارم که کار printf رو انجام میده. و هچنین یه getchar که ورودی رو از کاربر میگیره.

    الان قصدم رو فکر کنم فهمیدید و تا حد امکان میخوام روی کد آماده خودم اینا رو وارد کنم : http://github.com/prp-e/NanOS

  16. #16

    نقل قول: خواندن ورودی کاربر از کیبرد

    قضیه رو تا حد زیادی حل کردم. در واقع تابع terminal_writestring رو الان نگاه کنید با کلکی که زدم میاد اول خط بعدی.

    چطور؟ اختلاف طول رشته ای که چاپ شده با عرض کنسول محاسبه میشه و بعدش به جاش کرکتر خالی چاپ میشه.

  17. #17

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    دوست عزیز من همین الان مایلم این امکانات رو اضافه کنم.
    فقط خواهشا نگاه کنید به کد، الان یه terminal_writestring دارم که کار printf رو انجام میده. و هچنین یه getchar که ورودی رو از کاربر میگیره.

    الان قصدم رو فکر کنم فهمیدید و تا حد امکان میخوام روی کد آماده خودم اینا رو وارد کنم : http://github.com/prp-e/NanOS
    خوب، کدهای شما رو دیدم.

    وقتی شما میخواهید یک رشته که دارای قالبی خاص است را پردازش کنید در ابتدا قراره که شما تعریف کنید که تابع شما چه قالبی رو پردازش میکنه تابع شما
    با تابع printf تفاوت دارد. اما اگر ما بخواهیم در نابع فوق بخواهیم تاثیر رشته هایی مثل n\ و ... را اعمال کنیم باید در هنگام چاپ رشته تک تک کاراکترها را بررسی کنیم.
    اگر دیدم \ و سپس دیدیم n آنگاه کاراکتر 10 را چاپ کنیم و در تابع putchar است که ما بررسی می کنیم که اگر کاراکتر ورودی فرضاً 10 باشد به خط بعد برویم یا چه کار کنیم.

    اما در مورد اشاره گر :
    برای اینکه اشاره گر صفحه نمایش را بروز رسانی کنیم باید در پورت صفحه نمایش بنویسیم جدای از بحث پورت ها صفحه نمایش باید دقت داشته باشید که اشتباه در کد نویسی در مورد صفحه نمایش ممکنه باعث اشکالات سخت افزاری بشود پس پیش از اجرا روی سخت افزار واقعی کدتان را روی شبیه ساز اجرا کنید. برای بروز رسانی شما باید آدرس خطی سلول مورد نظر را حساب کنید و این آدرس حساب شده را در پورت 0x03d5 بنویسید منتها چون عملوند دوم دستور out هشت بیتی است و شما نمیتوانید مستقیم 16 بیت داده در یک پورت بنویسید شما باید عدد را به دو قسمت تقسیم کنید و پس از آن که به پورت 0x03d4 اعلام کردیم که میخواهیم کدام بخش از عدد را بتویسیم هشت بیت از عدد اصلی را در پورت 0x03d5 مینویسیم :


        // Update Cursor Location


    هشت بیت کم ارزش (خود عدد بطور خود کار به uint8_t تبدیل میشود پس بیت های بزرگترش نادیده گرفته میشوند):

    outb(0x03d4,0x0f);
    outb(0x03d5,(CurrentY*COLS + CurrentX));


    هشت بیت با ارزش :

    outb(0x03d4,0x0e);
    outb(0x03d5,(CurrentY*COLS + CurrentX)>>8);


  18. #18

    نقل قول: خواندن ورودی کاربر از کیبرد

    گر دیدم \ و سپس دیدیم n آنگاه کاراکتر 10 را چاپ کنیم و در تابع putchar است که ما بررسی می کنیم که اگر کاراکتر ورودی فرضاً 10 باشد به خط بعد برویم یا چه کار کنیم.
    تا اونجا که من می دونم خود کامپایلر برای شما کدها بعد از / رو تبدیل می کنه. نیازی به این کار نیست. و کاراکترهای کنترلی رو هم نباید چاپ کرد مگر اینکه دلیل خاصی داشته باشه.

    تابع putch:
    http://sourceforge.net/p/arax/code/H...ee/lib/conio.c

    جریان \n رو هم اینقدر پیچیده نکنید. سخت افزار گرافیکی دو مد متنی و مد گرافیکی داره. در مورد متنی هر صفحه یه تعداد ستون و یه تعداد سطر داره. با یه تقسیم کوچیک می تونید برید سطر جدید. یه تابع دو خطی ساده هست به gotoxy در همون فایل بالا نگاه کنید.

    بعد کاراکتر ۱۳ و ۱۰ که میشن \n و \r هر کدوم یه جریانی دارن و همیشه به معنی سطر جدید نیستن. یکی یعنی خالی کردن بافر و یکی دیگه یعنی رفتن به سطر جدید. باید دقت کنید موقع کد نویسی. ممکنه منظور کاربر فقط خالی کردن بافر باشه.

    برای اینکه اشاره گر صفحه نمایش را بروز رسانی کنیم باید در پورت صفحه نمایش بنویسیم جدای از بحث پورت ها صفحه نمایش باید دقت داشته باشید که اشتباه در کد نویسی در مورد صفحه نمایش ممکنه باعث اشکالات سخت افزاری بشود پس پیش از اجرا روی سخت افزار واقعی کدتان را روی شبیه ساز اجرا کنید.
    شما کجا خوندید که می تونه باعث ایجاد مشکل روی سخت افزار شه؟

    من فکر می کنم کاملا دارید اشتباه می کنید. تقریبا به جزء مورد هارد دیسک های خیلی خیلی قدیمی و یه مورد بایوس که حل شده الان. هیچ نرم افزاری نداریم که بتونه به سخت افزار را اونم به این راحتی آسیب بزنه. اگر اینطور بود با هر ویروسی باید یه بار سیستم عوض می کردین.

  19. #19

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    تا اونجا که من می دونم خود کامپایلر برای شما کدها بعد از / رو تبدیل می کنه. نیازی به این کار نیست. و کاراکترهای کنترلی رو هم نباید چاپ کرد مگر اینکه دلیل خاصی داشته باشه.

    تابع putch:
    http://sourceforge.net/p/arax/code/H...ee/lib/conio.c

    جریان \n رو هم اینقدر پیچیده نکنید. سخت افزار گرافیکی دو مد متنی و مد گرافیکی داره. در مورد متنی هر صفحه یه تعداد ستون و یه تعداد سطر داره. با یه تقسیم کوچیک می تونید برید سطر جدید. یه تابع دو خطی ساده هست به gotoxy در همون فایل بالا نگاه کنید.
    عجله نکنید! دوستمون گفتن که میخواهند تابعی بنویسند که مانند printf رشته ای مثل "Hello World \n" را بتواند چاپ کند برای چاپ چنین رشته ای ما باید کاراکتر ها را یک به یک چاپ و بررسی کنیم که اگر یک \ و دقیقا پس از آن یک n دیدیم یعنی باید به خط بعد برویم. پس در اینصورت مثلا همانند آنچه که شما گفتید putch را بصورت زیر فراخوانی میکنیم. که تفاوتی ندارد که ما از 10 استفاده کنیم یا n\ در واقع همانطور که در کد شما هم دیده میشه شما در putch بررسی میکنید که آیا کاراکتر n\ ارسال شده و اگه شده به خط بعدی برویم. ولی فکر کنم جایی دیدم که r\ فقط به ابتدای خط جاری بر میگردد نه به ابتدای خط بعدی که در مورد کد شما این صدق نمی کند.
    putch('\n');


    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    بعد کاراکتر ۱۳ و ۱۰ که میشن \n و \r هر کدوم یه جریانی دارن و همیشه به معنی سطر جدید نیستن. یکی یعنی خالی کردن بافر و یکی دیگه یعنی رفتن به سطر جدید. باید دقت کنید موقع کد نویسی. ممکنه منظور کاربر فقط خالی کردن بافر باشه.
    در مورد فایل ها این دو کاراکتر یعنی 13 و 10 بعنوان Carriage Return و Line Feed عمل میکنند. هنوز درگیر فایلینگ نشدم و منظور شما از بافر را هم فکر کنم بافری است که در زمان خواندن از فایل استفاده میشود و این دو کاراکتر اگر درست حدس زده باشم برروی این بافر اثر گذار خواهند بود.

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    شما کجا خوندید که می تونه باعث ایجاد مشکل روی سخت افزار شه؟
    من فکر می کنم کاملا دارید اشتباه می کنید. تقریبا به جزء مورد هارد دیسک های خیلی خیلی قدیمی و یه مورد بایوس که حل شده الان. هیچ نرم افزاری نداریم که بتونه به سخت افزار را اونم به این راحتی آسیب بزنه. اگر اینطور بود با هر ویروسی باید یه بار سیستم عوض می کردین.
    فصل دهم مجموعه ی آموزشی BrokenThorn قسمت Updating The Hardware Cursor در مورد صفحه نمایش های CRT هشدار داده که اشتباهات ما در کار با کنترلر CRT ممکن است خطرناک باشد.
    http://www.brokenthorn.com/Resources/OSDev10.html


    به نظر من در مورد سخت افزار کامپیوتر فارغ از مسائلی که بعنوان علم در اختیار ما قرار میگیره خیلی مسائل دیگری هم هست که علیه ما مورد استفاده قرار میگیره نمونش در کارهایی که گروه آمریکایی Equation انجام داده دیده میشه.

  20. #20

    نقل قول: خواندن ورودی کاربر از کیبرد

    عجله نکنید! دوستمون گفتن که میخواهند تابعی بنویسند که مانند printf رشته ای مثل "Hello World \n" را بتواند چاپ کند برای چاپ چنین رشته ای ما باید کاراکتر ها را یک به یک چاپ و بررسی کنیم که اگر یک \ و دقیقا پس از آن یک n دیدیم یعنی باید به خط بعد برویم. پس در اینصورت مثلا همانند آنچه که شما گفتید putch را بصورت زیر فراخوانی میکنیم. که تفاوتی ندارد که ما از 10 استفاده کنیم یا n\ در واقع همانطور که در کد شما هم دیده میشه شما در putch بررسی میکنید که آیا کاراکتر n\ ارسال شده و اگه شده به خط بعدی برویم. ولی فکر کنم جایی دیدم که r\ فقط به ابتدای خط جاری بر میگردد نه به ابتدای خط بعدی که در مورد کد شما این صدق نمی کند.
    تابع printf در فایل stdio.c پروژه آراکس هست. من خواستم نشون بدم که لازم نیست دنبال / بگردید خود کامپایلر به معادلش ترجمه می کنه. بعد کد من برای پرینت زمان دیباگ هست. برای من اهمیتی نداره که /n باشه یا /n/r . مهم اینه که بره خط بعد.

    در مورد فایل ها این دو کاراکتر یعنی 13 و 10 بعنوان Carriage Return و Line Feed عمل میکنند. هنوز درگیر فایلینگ نشدم و منظور شما از بافر را هم فکر کنم بافری است که در زمان خواندن از فایل استفاده میشود و این دو کاراکتر اگر درست حدس زده باشم برروی این بافر اثر گذار خواهند بود.
    درسته توی فایلها بافر داریم اما اصلا بحث بافرینگ محدود به فایلها نیست. شما برای هر چیزی می تونید بافر داشته باشید. مثلا بافرهای استریم تا زمانی که eol رو دریافت نکن خالی نمی شن چون یه تابع می تونه کل فرمت استریم رو عوض کنه. و یا بافر پورت سریال می تونه برای جلوگیری از وقفه پشت سر هم باشه. یا بافر کی برد می تونه برای این باشه که چند تا برنامه بتونن محتویات رو بخونن و ....
    اگر منطورتون این هست:
    CRT Monitor failures are violent in nature, and can explode and produce sharp glass fragments to fly at high speeds. It is possible to change frequency settings greater then the devices can handle. This may increase the chanches of a device or microchip to malfunction, producing unpredictable or desasterous results.
    ۱. برای مانیتورهای CRT هستش
    ۲. در مورد فرکانس و اثر فرکانس هست. بله مانیتورهای CRT چون یک لایه فسفر دارن و تابش زیاد یا با اندازه قوی به لایه فسفر می تونه باعث شه خاصیتش از بین بره. مثلا توی بانکها که همیشه یه برنامه با مانیتور نمایش داده می شد قسمتهای خاصی از لایه فسفر رو می سوزوند.در نهایت بعد از اینکه مانیتور رو روشن کردی می تونستی رد برنامه رو ببینی بدون اینکه برنامه باز باشه. (اصلا برای همین بود که screen saver رو ساختن) اما در مورد میکرو چیپ و اثرات دیگه جدای اینکه عملا دیگه از این مانیتورها استفاده نمیشه. حتی مانیتورهایی هم که موجود هستن در مقابل اینجور موارد safe شده بودن.

    می گم اگر موارد نرم افزاری باشه که باعث خرابی سخت افزاری بشه الان شما باید ماهی یکبار سخت افزار عوض می کردین. تنها آسیبی که میشه با نرم افزار به سخت افزار زد گرم کردن اون با استفاده ازش هست (حالا یا کار کشیدن ازش و یا بالا بردن فرکانس) که باز جدای اینکه بخاطر بار زیاد راحت کاربر می تونه متوجه بشه و ویروس کشهای رفتار شناس فورا متوجه جریان می شن. یه سیستم خنک کننده خوب می تونه جلوی اون رو بگیره. مثلا همین چند وقت پیش یه ویروس برای اندروید با استفاده از باز کردن دوربین full hd باعث می شد سخت افزار گوشیهایی مثل sony z3 گرم و کرش کنه. که البته بعد از کرش خود ویروس بر اساس خطای سخت افزاری. دوباره سخت افزار خنک می شد. سخت افزار های دیجیتالی تنها در صورت گرما می سوزن. حتی زمانی که شما بهش ولتاژ اضافه هم شی باعث میشه که جریان بیشتر بکشه و گرم شه و بسوزه. یعنی حتی با ولتاژ اضافه هم در صورت داشتن سیستم خنک کننده خود نمی تونید اون رو بسوزونید که اصلا همینکار (اعمال ولتاژ اضافه) یکی از راه های دیباگینگ سخت افزاری هست که بصورت لحظه ای اعمال می کنن که تا دما بالا نره. حتی فرکانس بالا هم خودش نمی سوزنه بلکه گرمای تولید شده از رابطه زیر هست که می تونه باعث سوختن بشه

    h = v^2 * freq * c * num_tran

    گرمای تولیدی = ولتاژ به توان دو * فرکانس * نشست خازنی * تعداد ترانزستور

    خلاصه کلام اگر شما این گرمای تولید شده رو بتونید مهار کنید به هیچ عنوان سخت افزار دیجیتال شما آسیب نمی مینه. (مگر اینکه بهش ضربه بزنید).

    جدای سخت افزار دیجیتال ما توی کامپیوترها سخت افزار موتوری هم داریم که شامل هارد و فلاپی دیسک و CD-Rom میشه و البته سخت افزار نوری و یکسری از سخت افزارهای آنالوگ.این سخت افزارهای با روشهای متفاوت میشه گفت در مقابل موارد نرم افزاری safe شدن. حالا از درایور خودشون بگیر تا نرم افزارهایی مثل سیستم عامل و ویروس کش.


    یکی از دلیلهایی که من اصرار دارم که این آموزشها می تونن کمک کنن ولی کافی نیستن. همینه. شما بدون اینکه اطلاعات پایه در مورد سخت افزار و ... داشته باشید آموزش رو می بینید و جلو می رید و به نتیجه می رسید اما حتی بخوایین کار یک تابع اون رو هم عوض کنید نمی تونید چون اطلاعات پایه کافی در مورد کامپایلر و سخت افزار و ... رو ندارید. خود منم همین مشکلها برای پیش اومد یادم میاد که توی مولتی تسکیگ یه باگ داشتم که یک ماه وقت من رو گرفت و تنها دلیلش این بود که متوجه رفتار درست کامپایلر در کامپایل کد نشده بودم. تنها با پس و پیش کردن دو خط باگ حل شد. (در صورتی که در برنامه معمولی اصلا امکان نداشت تبدیل به باگ شه). تازه دلیل یکسری از conviction های کدینگ رو فهمیدم. حتی دلیل ساختار یکسری از زبانها مثل پاسکال رو که ازشون بدم می اومد.
    خود من با اینکه توی آراکس جواب گرفته بودم و تجربه کافی رو از قدیم داشتم اما سال ۹۰ اینا بود که متوجه شدم باید بشینم بیشتر بخونم که باعث شد تست های زیادی از سخت افزار بگیرم (مثلا همین PITو PIC و ... رو قطعاتش رو از بازار تهیه کردم) یا اینکه سخت افزار ساختم برای خوندن کی برد و ... (هرچند که خیلی ساده بود) و ... از طرف دیگه روی کامپایلرها کار کردم و زبان اسکریپت خودم رو ساختم. همینطور روی پردازنده و معماری اون کار کردم.‌(مثلا اسمبلی ARM رو یاد گرفتم و یا اینکه ساختار داخلی خود پردازنده ها رو مثل پردازندههای قدیمی و یا حتی جدید مثل ARM و MIPS و ... رو مطالعه کردم) در کنار اون ساختار سیستم عاملهای دیگه رو با جزییات بیشتر مطالعه کردم.

  21. #21

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    تابع printf در فایل stdio.c پروژه آراکس هست. من خواستم نشون بدم که لازم نیست دنبال / بگردید خود کامپایلر به معادلش ترجمه می کنه. بعد کد من برای پرینت زمان دیباگ هست. برای من اهمیتی نداره که /n باشه یا /n/r . مهم اینه که بره خط بعد.
    کامپایلر این رو "hello world \n" بصورت آرایه ای مثل آرایه زیر تفسیر نمیکنه :

    {'h','e','l','l','o',' ','w','o','r','l','d','\n'};



    در ضمن اگر دو برنامه ی زیر را در یک کامپایلر C اجرا کنید تفاوت را متوجه میشوید:
    printf("Hello \r world");
    printf("Hello \n world");

    نمی گم کار شما اشتباهه ولی بنظر من روش استاندارد کار باید پیاده بشود. بهرحال شاید بخواهید بجای استفاده از gotoxy از r\ برای بازگشت به ابتدای خط جاری استفاده کنید و اون به خود شما بستگی دارد.

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    ۱. برای مانیتورهای CRT هستش
    ۲. در مورد فرکانس و اثر فرکانس هست. بله مانیتورهای CRT چون یک لایه فسفر دارن و تابش زیاد یا با اندازه قوی به لایه فسفر می تونه باعث شه خاصیتش از بین بره. مثلا توی بانکها که همیشه یه برنامه با مانیتور نمایش داده می شد قسمتهای خاصی از لایه فسفر رو می سوزوند.در نهایت بعد از اینکه مانیتور رو روشن کردی می تونستی رد برنامه رو ببینی بدون اینکه برنامه باز باشه. (اصلا برای همین بود که screen saver رو ساختن) اما در مورد میکرو چیپ و اثرات دیگه جدای اینکه عملا دیگه از این مانیتورها استفاده نمیشه. حتی مانیتورهایی هم که موجود هستن در مقابل اینجور موارد safe شده بودن.

    می گم اگر موارد نرم افزاری باشه که باعث خرابی سخت افزاری بشه الان شما باید ماهی یکبار سخت افزار عوض می کردین. تنها آسیبی که میشه با نرم افزار به سخت افزار زد گرم کردن اون با استفاده ازش هست (حالا یا کار کشیدن ازش و یا بالا بردن فرکانس) که باز جدای اینکه بخاطر بار زیاد راحت کاربر می تونه متوجه بشه و ویروس کشهای رفتار شناس فورا متوجه جریان می شن. یه سیستم خنک کننده خوب می تونه جلوی اون رو بگیره. مثلا همین چند وقت پیش یه ویروس برای اندروید با استفاده از باز کردن دوربین full hd باعث می شد سخت افزار گوشیهایی مثل sony z3 گرم و کرش کنه. که البته بعد از کرش خود ویروس بر اساس خطای سخت افزاری. دوباره سخت افزار خنک می شد. سخت افزار های دیجیتالی تنها در صورت گرما می سوزن. حتی زمانی که شما بهش ولتاژ اضافه هم شی باعث میشه که جریان بیشتر بکشه و گرم شه و بسوزه. یعنی حتی با ولتاژ اضافه هم در صورت داشتن سیستم خنک کننده خود نمی تونید اون رو بسوزونید که اصلا همینکار (اعمال ولتاژ اضافه) یکی از راه های دیباگینگ سخت افزاری هست که بصورت لحظه ای اعمال می کنن که تا دما بالا نره. حتی فرکانس بالا هم خودش نمی سوزنه بلکه گرمای تولید شده از رابطه زیر هست که می تونه باعث سوختن بشه

    h = v^2 * freq * c * num_tran

    گرمای تولیدی = ولتاژ به توان دو * فرکانس * نشست خازنی * تعداد ترانزستور

    خلاصه کلام اگر شما این گرمای تولید شده رو بتونید مهار کنید به هیچ عنوان سخت افزار دیجیتال شما آسیب نمی مینه. (مگر اینکه بهش ضربه بزنید).

    جدای سخت افزار دیجیتال ما توی کامپیوترها سخت افزار موتوری هم داریم که شامل هارد و فلاپی دیسک و CD-Rom میشه و البته سخت افزار نوری و یکسری از سخت افزارهای آنالوگ.این سخت افزارهای با روشهای متفاوت میشه گفت در مقابل موارد نرم افزاری safe شدن. حالا از درایور خودشون بگیر تا نرم افزارهایی مثل سیستم عامل و ویروس کش.
    1. بله پس بهتره قبل از استفاده بررسی بشه تا بعدها (شاید در یک ماشین قدیمی دیگر) اشکال موجود خطر ایجاد نکنه.
    2. متوجه شدم. ممنون

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    یکی از دلیلهایی که من اصرار دارم که این آموزشها می تونن کمک کنن ولی کافی نیستن. همینه. شما بدون اینکه اطلاعات پایه در مورد سخت افزار و ... داشته باشید آموزش رو می بینید و جلو می رید و به نتیجه می رسید اما حتی بخوایین کار یک تابع اون رو هم عوض کنید نمی تونید چون اطلاعات پایه کافی در مورد کامپایلر و سخت افزار و ... رو ندارید. خود منم همین مشکلها برای پیش اومد یادم میاد که توی مولتی تسکیگ یه باگ داشتم که یک ماه وقت من رو گرفت و تنها دلیلش این بود که متوجه رفتار درست کامپایلر در کامپایل کد نشده بودم. تنها با پس و پیش کردن دو خط باگ حل شد. (در صورتی که در برنامه معمولی اصلا امکان نداشت تبدیل به باگ شه). تازه دلیل یکسری از conviction های کدینگ رو فهمیدم. حتی دلیل ساختار یکسری از زبانها مثل پاسکال رو که ازشون بدم می اومد.
    خود من با اینکه توی آراکس جواب گرفته بودم و تجربه کافی رو از قدیم داشتم اما سال ۹۰ اینا بود که متوجه شدم باید بشینم بیشتر بخونم که باعث شد تست های زیادی از سخت افزار بگیرم (مثلا همین PITو PIC و ... رو قطعاتش رو از بازار تهیه کردم) یا اینکه سخت افزار ساختم برای خوندن کی برد و ... (هرچند که خیلی ساده بود) و ... از طرف دیگه روی کامپایلرها کار کردم و زبان اسکریپت خودم رو ساختم. همینطور روی پردازنده و معماری اون کار کردم.‌(مثلا اسمبلی ARM رو یاد گرفتم و یا اینکه ساختار داخلی خود پردازنده ها رو مثل پردازندههای قدیمی و یا حتی جدید مثل ARM و MIPS و ... رو مطالعه کردم) در کنار اون ساختار سیستم عاملهای دیگه رو با جزییات بیشتر مطالعه کردم.
    یکی از مسائلی که برای من مشکل ایجاد کرده همین اطلاعات پایه ای بوده و به همین دلیل من به شدت مستندات نویسی انجام میدم. هر چه را که نمی دانم در موردش تحقیق میکنم و بعد یادداشت برداری میکنم تا اگر فراموش کردم از آنها استفاده کنم. منتها اول اینکه عمق تحقیقم رو جوری تنظیم میکنم که با زمان تقریبی خودم برای نتیجه گیری مناسب باشه (فعلاً) دوم اینکه من واقعا نمیدونم اگر بخواهم در مورد مثلاً جزئیات کار فلاپی هارد دیسک یا حتی cpu اطلاعات کسب کنم باید چه کتاب یا مقاله ای را بخوانم در مورد cpu کتاب manual اینتل رو پیدا کردم و قراره خواندن اون رو شروع کنم ولی برای سایر دستگاه ها منبعی نمیشناسم اگر کمکم کنید ممنون میشم.

  22. #22

    نقل قول: خواندن ورودی کاربر از کیبرد

    یکی از مسائلی که برای من مشکل ایجاد کرده همین اطلاعات پایه ای بوده و به همین دلیل من به شدت مستندات نویسی انجام میدم. هر چه را که نمی دانم در موردش تحقیق میکنم و بعد یادداشت برداری میکنم تا اگر فراموش کردم از آنها استفاده کنم. منتها اول اینکه عمق تحقیقم رو جوری تنظیم میکنم که با زمان تقریبی خودم برای نتیجه گیری مناسب باشه (فعلاً) دوم اینکه من واقعا نمیدونم اگر بخواهم در مورد مثلاً جزئیات کار فلاپی هارد دیسک یا حتی cpu اطلاعات کسب کنم باید چه کتاب یا مقاله ای را بخوانم در مورد CPU کتاب manual اینتل رو پیدا کردم و قراره خواندن اون رو شروع کنم ولی برای سایر دستگاه ها منبعی نمیشناسم اگر کمکم کنید ممنون میشم.
    هر سخت افزار یک کنترلر داره. شما باید دنبال کنترلرها باشید مثلا برای همین فلاپی باید چندن مدل مختلف کنترل رو یاد بگیرید اشتباه نکنم مشهورترینش NEC بود. بعدش برای هارد دیسک و ..... البته برعکس اولها بعدا برای اکثر سخت افزارها یکسری اینترفیسها ثابت در کنار اینترفیس اصلی اونها اومد. اما خب مواری مثل کارت صوتی و شبکه و کارت گرافیک و .... اینطوری نیستن.

  23. #23

    نقل قول: خواندن ورودی کاربر از کیبرد

    برای چاپ مطلب در یک خط مجزا، تابع writeln رو نوشتم که به این شکل کار میکنه :


    void terminal_writeln(const char* data){
    size_t datalen = strlen(data);
    for(size_t i; i < datalen; i++){
    terminal_putchar(data[i]);
    }
    size_t diff = VGA_WIDTH - datalen;
    for(size_t j; j < diff; j++){
    terminal_putchar(' ');
    }
    }


    در واقع میاد حساب میکنه چقدر تا عرض کنسول خالی داریم بعد کرکتر خالی چاپ میکنه و رشته بعدی میره خط بعدی (حالا چه با terminal_writeln چه با terminal_wirtestring). مرحله بعدی ترکیب کردن این دو تابع با update cursor هست به طوری که بتونم یک prompt تهیه کنم برای سیستم عامل.

  24. #24

    نقل قول: خواندن ورودی کاربر از کیبرد

    دوستان الان یک سوال برام پیش اومده، میشه update_cursor رو با writeln ترکیب کرد، اما سوالی که پیش میاد اینه از کجا بفهمیم خط چندمه؟
    مثلا Hello World توی کرنل توی خط صفرم چاپ میشه. از کجا میشه این رو فهمید؟

  25. #25

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    دوستان الان یک سوال برام پیش اومده، میشه update_cursor رو با writeln ترکیب کرد، اما سوالی که پیش میاد اینه از کجا بفهمیم خط چندمه؟
    مثلا Hello World توی کرنل توی خط صفرم چاپ میشه. از کجا میشه این رو فهمید؟
    در کد شما متغییرهای :
    size_t terminal_row;
    size_t terminal_column;

    این مکان را نگهداری میکنند. و از این طریق شما میتوانید مدیریت کل صفحه رو در دست داشته باشید.

    یک مسئله ی مهم تر اینه که سعی کنید مطالب رو بفهمید و بعد جلو بروید ممکنه خیلی بیشتر طول بکشه تا پیشرفت کنید مهم نیست چون همین زمان گذاشتن هاست که ارزش داره، در غیر اینصورت کلی سورس آماده هست که اصلا نیازی نیست که درگیر مسائلی مثل نوشتن چنین توابعی بشوید.

    عجله نکنید !

    یا علی

  26. #26

    نقل قول: خواندن ورودی کاربر از کیبرد

    خب من به جای کلک زدن و چاپ کرکتر خالی، مقدار terminal_row رو یک واحد افزایش دادم، ولی نتیجه اینطوری میشه :



    اون تو رفتگی رو نخوام باید چه کنم؟

  27. #27

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    خب من به جای کلک زدن و چاپ کرکتر خالی، مقدار terminal_row رو یک واحد افزایش دادم، ولی نتیجه اینطوری میشه :



    اون تو رفتگی رو نخوام باید چه کنم؟
    مشخصه terminal_col هم باید 0 بشه.

  28. #28

    نقل قول: خواندن ورودی کاربر از کیبرد

    خب اون مشکل هم حل شد.
    الان inb و outb و getchar رو دارم. چطور یک gets پیاده سازی کنم؟ که بتونم یک رشته رو از ورودی بخونم؟

  29. #29

    نقل قول: خواندن ورودی کاربر از کیبرد

    کل اینترنت رو زیر و رو کردم ولی چیزی عایدم نشد! نمیدونم الان دقیقا برای prompt داشتن چه کنم :|

  30. #30

    نقل قول: خواندن ورودی کاربر از کیبرد

    نقل قول نوشته شده توسط prpe26 مشاهده تاپیک
    کل اینترنت رو زیر و رو کردم ولی چیزی عایدم نشد! نمیدونم الان دقیقا برای prompt داشتن چه کنم :|
    به قول یه بنده خدایی "اللهم بیر بیر".

    خوب شما وقتی بتونی یک کاراکتر بخونی خواندن هر چیزی دیگه مسئله نیست.

    این وظیفه ی شماست که تعریف کنی ورودی چطور خوانده بشود در کجا ذخیره شود.

    طبعا یا شما میخواهید دستور از ورودی بگیرید یا میخواهید یک رشته بخوانید. اگر میخواهید یک دستور بخوانید بنظر من بهتره یک آرایه 512 تایی از نوع Char تعریف کنید و تا زمانی که کاربر یک کاراکتر خاتمه وارد نکرده این آرایه را پر کنید (و همانطور که میدانید در انتها هم یک 0\ به انتهای رشته اضافه میکنید). کاراکتر خاتمه میتونه کلید Enter یا هرچه که شما میخواهید باشه در ضمن شما باید فکری به حال کلیدهای جهت دار (Arrow Key) و همچنین کلید های کنترلی مثل Backspace نیز بکنید.
    پس شما از این طریق توانیستید دستور بخوانید ولی اگر بخواهید یک رشته بخوانید و آنرا در محلی ذخیره کنید یا همین خواندن دستورتان را توسعه بدهید لازمه که مدیریت حافظه داشته باشید تا بتوانید رشته خوانده شده را در محل درستی قرار دهید و برروی آن کنترل داشته باشید که این بحث مهمیه.

تاپیک های مشابه

  1. حرفه ای: خواندن دو کلید از کیبرد همزمان
    نوشته شده توسط hossein71 در بخش برنامه‌نویسی جاوا
    پاسخ: 1
    آخرین پست: دوشنبه 14 اسفند 1391, 18:00 عصر
  2. خواندن یک کرکتر از ورودی
    نوشته شده توسط delafarin در بخش Java SE : نگارش استاندارد جاوا
    پاسخ: 1
    آخرین پست: سه شنبه 18 اسفند 1388, 14:12 عصر
  3. سوال: خواندن فایل txt از ورودی و انجام اعمال ریاضی روی سطرهای خاصی از آن
    نوشته شده توسط mohammadbm62 در بخش برنامه نویسی در 6 VB
    پاسخ: 1
    آخرین پست: سه شنبه 27 مرداد 1388, 08:15 صبح
  4. سوال: خواندن فایل txt از ورودی و انجام اعمال ریاضی روی سطرهای خاصی از آن
    نوشته شده توسط mohammadbm62 در بخش برنامه نویسی در 6 VB
    پاسخ: 2
    آخرین پست: یک شنبه 25 مرداد 1388, 14:37 عصر
  5. استفاده از مقادیر ورودی کاربر در sql Query
    نوشته شده توسط یعقوب در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 5
    آخرین پست: یک شنبه 22 مرداد 1385, 18:55 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •