Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Sử dụng biến register như thế nào?

  1. #1
    Ngày gia nhập
    07 2008
    Bài viết
    0

    Mặc định Sử dụng biến register như thế nào?

    Mình có ví dụ sau nhưng chạy bị báo lỗi không biết sao (vd trong sách cũ)?
    C Code:
    1. /*dfillreg.c*/
    2. /*bien register*/
    3. #define ROMAX   25
    4. #define COMAX   80
    5. main()
    6. {
    7.     int far *farptr;
    8.     register int col, row;  /*bien register*/
    9.     char ch;
    10.     printf("\nGo ki tu de bat dau, go lai de thay doi:");
    11.     farptr = (int far *) 0xB0000000;
    12.     while ((ch = getche()) != 'x') {
    13.         for (row = 0; row < ROMAX; row++) {
    14.             for (col = 0; col < COMAX; col++) {
    15.                 *(farptr + row * COMAX + col) = (int) ch | 0x0700;
    16.             }
    17.         }
    18.     }
    19. }
    Chỗ màu đỏ là báo lỗi? Các bạn sửa giúp!

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    528

    Trích dẫn Nguyên bản được gửi bởi conde Xem bài viết
    Mình có ví dụ sau nhưng chạy bị báo lỗi không biết sao (vd trong sách cũ)?
    Lỗi gì thế bạn? Bỏ register đi còn lỗi không?

  3. #3
    Ngày gia nhập
    07 2008
    Bài viết
    0

    Bài nãy bạn chỉ đúng rồi, nhưng ý định của chương trình không đúng. VD như bài sau không tô đầy màn hình:
    C Code:
    1. /*dfill.c*/
    2. /*dung tham nhap truc tiep bo nho de to day man hinh*/
    3. #define LENGTH 2000
    4. main()
    5. {
    6.     int far *farptr;
    7.     int addr;
    8.     char ch;
    9.     printf("\nGo vao ki tu de bat dau, go lai de thay doi:");
    10.     farptr = (int far *) 0xB0000000;
    11.     while ((ch = getche()) != 'x') {
    12.         for (addr = 0; addr < LENGTH; addr++) {
    13.             *(farptr + addr) = ch | 0x0700;
    14.         }
    15.     }
    16.     printf("\n");
    17. }
    Bạn xem giúp.

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Thằng getche() và printf() có thư viện nào #include đâu ? Làm sao chạy được !!
    - Dùng register để optimize làm sao có lỗi với nó được ?

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Là do quen thôi, nhìn kiểu truy xuất là biết liền )

    /*dung tham nhap truc tiep bo nho de to day man hinh*/
    Không thể làm được điều này trên Windows, trên Windows màn hình của nó là đồ họa, giả sử là là nó cho truy xuất trực tiếp vùng nhớ đi nữa thì cũng không thể cứ put string/char vào buffer đó là nó xuất ra.

    Tiếp nữa là mỗi process có một không gian địa chỉ riêng, memory của process này bị che khuất trong process khác. Chỉ có thể dùng kỹ thuật của Windows mới có thể truy xuất (ví dụ hook/override Api/INJECT..)

    Dos trên WinNT là Dos giả, như vậy màn hình đen thui của nó là do cmd.exe tạo ra, như vậy mỗi process cmd.exe sẽ có 1 không gian địa chỉ khác nhau
    Giả sử được thì điạ chỉ 0xB0000000; là địa chỉ đang own của process nào đây

    Tiếp nữa đỊA CHỈ 0xB0000000; không phải là địa chỉ do các user mode process, mà đó là địa chỉ của các DLL, module Windows, drivers thiết bị

    Và cuối cùng là driver màn hình chạy ở kernel mode, không thể truy xuất vào memory của nó, muốn giao tiếp chỉ có thể gửi IO request.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Sử dụng biến register như thế nào?

    Đọc ý tưởng anh em cũng hiểu sơ sơ. Rất cám ơn anh. Có điều em vẫn thắc mắc, làm sao không có #include mà nó vẫn hiểu printf() và getche(), dù có chạy trên gì đi nữa em nghĩ phải có thư viện được include vào chứ ?

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Còn em thì chẳng hiểu gì cả, em làm thế này thì nó chạy, nhưng windows báo lỗi don't send, mong mọi người giải thích kĩ hơn.
    C Code:
    1. /*dfill.c*/
    2. /*dung tham nhap truc tiep bo nho de to day man hinh*/
    3. #include <stdio.h>
    4. #include <conio.h>
    5. #include <windows.h>
    6. #define LENGTH 2000
    7. int main()
    8. {
    9.     int far *farptr;
    10.     int addr;
    11.     char ch;
    12.     printf("\nGo vao ki tu de bat dau, go lai de thay doi:");
    13.     farptr = (int far *) 0xB0000000;
    14.     while ((ch = getche()) != 'x') {
    15.         for (addr = 0; addr < LENGTH; addr++) {
    16.             *(farptr + addr) = ch | 0x0700;
    17.         }
    18.     }
    19.     printf("\n");
    20. }

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    528

    nguyentuan2 đã nói nguyên nhân rồi đấy thôi. Bạn không thể dùng một bộ biên dịch 32 bit mà phải dùng một bộ biên dịch 16 bit (dịch cho đích MS-DOS). Ví dụ, TC.

  9. #9
    Ngày gia nhập
    07 2008
    Bài viết
    0

    Như vậy bài này có phải chạy trên DOS không?
    C Code:
    1. /*attrib.c*/
    2. /*changes graphics attributes*/
    3. #define NORMAL  "\x1B[0m"
    4. #define BOLD    "\x1B[1m"
    5. #define UNDER   "\x1B[4m"
    6. #define BLINK   "\x1B[5m"
    7. #define REVERSE "\x1B[7m"
    8. main()
    9. {
    10.     printf("Normal %s Blinking %s Normal \n\n", BLINK, NORMAL);
    11.     printf("Normal %s Bold %s Normal \n\n", BOLD, NORMAL);
    12.     printf("Normal %s Underlined %s Normal \n\n", UNDER, NORMAL);
    13.     printf("Normal %s Reversed %s Normal \n\n", REVERSE, NORMAL);
    14.     printf("%s %s Reversed and Blinking %s \n\n", BLINK, REVERSE, NORMAL);
    15. }
    Để xóa màn hình dùng chuỗi "\x1B[2j" sao chạy không đúng?
    C Code:
    1. /*cfill.c*/
    2. /*dung putch() de dien vao man hinh*/
    3. #define ROMAX   25
    4. #define COMAX   80
    5. #define CLEAR   "\x1B[2j"
    6. main()
    7. {
    8.     int col, row;
    9.     char ch;
    10.     printf("\nGo vao ki tu de bat dau, go lai de thay doi:");
    11.     while ((ch = getche()) != 'x') {
    12.         printf(CLEAR);
    13.         for (row = 0; row < ROMAX; row++) {
    14.             for (col = 0; col < COMAX; col++) {
    15.                 putch(ch);
    16.             }
    17.         }
    18.     }
    19. }
    Hỏi lại cách điều khiển cursor?
    C Code:
    1. /*menu.c*/
    2. /*demonstrates simple menu*/
    3. #define TRUE    1
    4. #define NUM 5
    5. #define CLEAR   "\x1B[2J"           /*xoa man hinh*/
    6. #define ERASE   "\x1B[2K"           /*xoa dong*/
    7. #define NORMAL  "\x1B[0m"           /*thuoc tinh normal*/
    8. #define REVERSE "\x1B[7m"           /*thuoc tinh dao mau*/
    9. #define HOME    "\x1B[1;1f"         /*cursor ve goc trai tren*/
    10. #define BOTTOM  "\x1B[20;1f"            /*cursor ve goc phai duoi*/
    11. #define U_ARRO  72              /*mui ten len*/
    12. #define D_ARRO  80              /*mui ten xuong*/
    13. #define INSERT  82              /*phim INS*/
    14. main()
    15. {
    16.     static char *item[NUM] =        /*cac muc menu*/
    17.             {   "Open",
    18.                 "Close",
    19.                 "Save",
    20.                 "Print",
    21.                 "Quit" };
    22.     int curpos;             /*vi tri cac muc duoc chon*/
    23.     int code;
    24.     printf(CLEAR);              /*xoa man hinh*/
    25.     curpos = 0;             /*chon dinh menu*/
    26.     while (TRUE) {
    27.         display (items, NUM, curpos);   /*hien thi menu*/
    28.         code = getcode();       /*kiem tra ban phim*/
    29.         switch (code) {
    30.             case U_ARRO:    if (curpos > 0) {
    31.                         --curpos;
    32.                     }
    33.                     break;
    34.             case D_ARRO:    if (curpos < NUM-1) {
    35.                         ++curpos;
    36.                     }
    37.                     break;
    38.             case INSERT:    action(curpos);
    39.                     break;
    40.         }
    41.     }
    42. }
    43.  
    44. /*display()*/
    45. /*displays menu*/
    46. display (arr, size, pos)
    47. char *arr[];
    48. int size, pos;
    49. {
    50.     int i;
    51.     printf(HOME);               /*cursor to top left*/
    52.     for (i = 0; i < size; i++) {        /*for each menu item*/
    53.         if (i == pos) {         /*if selected*/
    54.             printf(REVERSE);    /*print in reverse dideo*/
    55.         }
    56.         printf("%s \n", *(arr+i));  /*print item*/
    57.         printf(NORMAL);         /*restore normal attribute*/
    58.     }
    59.     printf(BOTTOM);             /*cursor to lower left*/
    60. }
    61.  
    62. /*getcode()*/
    63. /*gets keyboard code*/
    64. getcode ()
    65. {
    66.     int key;
    67.     while (getch() != 0) {          /*wait for initial 0*/
    68.         ;               /*(ignores normal keys)*/
    69.     }
    70.     return(getch());            /*return code*/
    71. }
    72.  
    73. /*action()*/
    74. /*performs action based on cursor position*/
    75. action(pos)
    76. int pos;
    77. {
    78.     printf(ERASE);              /*erase lower line*/
    79.     switch(pos) {
    80.         case 0: printf("Open"); break;
    81.         case 1: printf("Close"); break;        
    82.         case 2: printf("Save"); break;
    83.         case 3: printf("Print"); break;
    84.         case 4: exit();         /*exit from program*/
    85. }

  10. #10
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi conde Xem bài viết
    Như vậy bài này có phải chạy trên DOS không?
    C Code:
    1. /*attrib.c*/
    2. /*changes graphics attributes*/
    3. #define NORMAL  "\x1B[0m"
    4. #define BOLD    "\x1B[1m"
    5. #define UNDER   "\x1B[4m"
    6. #define BLINK   "\x1B[5m"
    7. #define REVERSE "\x1B[7m"
    8. main()
    9. {
    10.     printf("Normal %s Blinking %s Normal \n\n", BLINK, NORMAL);
    11.     printf("Normal %s Bold %s Normal \n\n", BOLD, NORMAL);
    12.     printf("Normal %s Underlined %s Normal \n\n", UNDER, NORMAL);
    13.     printf("Normal %s Reversed %s Normal \n\n", REVERSE, NORMAL);
    14.     printf("%s %s Reversed and Blinking %s \n\n", BLINK, REVERSE, NORMAL);
    15. }
    Để xóa màn hình dùng chuỗi "\x1B[2j" sao chạy không đúng?
    C Code:
    1. /*cfill.c*/
    2. /*dung putch() de dien vao man hinh*/
    3. #define ROMAX   25
    4. #define COMAX   80
    5. #define CLEAR   "\x1B[2j"
    6. main()
    7. {
    8.     int col, row;
    9.     char ch;
    10.     printf("\nGo vao ki tu de bat dau, go lai de thay doi:");
    11.     while ((ch = getche()) != 'x') {
    12.         printf(CLEAR);
    13.         for (row = 0; row < ROMAX; row++) {
    14.             for (col = 0; col < COMAX; col++) {
    15.                 putch(ch);
    16.             }
    17.         }
    18.     }
    19. }
    Hỏi lại cách điều khiển cursor?
    C Code:
    1. /*menu.c*/
    2. /*demonstrates simple menu*/
    3. #define TRUE    1
    4. #define NUM 5
    5. #define CLEAR   "\x1B[2J"           /*xoa man hinh*/
    6. #define ERASE   "\x1B[2K"           /*xoa dong*/
    7. #define NORMAL  "\x1B[0m"           /*thuoc tinh normal*/
    8. #define REVERSE "\x1B[7m"           /*thuoc tinh dao mau*/
    9. #define HOME    "\x1B[1;1f"         /*cursor ve goc trai tren*/
    10. #define BOTTOM  "\x1B[20;1f"            /*cursor ve goc phai duoi*/
    11. #define U_ARRO  72              /*mui ten len*/
    12. #define D_ARRO  80              /*mui ten xuong*/
    13. #define INSERT  82              /*phim INS*/
    14. main()
    15. {
    16.     static char *item[NUM] =        /*cac muc menu*/
    17.             {   "Open",
    18.                 "Close",
    19.                 "Save",
    20.                 "Print",
    21.                 "Quit" };
    22.     int curpos;             /*vi tri cac muc duoc chon*/
    23.     int code;
    24.     printf(CLEAR);              /*xoa man hinh*/
    25.     curpos = 0;             /*chon dinh menu*/
    26.     while (TRUE) {
    27.         display (items, NUM, curpos);   /*hien thi menu*/
    28.         code = getcode();       /*kiem tra ban phim*/
    29.         switch (code) {
    30.             case U_ARRO:    if (curpos > 0) {
    31.                         --curpos;
    32.                     }
    33.                     break;
    34.             case D_ARRO:    if (curpos < NUM-1) {
    35.                         ++curpos;
    36.                     }
    37.                     break;
    38.             case INSERT:    action(curpos);
    39.                     break;
    40.         }
    41.     }
    42. }
    43.  
    44. /*display()*/
    45. /*displays menu*/
    46. display (arr, size, pos)
    47. char *arr[];
    48. int size, pos;
    49. {
    50.     int i;
    51.     printf(HOME);               /*cursor to top left*/
    52.     for (i = 0; i < size; i++) {        /*for each menu item*/
    53.         if (i == pos) {         /*if selected*/
    54.             printf(REVERSE);    /*print in reverse dideo*/
    55.         }
    56.         printf("%s \n", *(arr+i));  /*print item*/
    57.         printf(NORMAL);         /*restore normal attribute*/
    58.     }
    59.     printf(BOTTOM);             /*cursor to lower left*/
    60. }
    61.  
    62. /*getcode()*/
    63. /*gets keyboard code*/
    64. getcode ()
    65. {
    66.     int key;
    67.     while (getch() != 0) {          /*wait for initial 0*/
    68.         ;               /*(ignores normal keys)*/
    69.     }
    70.     return(getch());            /*return code*/
    71. }
    72.  
    73. /*action()*/
    74. /*performs action based on cursor position*/
    75. action(pos)
    76. int pos;
    77. {
    78.     printf(ERASE);              /*erase lower line*/
    79.     switch(pos) {
    80.         case 0: printf("Open"); break;
    81.         case 1: printf("Close"); break;        
    82.         case 2: printf("Save"); break;
    83.         case 3: printf("Print"); break;
    84.         case 4: exit();         /*exit from program*/
    85. }

    bài này mình trả lời rồi mà
    PHP Code:
    à để dùng được cách lệnh điều khiển ANSI thì trong tập tin config.sys bạn khai báo thêm dòng này :
    DEVICE=ANSI.SYS

    Tuy nhiên xài BC 3.01 hoặc Tc3.0 với OS XP thì ko được đâu
    ...

    hình như nó chỉ có tác dụng với OS DOS hoặc win98 thôi.......
     

    sách đó cũ rồi nên còn lưu lại các lệnh ANSI.
    sách thầy ất ko còn đề cập đến nữa.
    sách thầy ngọc chỉ nói sơ qua tầm 1 dòng
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

Các đề tài tương tự

  1. register trong khi install và gỡ bỏ register khi xóa ứng dụng activeX trong MFC
    Gửi bởi dinhhiencb trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 17-05-2012, 03:52 PM
  2. Lập trình C++ tác dụng của Register
    Gửi bởi ducthanh150792 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 20-01-2012, 08:48 AM
  3. Register trademark in Vietnam
    Gửi bởi cotiencolien trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 20-02-2011, 06:13 PM
  4. Ghi một khóa vào register bằng C# | Giúp mình đoạn mã này?
    Gửi bởi ngclam trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 14-04-2009, 11:11 PM
  5. Thủ thuật register
    Gửi bởi huutrieu2005 trong diễn đàn Thắc mắc chung
    Trả lời: 1
    Bài viết cuối: 27-03-2009, 03:39 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn