ArrayResize
Hàm đặt kích thước mới cho chiều đầu tiên.
int ArrayResize(
void& array[], // mảng được truyền bằng tham chiếu
int new_size, // kích thước mới của mảng
int reserve_size=0 // giá trị kích thước dự trữ (dư thừa)
);
2
3
4
5
Tham số
array[]
[out] Mảng để thay đổi kích thước.
new_size
[in] Kích thước mới cho chiều đầu tiên.
reserve_size=0
[in] Kích thước phân bổ để dự trữ.
Giá trị trả về
Nếu thực thi thành công, trả về số lượng tất cả các phần tử có trong mảng sau khi thay đổi kích thước, nếu không trả về -1 và mảng không được thay đổi kích thước.
Nếu ArrayResize()
được áp dụng cho một mảng tĩnh, một chuỗi thời gian hoặc một bộ đệm chỉ báo, kích thước mảng vẫn giữ nguyên – các mảng này sẽ không được cấp phát lại. Trong trường hợp này, nếu new_size
<= ArraySize(array
), hàm chỉ trả về new_size
; nếu không, trả về -1.
Ghi chú
Hàm chỉ có thể được áp dụng cho mảng động. Cần lưu ý rằng bạn không thể thay đổi kích thước của mảng động được gán làm bộ đệm chỉ báo bởi hàm SetIndexBuffer(). Đối với bộ đệm chỉ báo, tất cả các thao tác thay đổi kích thước được thực hiện bởi hệ thống con thời gian chạy của terminal.
Tổng số phần tử trong mảng không thể vượt quá 2147483647.
Với việc cấp phát bộ nhớ thường xuyên, nên sử dụng tham số thứ ba để đặt dự trữ nhằm giảm số lần cấp phát bộ nhớ vật lý. Tất cả các lệnh gọi ArrayResize
tiếp theo không dẫn đến việc cấp phát lại bộ nhớ vật lý, mà chỉ thay đổi kích thước của chiều đầu tiên của mảng trong phạm vi bộ nhớ đã dự trữ. Cần nhớ rằng tham số thứ ba chỉ được sử dụng trong quá trình cấp phát bộ nhớ vật lý. Ví dụ:
ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);
2
3
Trong trường hợp này, bộ nhớ sẽ được cấp phát lại hai lần, lần đầu tiên trước khi vào vòng lặp 3000 lần (kích thước mảng được đặt thành 1000), và lần thứ hai khi i bằng 2000. Nếu bỏ qua tham số thứ ba, sẽ có 2000 lần cấp phát lại bộ nhớ vật lý, làm chậm chương trình.
Ví dụ:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Bộ đếm
ulong start=GetTickCount();
ulong now;
int count=0;
//--- Một mảng để thể hiện phiên bản nhanh
double arr[];
ArrayResize(arr,100000,100000);
//--- Kiểm tra tốc độ hoạt động của biến thể có dự trữ bộ nhớ
Print("--- Test Fast: ArrayResize(arr,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- Đặt kích thước mới cho mảng với dự trữ 100,000 phần tử!
ArrayResize(arr,i,100000);
//--- Khi đạt đến số tròn, hiển thị kích thước mảng và thời gian đã dùng
if(ArraySize(arr)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
start=now;
}
}
//--- Bây giờ hiển thị phiên bản chậm không có dự trữ bộ nhớ
double slow[];
ArrayResize(slow,100000,100000);
//---
count=0;
start=GetTickCount();
Print("---- Test Slow: ArrayResize(slow,100000)");
//---
for(int i=1;i<=300000;i++)
{
//--- Đặt kích thước mới cho mảng, nhưng không có dự trữ bổ sung
ArrayResize(slow,i);
//--- Khi đạt đến số tròn, hiển thị kích thước mảng và thời gian đã dùng
if(ArraySize(slow)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
start=now;
}
}
}
//--- Một kết quả mẫu của script
/*
Test_ArrayResize (EURUSD,H1) --- Test Fast: ArrayResize(arr,100000,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(arr)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(arr)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(arr)=300000 Time=0 ms
Test_ArrayResize (EURUSD,H1) ---- Test Slow: ArrayResize(slow,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(slow)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(slow)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(slow)=300000 Time=228511 ms
*/
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60