Beware dynamic array sizing. This caught me out ...
PROGRAM dyn_arr_test(input,output);
CONST a = 3; b = 10;
TYPE Dyn_arr( Max_index : INTEGER ) = ARRAY [1..Max_index] OF INTEGER; Ptr_to_dyn_arr = ^Dyn_arr;
VAR Test1 : Ptr_to_dyn_arr; Test2 : Ptr_to_dyn_arr; Test1a : ARRAY [1..3] OF INTEGER; Test2a : ARRAY [1..10] OF INTEGER;
PROCEDURE zero(VAR param; ch : char; size : longint); asmname 'memset';
BEGIN NEW( Test1, a ); writeln(sizeof(Test1^)); zero(Test1^,#0,sizeof(Test1^)); NEW( Test2, b ); writeln(sizeof(Test2^)); zero(Test2^,#0,sizeof(Test2^));
writeln(sizeof(Test1a)); zero(Test1a,#0,sizeof(Test1a)); writeln(sizeof(Test2a)); zero(Test2a,#0,sizeof(Test2a)); END.
The results are 16 and 44 for the dynamic arrays, 12 and 40 for the non-dynamic arrays. ie. the 'sizeof' function returns an additional 4 words for the dynamic arrays and so my zero function was overwriting memory beyond the dynamic array boundaries.
Is this an unavoidable feature, a compiler bug or to be completely expected?
I am assuming the 'new' function doesn't explicitly zero memory and so I need to do. I have used this zero function on all the usual Pascal variables without problem, but I suspect it has a strange effect when used to zero a record containing a string. Can anyone confirm whether there are particular Pascal structures that shouldn't be zeroed by this technique (apart from dynamic arrays)?
Regards
David Wood QinetiQ, Farnborough
The Information contained in this E-Mail and any subsequent correspondence is private and is intended solely for the intended recipient(s). For those other than the recipient any disclosure, copying, distribution, or any action taken or omitted to be taken in reliance on such information is prohibited and may be unlawful.