我正在构建一个编译器,当我编译程序时,我得到了这个错误代码:
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版本中编译。
我希望,你可以帮助我。
好的,它现在有效。
答案 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);