Sử dụng mảng
Giá trị được ghi vào và đọc từ các phần tử mảng bằng cú pháp tương tự và chỉ định các chỉ số bắt buộc trong dấu ngoặc vuông. Để đưa giá trị vào một phần tử, chúng ta sẽ sử dụng phép toán gán =
. Ví dụ, để thay thế giá trị của phần tử thứ 0
của mảng một chiều:
array1D[0] = 11;
Việc lập chỉ mục bắt đầu từ 0
. Chỉ mục của phần tử cuối cùng bằng số lượng phần tử trừ đi 1. Tất nhiên, chúng ta có thể sử dụng cả hằng số và bất kỳ biểu thức nào khác có thể được rút gọn thành kiểu số nguyên (để biết thêm chi tiết về biểu thức, hãy xem chương sau ), chẳng hạn như biến số nguyên, lệnh gọi hàm hoặc phần tử của mảng khác chứa số nguyên (địa chỉ gián tiếp) làm chỉ mục.
int index;
// ...
// index = ... // assign an index somehow
// ...
array1D[index] = 11;
2
3
4
5
Đối với mảng đa chiều, chỉ mục phải được chỉ định cho tất cả các chiều.
array2D[index1][index2] = 12;
Các kiểu số nguyên được phép loại trừ long
và ulong
cho các chỉ mục. Nếu chúng ta thử sử dụng giá trị của "số nguyên dài - long
" làm chỉ mục, nó sẽ được chuyển đổi ngầm thành int
, do đó trình biên dịch đưa ra cảnh báo "có thể mất dữ liệu do chuyển đổi kiểu".
Truy cập đọc vào các phần tử mảng được sắp xếp theo cùng một nguyên tắc. Ví dụ, đây là cách một phần tử mảng có thể được in trong nhật ký:
Print(array2D[1][2]);
Trong tập lệnh GoodTimes
, chúng ta đã thấy mô tả về mảng tĩnh cục bộ messages
với các chuỗi lời chào (bên trong hàm Greeting
) và cách sử dụng các phần tử của nó trong toán tử trả về.
string Greeting()
{
static int counter = 0;
static const string messages[3] = // mô tả
{
"Good morning", "Good day", "Good evening" // khởi tạo
};
return messages[counter++ % 3]; // sử dụng
}
2
3
4
5
6
7
8
9
Khi thực hiện return
, chúng ta đọc phần tử có chỉ số được xác định bởi biểu thức: counter++ % 3
. Phép chia modulo 3 (ký hiệu là '%
') đảm bảo rằng counter tăng mỗi lần tăng thêm 1 sẽ bị buộc phải nằm trong phạm vi giá trị chỉ số chính xác: 0, 1 hoặc 2. Nếu không có phép chia modulo, chỉ số của phần tử được yêu cầu sẽ vượt quá kích thước mảng, bắt đầu từ lần gọi thứ 4 của hàm này. Trong những trường hợp như vậy, lỗi thời gian thực hiện chương trình xảy ra ("array out of range-mảng nằm ngoài phạm vi") và nó được dỡ khỏi biểu đồ.
API MQL5 bao gồm các hàm chung cho nhiều thao tác với mảng: Phân bổ bộ nhớ (cho mảng động), điền, sao chép, sắp xếp và tìm kiếm trong mảng đều được xem xét trong phần Làm việc với mảng . Tuy nhiên, chúng ta sẽ trình bày một trong số chúng ngay bây giờ: ArrayPrint cho phép in các phần tử mảng trong nhật ký theo định dạng thuận tiện (xem xét kích thước).
Script Arrays.mq5
trình bày một số ví dụ về mô tả mảng và kết quả được in trong nhật ký. Chúng ta sẽ xem xét các thao tác với các phần tử của mảng sau, sau khi đã nghiên cứu các vòng lặp và biểu thức.
void OnStart()
{
char array[100]; // không khởi tạo
int array2D[3][2] =
{
{1, 2}, // định dạng minh họa
{3, 4},
{5, 6}
};
int array2Dt[2][3] =
{
{1, 3, 5},
{2, 4, 6}
};
ENUM_APPLIED_PRICE prices[] =
{
PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE
};
// double d[5] = {1, 2, 3, 4, 5, 6}; // error: too many initializers - quá nhiều trình khởi tạo
ArrayPrint(array); // in các giá trị "garbage-rác" ngẫu nhiên
ArrayPrint(array2D); // hiển thị mảng 2D trong nhật ký
ArrayPrint(array2Dt); // một sự xuất hiện "chuyển vị" của cùng một dữ liệu 2D
ArrayPrint(prices); // tìm hiểu các giá trị của các phần tử liệt kê giá
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Một trong các tùy chọn nhập nhật ký được thể hiện bên dưới.
[ 0] 0 0 0 0 0 0 0 0 0 0 0 0 -87 105 82 119 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[34] 0 0 0 -32 -3 -1 -1 7 0 0 2 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 -96 104 82 119 0 0 0 0
[68] 0 0 3 0 0 0 0 0 -1 -1 -1 -1 0 0 0 0 100
48 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[,0][,1]
[0,] 1 2
[1,] 3 4
[2,] 5 6
[,0][,1][,2]
[0,] 1 3 5
[1,] 2 4 6
2 3 4 1
2
3
4
5
6
7
8
9
10
11
12
13
14
Mảng có tên là
array
không có bất kỳ khởi tạo nào và do đó, bộ nhớ được phân bổ cho nó có thể chứa các giá trị ngẫu nhiên. Các giá trị sẽ thay đổi ở mỗi lần chạy tập lệnh. Nên luôn khởi tạo các mảng cục bộ, để phòng ngừa.Mảng
array2D
vàarray2Dt
được in trong nhật ký dưới dạng minh họa, dưới dạng ma trận. Nó không liên quan gì đến thực tế là chúng ta đã định dạng danh sách khởi tạo trong mã nguồn theo cùng một cách.Mảng
prices
có kiểu enumeration nhúng làENUM_APPLIED_PRICE
. Về cơ bản, mảng có thể có bất kỳ kiểu nào, bao gồm cấu trúc, con trỏ hàm và những thứ khác mà chúng ta sẽ xem xét. Vì enumeration dựa trên kiểuint
, nên các giá trị được hiển thị bằng chữ số, không phải bằng tên của các phần tử (để lấy tên của một phần tử cụ thể của enumeration, có hàm EnumToString, nhưng chế độ của nó không được hỗ trợ trong ArrayPrint).Chuỗi có mô tả mảng
d
chứa lỗi: Thực thể của các giá trị ban đầu vượt quá kích thước mảng.