Search code examples
arrayslazarus

Lazarus setLength type mismatch


i am building a Compiler and i get this Error Code, when i compile the programm:

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

the code is the following:

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.

my Programm is programmed in Lazarus and bases on NASM and gets Compiled in the newest Laz-version in Linux.

I hope, you can help me.

Ok, it works now.


Solution

  • This is the setLength that generates error:

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

    This code is incorrect because dataSect is not a dynamic array as you would expect but an open array parameter that you can't change.

    You will need to change your function declaration to not use open array: first use builtin type TStringDynArray (I am not sure if it available in Lazarus), or declare it like

    type TStringDynArray = array of string;
    

    Then use this type everywhere instead array of string.

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

    Also you don't need to use var parameter var dataSect: TStringDynArray - dynamic arrays are always passed by reference and all changes will be applied to original array, if you want to prevent this - you will need to explicitly create new copy of array like NewDataSect := Copy(dataSect);