arrays - Lazarus setLength type mismatch -


i building compiler , error code, when compile programm:

compiler_main.pas(55,4) error: type mismatch 

the code 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      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      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   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 programmed in lazarus , bases on nasm , gets compiled in newest laz-version in linux.

i hope, can me.

ok, works now.

this setlength generates error:

procedure tform1.setdatasect(var datasect: array of string); begin    setlength (datasect, 1);    datasect[0]:= 'section .data'; end; 

this code incorrect because datasect not dynamic array expect open array parameter can't change.

you need change function declaration not use open array: first use builtin type tstringdynarray (i not sure if available in lazarus), or declare like

type tstringdynarray = array of string; 

then use type everywhere instead array of string.

procedure tform1.setdatasect(datasect: tstringdynarray); begin    setlength (datasect, 1);    datasect[0]:= 'section .data'; end; 

also don't need use var parameter var datasect: tstringdynarray - dynamic arrays passed reference , changes applied original array, if want prevent - need explicitly create new copy of array newdatasect := copy(datasect);


Comments

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -