Đo Lường Mảng
Một trong những đặc điểm chính của mảng là kích thước của nó, tức là tổng số phần tử trong mảng. Điều quan trọng cần lưu ý là đối với mảng đa chiều, kích thước là tích của độ dài tất cả các chiều của nó.
Đối với mảng cố định, bạn có thể tính kích thước của chúng ở giai đoạn biên dịch bằng cách sử dụng cấu trúc ngôn ngữ dựa trên toán tử sizeof:
sizeof(array) / sizeof(type)
Trong đó array
là định danh, và type
là kiểu của mảng.
Ví dụ, nếu một mảng được định nghĩa trong mã như fixed
:
int fixed[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
Thì kích thước của nó là:
int n = sizeof(fixed) / sizeof(int); // 8
Đối với mảng động, quy tắc này không hoạt động, vì toán tử sizeof
luôn tạo ra cùng một kích thước của đối tượng mảng động nội bộ: 52 byte.
Lưu ý rằng trong các hàm, tất cả tham số mảng được biểu diễn bên trong dưới dạng các đối tượng bao bọc mảng động. Điều này được thực hiện để một mảng với bất kỳ phương thức cấp phát bộ nhớ nào, bao gồm cả mảng cố định, có thể được truyền vào hàm. Đó là lý do tại sao
sizeof(array)
sẽ trả về 52 cho mảng tham số, ngay cả khi một mảng có kích thước cố định được truyền qua nó.Sự hiện diện của "các bao bọc" chỉ ảnh hưởng đến
sizeof
. HàmArrayIsDynamic
luôn xác định chính xác danh mục của đối số thực tế được truyền qua mảng tham số.
Để lấy kích thước của bất kỳ mảng nào ở giai đoạn thực thi chương trình, hãy sử dụng hàm ArraySize
.
int ArraySize(const void &array[])
Hàm này trả về tổng số phần tử trong mảng. Số chiều và kiểu của mảng có thể là bất kỳ. Đối với mảng một chiều, lời gọi hàm tương tự như ArrayRange(array, 0)
(xem bên dưới).
Nếu mảng được phân phối với một khoản dự trữ (tham số thứ ba của hàm ArrayResize), giá trị của nó không được tính đến.
Cho đến khi bộ nhớ được cấp phát cho mảng động bằng ArrayResize
, hàm ArraySize
sẽ trả về 0. Ngoài ra, kích thước trở thành không sau khi gọi ArrayFree cho mảng.
int ArrayRange(const void &array[], int dimension)
Hàm ArrayRange
trả về số phần tử trong chiều được chỉ định của mảng. Số chiều và kiểu của mảng có thể là bất kỳ. Tham số dimension
phải nằm trong khoảng từ 0 đến số chiều của mảng trừ đi 1. Chỉ số 0 tương ứng với chiều đầu tiên, chỉ số 1 với chiều thứ hai, và cứ như vậy.
Tích của tất cả các giá trị của ArrayRange(array, i)
với i
chạy qua tất cả các chiều sẽ cho ra ArraySize(array)
.
Hãy xem các ví dụ về các hàm được mô tả ở trên (xem tệp ArraySize.mq5
).
void OnStart()
{
int dynamic[];
int fixed[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
PRT(sizeof(fixed) / sizeof(int)); // 8
PRT(ArraySize(fixed)); // 8
ArrayResize(dynamic, 10);
PRT(sizeof(dynamic) / sizeof(int)); // 13 (không chính xác)
PRT(ArraySize(dynamic)); // 10
PRT(ArrayRange(fixed, 0)); // 2
PRT(ArrayRange(fixed, 1)); // 4
PRT(ArrayRange(dynamic, 0)); // 10
PRT(ArrayRange(dynamic, 1)); // 0
int size = 1;
for(int i = 0; i < 2; ++i)
{
size *= ArrayRange(fixed, i);
}
PRT(size == ArraySize(fixed)); // true
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26