궁금한게 있어 몇자 적습니다.
파일을 읽어서 배열에 저장하려고 하는데요.. 잘안되네요...
읽을 파일은 .shp 파일 이구요...
레코드 구조가 이렇게 되어 있습니다..
PolyLine
{
Double[4] Box
Integer NumParts
Integer NumPoints
Integer[NumParts] Parts
Point[NumPoints] Points
}
Field value Type Number
ShapeType 3 Integer 1
Box Box Double 4
NumParts NumParts Integer 1
NumParts NumPoints Integer 1
Parts Parts Integer NumParts
Points Points Integer NumPoints
이렇게 되면..
function UtShapeFile.Load(filename : String) : Integer;
var
FH, iCount, tmp, i, n, ret : Integer;
numpart, numpoint, parts, points : Integer;
partidx, pointidx : array of Integer;
begin
FH := FileOpen(filename, fmOpenRead);
iCount := FileRead(FH, MainFileHeader, SizeOf(MainFileHeader));
if (MainFileHeader.ShapeType = 3) then
begin
while (true) do
begin
ret := FileRead(FH, tmp, SizeOf(Integer));
if (ret <> SizeOf(Integer)) then
break;
tmp := FileSeek(FH, SizeOf(Integer) * 1, 1);
tmp := FileSeek(FH, SizeOf(Double) * 4, 1);
numpart := FileRead(FH, numpart, SizeOf(Integer));
numpoint := FileRead(FH, numpoint, SizeOf(Integer));
SetLength(partidx, numpart);
SetLength(pointidx, numpoint);
partidx := FileRead(FH, partidx, SizeOf(Integer) * numpart); // 에러발생
end;
end;
FileClose(FH);
Result := 1;
end;
이런식으로 해주면 안되는 건가요?
책을봐도 모르겠고.. 고수님들의 명쾌한 답변 부탁드립니다...ㅜㅜ
일단 문제점만 고쳐드릴께요
몇년전부터 Fireread안써와서 ^^
FileRead(FH, partidx, SizeOf(Integer) * numpart);
이게 아니라..
FileRead(FH, partidx[0], SizeOf(Integer) * numpart);
이렇게 하세요
먼저 델파이의 배열에서 Fixed array 와 Dynamic array이 가 있는것을 아시죠
var
A : array[0..12] of byte;
B : array of byte;
begin
setlength(B, 13);
end;
이 의미는 아래와 같습니다.
A = A[0]
B = @B[0]
B는 결국 포인터 입니다.
결국 Fixed array와 Dynamic array를 쓸때에는 달리해야 한다는 것입니다.
개념적으로 틀리다는 것을 명심하고 작업하세요
이문제는 스트링도 같습니다.
var
sd : string;
sf : stirng[20];
sd는 4바이트 포인터
sf는 20바이트 스트링
그리고 만약 그 파일에 여러레코드가 있다면 아래 방법은 별로 좋은 방법은 아닙니다.
즉, FileSeek와 FileRead, Setlength가 레코드 갯수만큼 반복할 가능성(레코드수 X 5~6) 다분함
이 일은 하나의 메모리 블럭에 넣어서 해결하는게 좋고 단지 포인터만 지정하면 될듯 합니다.