After using BlockRead to fill a 2D dynamic array, I get an access violation on the very first reference. A 2D array with only one dimension dynamic works OK. What am I missing?
Windows, FPC 2.2.2, 2.2.4 or 2.4.2. Program WriteA ; { Write a binary file using using static array and BlockWrite } Const W = 2 ; H = 2 ; FName = 'C:\FPC\2.2.2\USR\GASH.BIN' ; Type A2T = Array[0..H-1,0..W-1] Of Single ; Var D : A2T ; F : File ; J, C : Longint ; Begin D[0,0] := 1 ; D[0,1] := 2 ; D[1,0] := 3 ; D[1,1] := 4 ; Assign(F, FName) ; Rewrite(F, 1) ; For J := 0 To H-1 Do Blockwrite(F, D[J], W*Sizeof(Single), C) ; Close(F) ; Writeln(D[0,0]:2:0, #9, D[0,1]:2:0, #9, D[1,0]:2:0, #9, D[1,1]:2:0) ; End. Program DynRd ; { Read binary file written by "WriteA" } Const W = 2 ; H = 2 ; FName = 'C:\FPC\2.2.2\USR\GASH.BIN' ; Type STat = Array[0..W-1] Of Single ; { Static array } DST = Array Of STat ; { One dimension dynamic, the other static } D2T = Array Of Array Of Single ; { Two dynamic dimensions } Var DD : D2T ; DS : DST ; F : File ; J, C : Longint ; Begin SetLength(DS, H) ; { Test mixed array } Assign(F, FName) ; Reset(F, 1) ; For J := 0 To H-1 Do Begin BlockRead(F, DS[J], W*Sizeof(Single), C) ; If (C <> W*Sizeof(Single)) Then Writeln('Oops at J = ', J) ; End ; Close(F) ; Writeln(DS[0,0]:2:0, #9, DS[0,1]:2:0, #9, DS[1,0]:2:0, #9, DS[1,1]:2:0, #9'Should be 1, 2, 3, 4') ; { This works } SetLength(DS, 0) ; SetLength(DD, H, W) ; { Test 2D dynamic array } Assign(F, FName) ; Reset(F, 1) ; For J := 0 To H-1 Do Begin BlockRead(F, DD[J], W*Sizeof(Single), C) ; If (C <> W*Sizeof(Single)) Then Writeln('Oops at J = ', J) ; End ; Close(F) ; Writeln(DD[0,0]:2:0, #9, DD[0,1]:2:0, #9, DD[1,0]:2:0, #9, DD[1,1]:2:0, #9'Should also be 1, 2, 3, 4') ; { Quits, error 216, reading DD[0,0] } SetLength(DD, 0, 0) ; End. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal