Định nghĩa hàm
Định nghĩa hàm bao gồm kiểu giá trị mà nó trả về, một định danh, danh sách các tham số trong dấu ngoặc đơn, và một phần thân — một khối mã chứa các câu lệnh. Các tham số trong danh sách được phân tách bằng dấu phẩy. Mỗi tham số được cung cấp một kiểu, một tên và tùy chọn một giá trị mặc định.
result_type function_identifier ( [parameter_type parameter_identifier
= value_by_default] ,... )
{
[statement]
...
}
2
3
4
5
6
Được phép tạo các hàm không có tham số: khi đó không có danh sách, và dấu ngoặc rỗng được đặt sau tên hàm (chúng không thể bị bỏ qua). Tùy chọn, bạn có thể viết từ khóa void
giữa các dấu ngoặc để nhấn mạnh rằng không có tham số. Ví dụ, như sau:
void OnStart(void)
{
}
2
3
Sự kết hợp giữa kiểu trả về, số lượng và kiểu của các tham số trong danh sách được gọi là nguyên mẫu hoặc chữ ký của hàm. Các hàm khác nhau có thể có cùng nguyên mẫu.
Trong các phần trước, chúng ta đã thấy các định nghĩa hàm như OnStart
và Greeting
. Bây giờ hãy thử triển khai việc tính toán các số Fibonacci như một hàm thử nghiệm. Các số này được tính bằng công thức sau:
f[0] = 1
f[1] = 1
f[i] = f[i - 1] + f[i - 2], i > 1
2
3
Hai số đầu tiên là 1, và tất cả các số tiếp theo là tổng của hai số trước đó. Chúng ta đưa ra phần đầu của dãy: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
Bạn có thể tính số tại một chỉ số đã cho bằng hàm sau (FuncFibo.mq5
).
int Fibo(const int n)
{
int prev = 0;
int result = 1;
for(int i = 0; i < n; ++i)
{
int temp = result;
result = result + prev;
prev = temp;
}
return result;
}
2
3
4
5
6
7
8
9
10
11
12
Hàm này nhận một tham số n
kiểu int
và trả về kết quả kiểu int
. Tham số n
có bộ điều chỉnh const
vì chúng ta không định thay đổi n
bên trong hàm (việc khai báo rõ ràng các hạn chế về "quyền" của biến như vậy được khuyến khích vì nó giúp tránh các lỗi ngẫu nhiên).
Các biến cục bộ prev
và result
sẽ lưu trữ các giá trị hiện tại của hai số cuối cùng trong dãy. Trong vòng lặp qua i
, chúng ta tính tổng của chúng, thu được số tiếp theo của dãy. Trước đó, giá trị cũ result
được ghi vào biến temp
, để sau khi cộng, nó được chuyển sang prev
.
Sau khi thực hiện vòng lặp một số lần nhất định, biến result
chứa số mong muốn. Chúng ta trả nó về từ hàm bằng câu lệnh return
.
Tham số đầu vào của hàm cũng là một biến cục bộ sẽ được khởi tạo với giá trị thực tế trong quá trình gọi hàm. Giá trị này được truyền "từ bên ngoài" từ câu lệnh gọi hàm.
Tên tham số phải là duy nhất và không được trùng với tên của các biến cục bộ.
Phần thân của hàm là một khối mã xác định phạm vi và thời gian sống của các biến cục bộ. Nguyên tắc định nghĩa và hoạt động của chúng đã được thảo luận trong các phần Câu lệnh khai báo/định nghĩa và Khởi tạo.