Truyền tham số cho chương trình con trong Pascal

Thứ tư - 29/07/2020 10:16

Chương trình con (CTC) có thể được khai báo mà không dùng tham số khi các CTC tính toán trực tiếp với các biến toàn cục hoặc CTC không dùng đến bất cứ biến hay hằng nào. Việc truyền tham số cho CTC là một cơ cấu thay thế tương ứng, nó cho phép một quá trình có thể được lặp đi lặp lại nhiều lần với các toán hạng khác nhau.

Loading...
Thí dụ Enter (A, B) sẽ thay thế A vào vị trí của X, B vào vị trí của Y. Tương tự với Enter (C, D). Các tham số hình thức trong khai báo của CTC sẽ được thay thế bởi các tham số thật sự.
Danh sách nhóm các tham số hình thức cùng kiểu nhau sẽ được đặt cách nhau bằng dấu phẩy (,), các nhóm số khác kiểu được đặt cách nhau bởi dấu chấm phẩy (;).

- Ví dụ :
Procedure Test (I, J : integer ; var X, Y : real) ;
Danh sách các tham số thực sự khi gọi đến CTC sẽ phải tương ứng và nhất quán với danh sách các tham số hình thức được khai báo trong phần khai báo của CTC. Trong ngôn ngữ PASCAL, khi truyền tham số, đòi hỏi phải có sự tương ứng hoàn toàn về kiểu dữ liệu của tham số hình thức và tham số thực sự tương ứng với nó. Sự tương ứng mà PASCAL đòi hỏi là tương ứng về tên. Nghĩa là tham số hình thức và tham số thực sự phải thuộc về một kiểu dữ liệu theo tên. Nếu kiểu dữ liệu của tham số hình thức và tham số thực sự có cùng cấu trúc nhưng khác tên cũng sẽ không được chấp nhận.
Có hai cách truyền tham số: tham trị (value parameter) và tham biến (variable parameter).

a) Truyền tham số theo kiểu tham biến :
Tham sô hình thức trong phần khai báo của CTC sẽ được đặt sau từ khóa Var. Với tham biến, các tham số thực sự sẽ phải là các biến chứ không được là giá trị. Thí dụ lời gọi Enter (3, 7) sẽ không được chấp nhận vì 3 và 7 là hai giá trị chứ không phải là biến. Cạc tham số thực sự tương ứng với các tham biến có thể được thay đổi giá trị trong CTC va khi ra khỏi CTC nó vẫn giữ các giá trị đã thay đổi đó. Để dễ hiểu, ta có thể mường tượng tham biến và tham số thực sự tương ứng với nó như là hai tên A, B của cùng một người. Khi ta gọi người này có thể bằng tên nào cũng được. Việc gì xảy ra đối với A cũng là xảy ra đối với B.
Ngoài các biến có thể đóng vai trò tham biến, các hằng số có định kiểu cũng có thể giữ vai trò này.

b) Truyền tham số theo kiểu tham trị :
Khi khai báo các tham sô mà không có từ khóa Var trong một nhóm tham sô hình thức thì các tham số của nhóm này là các tham số giá trị (tham trị). Khi đó các tham số thực phải là một biểu thức (ví dụ đơn giản của một biếu thức là một biến hoặc một hằng). Tham số hình thức tương ứng sẽ được coi như một biến địa phương của CTC. CTC sau đó sẽ có thề thay đổi giá trị của tham trị này ở bên trong CTC bằng các phép gán, hay một cách bất kì nào khác, sõng trong mọi trường hợp điều đó không làm thay đổi giá tri của tham số thực. Do vậy một tham trị không bao giờ là kết quả tính toán của CTC.
Để dễ hiểu, chúng ta có thể hình dung tham trị như là bản sao của tham số thực với nó. Ban đầu chúng giống nhau hoàn toàn. Nhưng dù chúng ta có thay đổi gì trong bản sao này bản chính vẫn còn nguyên vẹn, không suy suyển.
Sự khác nhau giữa hai loại tham số này được minh họa một cách cô đọng bằng ví dụ sau:

PROGRAM THAM_SO ;
     VAR
           a, b : integer ;
     PROCEDURE Thidu_Thamso (x : integer ; var y : integer) ;
     Begin
           x := x + 1 ;
           y := y + 1 ;
           Writeln (x : 6, y : 6) ;
      End ;
Begin
       a :3 ; b := 3 ;
       Thidu_Thamso (a, b) ;
       Writeln (a : 6, b : 6)
End.
Kết quả cho ra :
                  4       4
                  3       4
Trong thí dụ trên, thủ tục Thidu_Thamso có hai loại tham số: tham trị x và tham biến y. Trước khi gọi thủ tục này với hai tham số thực là a và b tương ứng thì a = b = 3. Trong thủ tục ta có hai lệnh làm tăng giá trị của x và y thêm 1. Lệnh in Writeln (x, y) cho ra kết quả là 4 và 4 tương ứng. Tuy nhiên sau khi ra khỏi CTC, lệnh in Writeln (a, b) cho ta kết quả 3 và 4. Điều này cho thấy, chỉ có giá trị của b bị thay đổi sau khi thực hiện thủ tục vì 3 là tham biến còn a vẫn giữ nguyên giá trị trước khi gọi thủ tục, tức là a vẫn bằng 3 vì chỉ là tham trị.

Như vậy khi truyền một tham số cho CTC, nếu ta muôn bảo vệ giá trị của tham số đó khỏi bị CTC “vô tình phá” thì tham số đó phải được dùng như là tham trị. Còn một tham số nếu muốn dùng để lấy kết quả do CTC đem lại thì tham số đó phải là tham biến.

b) Việc bộ trí bộ nhớ :
Lời gọi một CTC sẽ bó trí ô nhớ trong vùng nhớ ngăn xếp (stack) cho các biến địa phương. Sau đó nó sẽ copy (sao lại) các giá trị của tham số thực ở bên ngoài CTC vào các ô nhớ này. Khi ra khỏi CTC, các ô nhớ này cũng được giải phóng. Điều đó giải thích vì sao các tham trị chỉ bị thay đổi bên trong CTC còn các tham số thực thì không bị thay đổi sau khi ra khỏi CTC. Đối với tham biến, CTC sẽ dùng các ô nhớ của chính các biến đó bằng cách dùng con trỏ trỏ vào các tham số thực. Điều này giải thích tại sao tất cả các thay đổi liên quan đến tham biến cũng ảnh hưởng đến các tham sô thực tương ứng với nó. Điều đó cũng có nghĩa là tốc độ truyền tham số của tham biến nhanh hơn của tham trị vì nó không mất thời gian copy, nhất là trong trường hợp tham số là kiểu dừ liệu có cấu trúc (ví dụ là một mảng dữ liệu có kích thước lớn).
Loading...

  Ý kiến bạn đọc

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây