2016-07-25 2 views
0

Je construis un compilateur et je reçois ce code d'erreur, quand je compilez le programme:Lazarus incompatibilité de type setLength

compiler_main.pas(55,4) Error: Type mismatch 

le code est le suivant:

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. 

mon Programm est programmé dans Lazarus et bases sur NASM et est compilé dans la dernière version de Laz sous Linux.

J'espère que vous pouvez m'aider.

Ok, ça marche maintenant.

Répondre

1

C'est le setLength qui génère l'erreur:

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

Ce code est incorrect car dataSect n'est pas un tableau dynamique que vous attendez, mais un paramètre tableau ouvert que vous ne pouvez pas changer.

Vous devrez modifier votre déclaration de fonction de ne pas utiliser le tableau ouvert: première utilisation de type builtin TStringDynArray (Je ne sais pas si elle est disponible dans Lazarus), ou la déclarer comme

type TStringDynArray = array of string; 

Ensuite, utilisez cette tapez partout à la place array of string.

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

Aussi, vous n'avez pas besoin d'utiliser var paramètres var dataSect: TStringDynArray - tableaux dynamiques sont toujours passés par référence et tous les changements seront appliqués au tableau original, si vous voulez éviter cela - vous devez créer explicitement nouveau copie de tableau comme NewDataSect := Copy(dataSect);

+0

Merci! ça a aidé beaucoup! –