동적 배열을 사용하였습니다.
type
TXTempA = Array of Integer;
TYTempA = Array of Integer;
TXXA = Array of Integer;
TYYA = Array of Integer;
TFrmMain = class(TForm)
이케 하구선 모든 변수를 전역변수로 선언했습니다.
implementation
{$R *.DFM}
// First Date 2001,01,29
var
XTempA: TXTempA;
YTempA: TYTempA;
XXA: TXXA;
YYA: TYYA;
AX, AY, BX, BY, CX, CY, DX, DY, EX, EY : Integer;
XTemp, YTemp: Integer;
XStruc, YStruc: Integer;
XCnt, YCnt, Cnt: Integer;
XX, YY: Integer;
폼 엑티브 이벤트에
SetLength(XTempA,1);
SetLength(YTempA,1);
SetLength(XXA,1);
SetLength(YYA,1);
이케 했구여 책보니 copy로 하면 사이즈를 바꿀수 있다구 해서...
버튼 클릭 이벤트에서
Copy(XTempA,1,Cnt);
Copy(YTempA,1,Cnt);
Copy(XXA,1,Cnt);
Copy(YYA,1,Cnt);
이렇게 사이즈를 변경하게 해봤는데요... Cnt는 버튼을 누를때마다
하나씩 올라가는 카운트에요.
이렇게 해서 사용하는데요 처음부분은 몇번... 잘돼다가 에러가 나요
' Access violation at Address 004dc6in Module 'Project1.exe'. Read of address ffffffe8'
이런 에러가... ^^;
아시는 분~ 바루 답글 남겨주세여 ^^
저도 같은 문제로... ㅜ.ㅜ;
////////////////////////////////////////////////////////////////////////////////
파스칼(pascal)에서는 비동적 배열의 크기를 재 설정할 수 없습니다. 그러나, 동적으로 생성된 배열의 크기는 재 설정할 수 있습니다. 이와 같이 하기위해서는 배열의 범위를 설정을 하지 말고 배열의 요소를 변수(variable)를 통해서만 얻어와야 한다. 배열을 포인터 변수를 통해 얻어온다면, 다음과 같은 순서로 배열의 크기를 재설정하는 것처럼 할 수 있다. 즉, 새로운 배열 설정, 기존 배열의 모든 요소를 새로운 배열에 복사, 기존 배열을 메모리에서 삭제, 새로운 배열의 포인터를 기존 배열의 포인터로 설정. 이와같은 순서로 배열의 크기를 재 설정할 수 있다.
< 예제 >
type
TSomeArrayElement = integer;
PSomeArray = ^TSomeArray;
TSomeArray = array[0..0] of TSomeArrayElement;
procedure CreateArray(var TheArray : PSomeArray; NumElements : longint);
begin
GetMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;
procedure FreeArray(var TheArray : PSomeArray; NumElements : longint);
begin
FreeMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;
procedure ReSizeArray(var TheArray : PSomeArray; OldNumElements : longint; NewNumElements : longint);
var
ThenewArray : PSomeArray;
begin
GetMem(ThenewArray, sizeof(TSomeArrayElement) * NewNumElements);
if NewNumElements > OldNumElements then
Move(TheArray^, ThenewArray^, OldNumElements * sizeof(TSomeArrayElement)) else
Move(TheArray^, ThenewArray^, NewNumElements * sizeof(TSomeArrayElement));
FreeMem(TheArray, sizeof(TSomeArrayElement) * OldNumElements);
TheArray := ThenewArray;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p : PSomeArray;
i : integer;
begin
{$IFOPT R+}
{$DEFINE CKRANGE}
{$R-}
{$ENDIF}
CreateArray(p, 200);
for i := 0 to 199 do
p^[i] := i;
ResizeArray(p, 200, 400);
for i := 0 to 399 do
p^[i] := i;
ResizeArray(p, 400, 50);
for i := 0 to 49 do
p^[i] := i;
FreeArray(p, 50);
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+}
{$ENDIF}
end;
////////////////////////////////////////////////////////////////////////////////
많은 도움이 되셨으면 좋겠네여~~!!
그럼 ^.^;
명지니 wrote:
> 동적 배열을 사용하였습니다.
>
> type
> TXTempA = Array of Integer;
> TYTempA = Array of Integer;
> TXXA = Array of Integer;
> TYYA = Array of Integer;
> TFrmMain = class(TForm)
>
> 이케 하구선 모든 변수를 전역변수로 선언했습니다.
>
> implementation
>
> {$R *.DFM}
>
> // First Date 2001,01,29
>
> var
> XTempA: TXTempA;
> YTempA: TYTempA;
> XXA: TXXA;
> YYA: TYYA;
> AX, AY, BX, BY, CX, CY, DX, DY, EX, EY : Integer;
> XTemp, YTemp: Integer;
> XStruc, YStruc: Integer;
> XCnt, YCnt, Cnt: Integer;
> XX, YY: Integer;
>
> 폼 엑티브 이벤트에
>
> SetLength(XTempA,1);
> SetLength(YTempA,1);
> SetLength(XXA,1);
> SetLength(YYA,1);
>
> 이케 했구여 책보니 copy로 하면 사이즈를 바꿀수 있다구 해서...
> 버튼 클릭 이벤트에서
>
> Copy(XTempA,1,Cnt);
> Copy(YTempA,1,Cnt);
> Copy(XXA,1,Cnt);
> Copy(YYA,1,Cnt);
>
> 이렇게 사이즈를 변경하게 해봤는데요... Cnt는 버튼을 누를때마다
> 하나씩 올라가는 카운트에요.
>
>
> 이렇게 해서 사용하는데요 처음부분은 몇번... 잘돼다가 에러가 나요
> ' Access violation at Address 004dc6in Module 'Project1.exe'. Read of address ffffffe8'
> 이런 에러가... ^^;
>
> 아시는 분~ 바루 답글 남겨주세여 ^^
>