Lazarus setLength类型不匹配

时间:2016-07-25 14:42:01

标签: arrays lazarus

我正在构建一个编译器,当我编译程序时,我得到了这个错误代码:

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.

我的程序在Lazarus中编程,基于NASM,并在Linux中的最新Laz版本中编译。

我希望,你可以帮助我。

好的,它现在有效。

1 个答案:

答案 0 :(得分:1)

这是生成错误的setLength:

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

此代码不正确,因为dataSect不是您所期望的动态数组,而是一个无法更改的开放数组参数。

您需要将函数声明更改为不使用open数组: 首先使用内置类型TStringDynArray(我不确定它是否在Lazarus中可用),或者声明它类似

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);

这样的数组的新副本