Lazarus setLength 类型不匹配

Lazarus setLength type mismatch

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

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 版本中编译。

希望你能帮帮我。

好的,现在可以了。

这是产生错误的 setLength:

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

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

您需要将函数声明更改为不使用开放数组: 首先使用内置类型 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);