2016-07-25 59 views
0

我建立一個編譯器,我得到這個錯誤代碼,當我編譯PROGRAMM:拉撒路setLength類型不匹配

compiler_main.pas(55,4) Error: Type mismatch 

的代碼如下:

unit Compiler_main; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs, 
    StdCtrls, ExtCtrls; 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    GroupBox1: TGroupBox; 
    GroupBox2: TGroupBox; 
    Image1: TImage; 
    Image2: TImage; 
    Splitter1: TSplitter; 
    Splitter2: TSplitter; 
    SynEdit1: TSynEdit; 
    SynEdit2: TSynEdit; 
    SynEdit3: TSynEdit; 
    procedure Image1Click(Sender: TObject); 
    procedure Image2Click(Sender: TObject); 
    procedure setForCompiling(var dataSect: array of String; var textSect: array of String; var bssSect: array of String); 
    procedure setDataSect (var dataSect: array of String); 
    //////////FUNCTIONS//////////////////// 
    function compile() : boolean; 
    private 
    { private declarations } 
    public 
    { public declarations } 
    end; 

var 
    Form1: TForm1; 
var INTarray: array of integer; 

implementation 

{$R *.lfm} 

{ TForm1 } 

{ 
procedure Tform1.setTextSect (var textSect: array of String); 
begin 

end; } 

procedure Tform1.setDataSect(var dataSect: array of String); 
begin 
    setLength (dataSect, 1); 
    dataSect[0]:= 'section .data'; 
end; 

procedure Tform1.setForCompiling(var dataSect: array of String; var textSect: array of String; var bssSect: array of String); 
begin 
    Synedit2.Lines.Clear; 
    Synedit3.Lines.Clear; 
    setDataSect (dataSect); 
end; 

function getMistake (mistake: boolean) : boolean; 
begin 
    if mistake = false then 
    begin 
     getMistake:= true; 
    end else 
    begin 
     getMistake:= false; 
    end; 
end; 

function Tform1.compile() : boolean; 
var momLine   : integer = 0; 
var totalLines   : integer; 
var posBracketOpen  : Byte; 
var posBracketClose : Byte; 
var posTextBracketOpen : Byte; 
var posTextBracketClose: Byte; 
var mistake   : boolean = false; 
var dataASM   : array of string; 
var textASM   : array of string; 
var bssASM    : array of String; 
begin 
    setForCompiling(dataASM, textASM, bssASM); 
    totalLines:= synEdit1.lines.count; 
    while momline < totalLines do 
    begin 

     inc (momline); 
    end; 
    compile:= getMistake (mistake); 
end; 



procedure TForm1.Image1Click(Sender: TObject); 
begin 
    Showmessage ('Ein deutscher Compiler, programmiert von NONAME. NUR UNTER LINUX BENUTZBAR!'); 
end; 

procedure TForm1.Image2Click(Sender: TObject); 
begin 
    if Compile = true then 
    begin 
    Synedit3.Lines.add ('Fehlerfrei Compiliert!'); 
    end else 
    begin 
    Synedit3.Lines.add ('Es wurde mindestens ein Fehler festgestellt! Bitte korrigiere diesen.'); 
    end; 
end; 

end. 

我PROGRAMM在編程Lazarus並以NASM爲基礎,並在Linux中以最新的Laz版本進行編譯。

我希望你能幫助我。

好吧,它現在有效。

回答

1

這是產生setLength錯誤:

procedure Tform1.setDataSect(var dataSect: array of String); 
begin 
    setLength (dataSect, 1); 
    dataSect[0]:= 'section .data'; 
end; 

這個代碼不正確,因爲dataSect不是一個動態數組,你所期望的,但你不能改變一個開放數組參數。

你需要改變你的函數聲明不使用開放數組: 首次使用內置型TStringDynArray(我不知道,如果它在拉撒路可用),或者宣佈它像

type TStringDynArray = array of string; 

然後用這個到處輸入array of string

procedure Tform1.setDataSect(dataSect: TStringDynArray); 
begin 
    setLength (dataSect, 1); 
    dataSect[0]:= 'section .data'; 
end; 

而且你不需要使用var參數var dataSect: TStringDynArray - 動態數組總是按引用傳遞,所有的改變將被應用到原來的數組,如果你想避免這種情況 - 你將需要顯式地創建新數組的副本像NewDataSect := Copy(dataSect);

+0

謝謝!它幫了很多! –