Q&A

  • 스레드 생성자파라미터로 레코드 타입을 넘기지 못하나요??
MAIN
<!--CodeS-->
unit fMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tarr = record
    I: integer;
    S: string;  
    R: Real;
  end;
  PTarr = ^Tarr;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    DL,UL: Tarr;
  public
  end;

var
  Form1: TForm1;
implementation

uses Thds;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  DL.I := 10;
  DL.S := 'h';
  DL.R := 6.23;

  TDownThds.Create(DL);
end;
<!--CodeE-->


스레드생성 pas
<!--CodeS-->
unit Thds;

interface

uses
  Classes, Dialogs, SysUtils;

type

  Tarr = record
    I: integer;
    S: string;
    R: Real;
  end;
  PTarr = ^Tarr;

  TThds = class(TThread)
  private
    FTarr: PTarr;
  protected
    procedure Execute; override;
  public
    constructor Create(var rec: Tarr);
  end;

  {TDownThds}
  TDownThds = class(TThds)
  end;

  {TUpThds}
  TUpThds = class(TThds)
  end;

implementation

procedure TThds.Execute;
begin
  ShowMessage(IntToStr(FTarr^.I));
  ShowMessage(FTarr^.S);
  ShowMessage(FloatToStr(FTarr^.R));
end;

constructor TThds.Create(var rec: Tarr);
begin
  FTarr := @rec;
  FreeOnTerminate := True;
  inherited Create(False);
end;          

end.
<!--CodeE-->


윗출.. MAIN의 TDownThds.Create(DL);에서
[Error] fMain.pas(49): Types of actual and formal var parameters must be identical
이란 에러가 생기네요~~
1  COMMENTS
  • Profile
    최용일 2006.06.08 04:37
    안녕하세요. 최용일입니다.

    fMain 유닛에 있는 Tarr형과 Thds 유닛에 있는 Tarr형은 데이터 구조는 같지만 전혀 별개의 데이터 형입니다.
    사람의 눈으로는 똑같은 데이터형이겠지만 컴파일러 입장에서는 fMain.Tarr형과 Thds.Tarr형으로 서로 다르게 해석하죠.

    둘중의 한군데 유닛에서만 선언하고 uses절로 참조해서 쓰세요. 아님 데이터형만 따로 유닛으로 빼서 만들어 쓰시던가요...

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