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);
我正在构建一个编译器,当我编译程序时我得到了这个错误代码:
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);