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
Post a Comment