Trang 13 / 16 FirstFirst ... 810111213141516 LastLast
Hiển thị kết quả từ 121 đến 130 / 153
  1. #121
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Một số trình bày trong soạn thảo chương trình pascal

    1. Trong chương trình, 01 đoạn lệnh nào đó (có thể là 01 chương trình con-procedure hay function), nếu chỉ chương trình trên của nó dùng - tạm gọi là chương trình mẹ (ví dụ: tính delta trong GPT bậc 2), thị nó nên là đoạn lệnh (hoặc CT con) nằm lồng trong CT mẹ;

    Nếu thấy nó có thể được sử dụng bởi trong nhiều CT khác nhau (ví dụ: hàm Sin, Cos ...), thì ta nên đưa nó vào 01 thư viện dùng chung (vd: MATH.TPU).

    2. Giữa tên procedure/function với tham số của nó (nếu có), giữa các tham số: nên để cách 01 khoảng trắng/ hoặc 01 Tab cho dễ nhìn/ dễ đọc/ dễ chỉnh sửa sau này.

    Ví dụ:
    Code:
    procedure BufferToFile (pBuffer :pointer; dFile :string; Size :longint); 
    var 
        vFile :file;        
    begin 
        Assign     (vFile, dFile); 
        ReWrite    (vFile, 1); 
        BlockWrite (vFile, pBuffer^, Size); 
        Close      (vFile); 
    end;
    3. Đối với từ khóa (từ khóa: chung, khai báo, điều khiển, lặp, toán tử, lựa chọn...):
    - Trong chương trình con nên viết hoàn toàn bằng chữ thường;
    - Trong chương trình chính nên VIẾT HOA các từ khóa:
    PROGRAM, BEGIN, END, TYPE, VAR, LABEL, CONST
    (Kể cả hằng, như: CONST PI = 3,1516926).

    4. Đối với khai báo Kiểu, biến, nhãn, hằng (TYPE, VAR, LABEL, CONST): nếu chỉ có 1 thì để cùng hàng với từ khóa; từ 2 trở lên thì cho xuống hết từng dòng một.
    Nên khai báo từng dòng cho từng biến, kể cả chúng cùng kiểu với nhau.
    (Nếu không quá nhiều biến ...)

    Ví dụ:
    Code:
    {Trong 1 dòng}
    
    USES CRT;
    TYPE TSTRING64 = String [64];
    VAR vX :Byte;
    
    {Trong nhiều dòng}
    USES
        CRT,
        DOS,
        GRAPH;
    TYPE 
        TSTRING64 = String [64];
        TSTRING32 = String [32];
    VAR 
        vX :Byte;
        vY :Byte;
        vZ :Byte;
        vS :String [100];
    5. Ở đầu chương trình chính/chương trình con: nên có chú thích về: chức năng của nó, các thư viện/các chương trình hay các biến dùng bên ngoài CT, các lưu ý nếu có ...
    Khi cần thiết thì chú thích cho cả code.
    Một chương trình hoàn chỉnh (dịch được/chạy được) có thể chỉ bao gồm BEGIN END không cần từ khóa nào khác; trước từ khóa END không nhất thiết phải có dấu ";" nhưng nên dùng báo đầy đủ.

    6. Các hàm nào được gọi từ 1 UNIT ngoài (Khai báo trong phần USES <Tên các UNIT>)
    thì nên đưa cả tên của UNIT đó vào bên cạnh tên hàm đó, bởi các hàm trong các thư viện có thể có tên giống nhau (giống/khác tham số, sửa đổi/bổ sung chức năng..) ==> sửa lỗi; sửa đổi nâng cấp thư viện, tránh nhiều tên cho 1 hàm ..
    Ví dụ: Trong thư viện Graph.TPU có thủ tục InitGraph khởi động chế độ đồ họa; có thư viện ABC.TPU cũng có thủ tục khởi động chế độ đồ họa như InitGraph của Graph.TPU nhưng mạnh hơn; Nhưng thay vì đổi tên để tránh trùng tên như InitGraph1, MyInitGraph... nhiều phức tạp, thì ta vẫn lấy tên là InitGraph thêm tên UNIT đó vào trước (và bây giờ luôn biết InitGraph là thủ tục khởi động chế độ đồ họa); Khi cần dùng hàm/thủ tục trong trường hợp nào của thì dùng unit đó.
    - Graph.InitGraph .....
    - ABC.InitGraph .....
    ...

    7. Chỉnh TAB:
    - Nếu soạn code trong IDE của BP/TP, vào Option/Envỉonment/Editor chọn TAb Size = 4;
    - Nếu soạn trong Notepad++:
      + Vào menu: Setting/Preferences/
      + Tìm Tab: Language Menu /Tab Settings
      + Chọn Tab Size = 4; và check vào ô Replace by Space.
    Được sửa bởi ada95 lúc 21:02 ngày 05-02-2016 Reason: Bổ sung nội dung, Định dạng code

  2. #122
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Borland Pascal 7 trong Windows gọn nhẹ

    Cài đạt BP7 FULL từ đầu (gồm khoảng ~105file ~14MB)
    Sau khi cài máy thì có ~780file ~26MB (lúc này copy đâu cũng mất chút thời gian).
    Nếu cần gọn nhẹ, nhanh chóng, dễ dàng mang đi đây đó, các bạn chỉ cần chép các file sau là đủ cho trình biên dịch hoạt động:

    =10 FILE với dung lượng chỉ ~1,2MB:

    1. BPW.EXE (IDE)
    2. BWCC.DLL
    3. PBROWSER.DLL
    4. TCOLORCC.DLL

    5. TURBO.TPL (Thư viện chuẩn)
    6. TPW.TPL (Nếu không lập trình với Win thì có thể không cần chép)
    7. TPP.TPL (Nếu không lập trình chế độ bảo vệ thì có thể không cần chép)

    8. bpw.psm (03 file cấu hình)
    9. bpw.cfg
    10. bpw dsk


    **Trong lần khởi động đầu tiên, vào menu COMPILE chỉnh TARGET là REAL.
    Sau khi thoát Chương trình sẽ hỏi nơi lưu cấu hình mới, ta chọn nơi lưu (chỉ 01 lần đầu, sau này BP không hỏi nữa)
    Được sửa bởi ada95 lúc 21:04 ngày 05-02-2016 Reason: Định dạng

  3. #123
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Phối hợp NOTEPAD++ và BPW7

    Nếu dùng pascal trong windows, các bạn nên sử dụng trình soạn thảo NOTEPAD++

    Đây là một chương trình rất hay:

    - Soạn thảo dễ dàng như trong WORD.

    - Hỗ trợ Highlight mã, căn lề, chú thích...

    - Có gợi ý và hoàn thành hàm, từ khóa mỗi khi gõ lệnh:
    + Vào menu Setting ->Preferences->Backup/Auto-Completion
    + Đánh dấu 3 ô:
    X Enable Auto-Completion ...
    X Function Completion
    X Function parameters hint ...

    - Hỗ trợ xuất sang định dạng htm v.v ...
    + Menu Plugins -> nppExport ...

    - Đặc biệt: Khi vào menu ENCODING và đánh dấu chọn vào mục Encode in UTF-8 without BOM, và lưu lại file, thì ta có thể ghi chú thích được bằng TIẾNG VIỆT, hoàn toàn không gây lỗi khi biên dịch trpng TPC, BPC, BPW

    (Để mặc định: Vào menu Setting ->Preferences->New Doccument->UTF-8 without BOM->Apply ..)

    * Sau khi soạn xong, mở BP7 lên, kéo thả file vào và dịch ...
    Được sửa bởi ada95 lúc 21:04 ngày 05-02-2016 Reason: Sửa tiêu đề, Bổ sung nội dung và Định dạng

  4. #124
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Phối hợp Notepad++ tpc.exe

    Khi cần gọn nhẹ hơn nữa, thì chỉ cần 02 file TPC.EXE với TURBO.TPL.
    (Đồ họa thì thêm GRAPH TPU và EGAVGA OBJ)

    Soạn lệnh trong notepad++ (hay bất kỳ trình soạn thảo nào), lưu file, sau đó vào Dos: tpc /B <FILE> .PAS

    vn_grap~.pas.jpg
    Được sửa bởi ada95 lúc 14:34 ngày 15-07-2016 Reason: Sửa tiêu đề và Định dạng

  5. #125
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Tạo thư viện liên kết động (*.DLL) dùng trong Windows

    Thư viện (Library) liên kết động trong pascal chương trình cơ bản giống Unit;
    Khác nhau ở trình bày một số điểm chính (từ khóa chữ hoa/thường đều được):
    - Từ UNIT ở đầu thay bằng LIBRARY; (Ten thu vien van trung ten file luu tren dia}
    - Không có IMPLEMENTATION;
    - Sau tên mỗi Chương trình con để gọi từ ngoài có thêm từ khóa EXPORT ;
    - Có phần khai báo EXPORTS, đây là phần ta đánh chỉ số INDEX cho mỗi function/procedure có trong thư viện, đề từ đó gọi từ các Chương trình ngoài khác.

    VÍ DỤ:
    Code:
    LIBRARY DDTH;
    
    {1. PHẦN KHAI BÁOO KIỂU, HẰNG, BIẾN DÙNG CHUNG TRONG THƯ VIỆN, NẾU CÓ}
    {
    TYPE ....
    CONST ....
    VAR ....
    }
    
    {2. PHẦN CỤ THỂ CÁC CHƯƠNG TRÌNH CON} {thư viện này có 2 hàm:}
    function fileExist (filename :string) :boolean; EXPORT;
    var vfile :file;
    begin
         {$I-}
         assign (vfile, filename);
         reset (vfile);
         close (vfile);
         {$I+}
         fileExist := (IOResult=0) and (filename<>'');
    end;
    {-------------------}
    function sum (a, b :byte) :integer;  EXPORT;
    begin
        sum := a+b;
    end;    
    
    {3. PHẦN ĐÁNH CHỈ SỐ CHO CÁC CHƯƠNG TRÌNH CON CÓ TRONG THƯ VIỆN NÀY}
    EXPORTS
    fileExist   INDEX 1,
    sum         INDEX 2;
    
    {4. MAIN}
    BEGIN
    {Khởi tạo, nếu có}
    END.
    Được sửa bởi ada95 lúc 12:24 ngày 18-11-2014 Reason: Sửa Định dạng

  6. #126
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Tạo thư viện liên kết động (DLL) dùng trong Windows (tt)

    Cách sử dụng thư viện DDTH trên như sau:
    - Khai báo các hàm ta dùng có trong thư viện đó;
    - Thêm theo sau mỗi hàm là FAR; EXTERNAL 'DDTH' INDEX ***;
    --
    Code:
    PROGRAM TESTDLL;
    USES   WinCRT;
    
    {1. PHẦN KHAI BÁO CÁC HẰNG, BIẾN, KIỂU TRONG CHƯƠNG TRÌNH}
    {
    TYPE ....
    CONST ....
    VAR ....
    }
    
    {2. PHẦN KHAI BÁO CÁC HÀM/THỦ TỤC TRONG THƯ VIỆN}
    {$F+}
    
    function fileExist (filename :string) :boolean; FAR; EXTERNAL 'DDTH' INDEX 1;
    
    function Sum (a, b :byte) :integer;FAR; EXTERNAL 'DDTH' INDEX 2;
    
    {$F-}
    
    {3. CÁC CHƯƠNG TRÌNH CON SỬ DỤNG THƯ VIỆN}
    {Nếu có}
    {4. CHƯƠNG TRÌNH CHÍNH}
    BEGIN    
        InitWinCRT; 
        
        GotoXY (2, 5);
        Writeln ('tong cua 5 va 7 la :', Sum (5,7));
        Readln; {repeat until KeyPressed;}
        
        if fileExist ('ddth.pas') then Writeln ('file ddth.pas ton tai tren dia')
        else ('file ddth.pas khong ton tai tren dia');
        Readln;
        
        DoneWinCRT;
    END.
    **Yêu cầu có thư viện WinCrt TPU.

    --
    Được sửa bởi ada95 lúc 15:29 ngày 13-07-2016 Reason: Sửa định dạng

  7. #127
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Sử dụng function như procedure

    Hàm (function) khác thủ tục (procedure) ở chỗ tuy cũng là chương trình con nhưng kết thúc hàm có trả lại một giá trị thông qua tên hàm của nó.

    Pascal có 1 điều thú vị là cho phép sử dụng hàm như một thủ tục.
    Đó là ta có thể gọi hàm như thủ tục, trong đó nó tính toán, hoặc làm điều gì đó như thủ tục; Nhưng phải trả về cho hàm 1 giá trí cuối cùng nào đó.

    Ví dụ:
    Code:
    USES Crt, Graph;
    {....
    ....}
    
    {$L EGAVGA} procedure EGAVGABGI; external;
    function InitGraphEGAVGA :boolean ;
    var 
        GraphDriver :Integer;
        GraphMode   :Integer;
    begin
        GraphDriver :=     Detect;
        RegisterBGIDriver (addr(EGAVGABGI));     {=RegisterBGIDriver(<at>EGAVGABGI};
        InitGraph         (GraphDriver, GraphMode,'');
        InitGraphEGAVGA :=(GraphResult = 0);
    end;

    **Tạo EVAVGA_OBJ từ EVAVGA_BGI bằng lệnh dos:
    BINOBJ EVAVGA_BGI EVAVGA EGAVGABGI


    Chương trình con InitGraphEGAVGA khởi động chế độ đồ họa,
    và trả về kết quả là InitGraphEGAVGA := (GraphResult = 0).

    Thì trong chương trình chính, sử dụng cả 2 cách sau đều được:

    Cách 1: Dùng như 1 FUNCTION bình thường, Khi cần kiểm tra:
    Code:
    BEGIN
        if not InitGraphEGAVGA then;
            begin 
                WriteLn ('Co loi trong khoi dong do hoa');
                Halt (1);
            end
        else
            begin
            SetColor (BLUE);
            MoveTo (10, 10);
            LineTo (50, 50);
            ..........
            ..........
            CloseGraph;
            end;
    END.
    Cách 2: Dùng như 1 PROCEDURE; Không kiểm tra qua tên hàm
    Code:
    BEGIN
        InitGraphEGAVGA; 
        ...........
        ...........
        CloseGraph;
    END.

    **Như vậy ta có thể khai báo hoàn toàn các chương trình con là function.
    Kể cả các thủ tục nhập xuất dữ liệu, thông báo ... miễn là trả về cho nó 1 kết quả trong tên hàm.
    **Tuy nhiên: Cẩn trọng nếu sử dụng.

    Được sửa bởi ada95 lúc 21:11 ngày 05-02-2016
    Life - Love - Freedom

  8. #128
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Sử dụng biến trong chương trình con (CTC)

    - Hạn chế sử dụng biến toàn cục; Biến toàn cục chỉ nên được sử dụng trong thân của chương trình chính: truyền tham số cho các CTC tính toán và nhận kết quả (function), hoặc để CTC thực hiện công việc nào đó (procedure). Và mọi sự thay đổi biến toàn cục thực hiện tại đây.

    - Trong CTC: chỉ sử dụng biến cục bộ, hoặc biến được truyền trong tham số của nó, chỉ sử dụng hằng số và kiểu của chương trình chính. Không có lệnh nào của CTC sử dụng (một cách tường minh) biến toàn cục hay làm thay đổi biến toàn cục,
    (Mà nếu phải thay đổi biến toàn cục thì phải thông qua tham số của CTC, mà việc này phải được thực hiện tại thân của Chương trình chính như trên).

    - Các chương trình con không được sử dụng bất cứ biến nào ngoài biến trong tham số của nó.

    - Việc nhập dữ liệu/thông số đầu vào; xử lý/tính toán; và việc xuất kết quả ra màn hình/file nên tách biệt và đưa vào các CTC khác nhau.

    - Các biến trong CTC nếu không chỉ rõ kiểu, thì trình dịch ngầm hiểu đó lá biến kiểu con trỏ.
    Ví dụ:

    VAR
    C; {=>lỗi, vì không khai báo kiểu}
    procedure XYZ (var test); {OK!}
    ..............
    ..................
    BEGIN
    ................
    .....................
    END.
    Được sửa bởi ada95 lúc 07:10 ngày 11-12-2014 Reason: Bổ sung và sửa bài viết
    Life - Love - Freedom

  9. #129
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Sử dụng biến trong chương trình (tt)

    Biến, Kiểu, Hằng toàn cục có thể khai báo ở bất cứ đâu trong chương trình, không nhất thiết phải ở đầu chương trình (Nhưng không thuộc thân chương trình chính), như:

    Code:
    {-------------------------------------------------------------}
    PROGRAM TEST;
    {Vị trí 1.--------------------Khai báo 1-----------------------------}
    
    TYPE
        TS4=String[4];
    CONST 
        C1=1000;
    VAR
         vB :byte;
    
    {-------------------Các chương trình con------------------}
    
        procedure AAA ......;
        procedure PPP ......;
    
    {Vị trí 2.--------------------Khai báo 2--------------------}
    
    VAR
         HHHHH :byte;
    
        function FFF......;
        procedure WWW ......;
    .................................;
    ....................................;
    
    {Vị trí 3.--------------------Khai báo 3---------------------}
    TYPE
        TS8=String[8];
    CONST 
        C2=2000;
    VAR
         vH :byte;
    
    {--------------Thân chương trình chính--------------------}
    BEGIN  
    
        {code}
    
    END.
    => Có thể khai báo ở 3 vị trí khác nhau:
    VT1: đầu chương trình, thông dụng.
    VT2: giữa các chương trình con.
    VT3: Ngay trước thân chương trình chính.
    Nhưng dễ và chắc chắn kiểm soát được là ở vị trí 1 (các vị trí khác có thể khiến mất kiểm soát biến, tìm và sửa lỗi)

    **Tuy nhiên, với chương trình dài, thì có thể khai báo Biến/Kiểu/Hằng ở VT3 để test chương trình; Xong thì đưa lên VT1-đầu chương trình.
    Được sửa bởi ada95 lúc 21:10 ngày 05-02-2016 Reason: Định dạng
    Life - Love - Freedom

  10. #130
    Tham gia
    13-08-2012
    Location
    Vĩnh Cửu, Đồng Nai
    Bài viết
    95
    Like
    9
    Thanked 9 Times in 8 Posts

    Cấp phát bộ nhớ lớn hơn 64 KB

    Trong chế độ thực, Turbo Pascal giới hạn phân đoạn dữ liệu (data segment) 64KB=65536 Byte.
    Mọi khai báo Biến, Kiểu, cấp bộ nhớ ... đều phải có kích thước <=64KB.
    Nếu >64KB: gây lỗi, sẽ không thể biên dịch được.

    Ví dụ:
    Code:
    TYPE 
        TB = array [0..66000] ò Byte;    {   => Lỗi}
    
    VAR
        vP :Pointer;
    
    BEGIN
        GetMem (vP, 65540);                {   => Lỗi}
        ............................;
        .....................................;
        FreeMem (vP, 65540);              {    => Lỗi}
    END.
    Vậy, làm thế nào để cấp biến nhớ lớn hơn 64KB ?
    Trong DOS, có cách giải quyết như sau:

    - Trong các ngắt (interrupt) của DOS (ngắt 21h) có:
    ...+ Hàm 48h: là cấp phát bộ nhớ RAM; --Như thủ tục GetMem;
    ...+ Hàm 49h: giải phóng bộ nhớ RAM; --Như thủ tục FreeMem;
    ...+ Hàm 4ah: thay đổi kích thước vùng nhớ.
    ...
    Trong phần này ta chỉ quan tâm đến hàm 48h và 49h.

    - Phần vùng nhớ cấp phát được lấy từ Bộ nhớ quy ước (?) (Conventional Memory: Là vùng bộ nhớ từ 0 KB đến 640KB trong DOS).

    - Kích thước vùng nhớ yêu cầu cấp phát được tính theo paragraph (nghĩa là: đoạn, phần ???).
    Mỗi paragraph = 16 byte.
    Do đó: số paragraph cần cấp = Số Byte cần cấp chia cho 16.
    Ví dụ: nếu cần cấp 64KB bộ nhớ thì phải yêu cầu cấp (64*1024)/16=4096paragraph.

    - Mô tả các hàm:

    Code:
    {Cấp bộ nhớ}
    function Alloc (vPara :Word) :Word; Assembler;
    {Nếu thành công, Hàm này trả về giá trị kiểu Word,
    là địa chỉ đoạn của vùng nhớ được cấp phát}
    asm
        mov ah,48h      {Hàm 48h}
        mov bx,vPara    {Số paragraph bộ nhớ cần cấp phát}
        inc bx
        int 21h         {Gọi ngắt 21h}
        jnc @OK      {Cờ Carry = 0: Thành công}
        mov ax,$ffff    {Cờ Carry = 1: Lỗi, thanh ghi ax lúc này chứa mã lỗi: }
                        {ax=7: Khối điều khiển bộ nhớ bị xóa}
                        {ax=8: Không đủ RAM; bx= kích thước bộ nhớ còn lại của RAM tính bằng paragraph}
        @OK:         {Cờ Carry = 0: Thành công}
    
    end;
    
    {Giải phóng bộ nhớ}
    procedure DeAlloc (vSegment :Word); Assembler;
    asm
        mov ah,49h      {Hàm 49h}
        mov es,vSegment {vSegment: Địa chỉ đoạn của vùng nhớ cần giải phóng}
        int 21h         {Gọi ngắt 21h}
    end;
    **Alloc: allocate/allocation: cấp phát
    (code demo bổ sung sau)
    Được sửa bởi ada95 lúc 15:32 ngày 13-07-2016 Reason: Bổ sung bài viết
    Life - Love - Freedom

Trang 13 / 16 FirstFirst ... 810111213141516 LastLast

Tags for this Thread

Bookmarks

Quy định

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