2016-07-25 5 views
0

я строй компилятора, и я получаю этот код ошибки, когда я скомпилировать программку:Lazarus 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 и получает Компиляцию в новейшей Laz-версии в Linux.

Надеюсь, вы можете мне помочь.

Хорошо, сейчас работает.

ответ

1

Это 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);

+0

Спасибо! это помогло Лот! –

Смежные вопросы