Q&A

  • 링크드 리스트를 이용한 스택 구현시 에러
델파이에서 링크드 리스트를 이용하여 스택을 구현하려 합니다.

델파이에서 포인터는 흔히 ^ 연산자를 쓴다고 하는데,

그래서, data class를 구현 → s 라는 전역변수 설정 → 메인부분에서 Add1 함수 호출을 하려고 합니다.

Add1 함수는 스택을 추가하는 함수입니다.

Add1 에서 수많은 에러가 발생합니다.

뭐가 문제인지 정말 모르겠군요. 만일 가르쳐주신다면 감사하겠습니다.

C언어 문법을 파스칼 문법으로 바꿀려니 어렵군요.

아래는 전체 소스코드입니다.
<Unit (*.pas) 가 아닌 project 파일(*.dpr) 소스코드입니다.>



program myAppName;

uses
  Windows,
  Messages;

type
        data = class
                value : integer;       // 스택 값
                next : ^data;          // 스택 연결 포인터
        end;

var
        lpszclass : LPSTR ;
        Wnd : HWND ;
        z : WNDCLASS ;
        iMessage : MSG;

procedure add1(s : ^data ; v : integer);   // 1st Error
var
        t : ^data;
begin
        t.Create;
        t.value := v;
          t.next := ^s;           // 2nd Error
            ^s := t;                   // 3rd Error
end;

function Wndproc(wnd : HWND ; imessage : UINT ;
        wParam : WPARAM ; lParam : LPARAM) : LRESULT; stdcall;
var
        s : ^data;        

begin
        case imessage of
        WM_CREATE:
        begin
                             s := nil;              
                            Add1(s , 10);       // 4rd Error
                    Result := 0;
        end;
        WM_DESTROY:
        begin
                PostQuitMessage(0);
                Result := 0;
        end
        else
                Result := DefWindowProc(wnd, imessage, wParam, lParam);
        end;
end;

////////////////////////////////////////////////////////

begin
        lpszclass := 'LKY';
        with z do
        begin
                cbClsExtra := 0;
                cbWndExtra := 0;
                hbrBackground := GetStockObject(WHITE_BRUSH);
                 hCursor := LoadCursor(HInstance, IDC_ARROW);
                 hIcon := LoadIcon(HInstance, IDI_APPLICATION);
                hInstance := HInstance;
                lpfnWndProc := @WndProc;
                lpszClassName := lpszclass;
                       lpszMenuName := nil;
                style := CS_HREDRAW or CS_VREDRAW;
        end;
        Windows.RegisterClass(z);
        Wnd := CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
                100, 50, 800, 600, 0, 0, hInstance, nil);

        ShowWindow( Wnd, SW_SHOWNORMAL );

        while GetMessage(iMessage,0,0,0) do
        begin
                TranslateMessage(iMessage);
                DispatchMessage(iMessage);
        end;
end.

1  COMMENTS
  • Profile
    최용일 2006.05.17 19:52
    안녕하세요. 최용일입니다.

    델파이에서 ^의 용법은 두가지가 있습니다.

    앞에 ^를 사용할경우는 포인터형을 선언할때입니다. begin~end절에서는 사용하지 않습니다.
    뒤에 ^를 사용할 경우는 포인터의 값을 참조할때입니다.
    델파이의 객체는 일종의 포인터입니다. 델파이는 객체 지향언어라서 객체에서 ^는 명시적으로 사용하지 않습니다.

    type
            data = class
                    value : integer;       // 스택 값
                    next : data;          // 스택 연결 포인터
            end;

    procedure add1(s : data ; v : integer);   // 1st Error
    var
            t : data;
    begin
            t.Create;
            t.value := v;
              t.next := s;           // 2nd Error
                s := t;                   // 3rd Error
    end;

    참고로 객체를 생성해서 스택에 넣는 코드는 있는데 객체를 해제하는 코드는 어디에도 없는것 같군요...

    ^^ 항상 즐코하세요...