Array, Konstanten übergabe

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Array, Konstanten übergabe

Beitrag von Mathias »

Ich habe folgenden Test-Code.
Wieso geht der Aufruf von itest2 mit Konstanten nicht ?

Code: Alles auswählen

program Project1;
 
type
  TiVec = array of integer;
 
procedure itest1(v: array of integer);
begin
  writeln(v[0]);
end;
 
procedure itest2(v: TiVec);
begin
  writeln(v[0]);
end;
 
begin
  iTest1([1, 1, 1]);  // geht
  iTest2([1, 1, 1]);  // geht nicht
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot


Soner
Beiträge: 733
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Array, Konstanten übergabe

Beitrag von Soner »

Versuchmal das:
iTest2(TiVec([1, 1, 1]));

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Array, Konstanten übergabe

Beitrag von Mathias »

Soner hat geschrieben:Versuchmal das:
iTest2(TiVec([1, 1, 1]));
Geht nicht, die habe ich schon probiert.

Code: Alles auswählen

project1.lpr(18,10) Error: Illegal type conversion: "Array Of Const/Constant Open Array of ShortInt" to "TiVec"
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Array, Konstanten übergabe

Beitrag von Jole »

Hallo, die Procedure iTest2 Funktioniert deshalb nicht, weil sie eine Variable vom Type TiVec erwartet.
Es darf keine Konstante uebergeben werden da der Speicherplatz dafuer nur beim Aufruf der Procedure
auf dem Stack existiert. Wird die Procedure wieder verlasen, sind die Daten wieder weg, genau das
passiert bei der Prozedure iTest1.
Um die Procedure iTest2 zum laufen zu bringen must Du zuerst eine Variable vom Type TiVec erzeugen,
Speicherplatz reservieren und dann initialisieren.
Dein Beispielcode wuerde dann etwa so aussehen:

Code: Alles auswählen

 
program TestVec;
 
type
  TiVec = array of Integer;
 
procedure iTest1(v: array of Integer);
begin
  WriteLn(v[0]);
end;
 
procedure iTest2(v: TiVec);
var Inx: Integer;
begin
  for Inx:= 0 to High(v) do
    Write(v[Inx], ' ');
  WriteLn;
end;
 
var  
  iVec: TiVec;
 
begin
  SetLength(iVec, 3);
  iVec[0]:= 1;
  iVec[1]:= 2;
  iVec[2]:= 3;
 
  iTest1([1, 2, 3]);  //Die werte existieren nur auf dem Stack
  iTest1(iVec);      //Die werte im Array existieren auch nach dem Aufruf noch
  iTest2(iVec);      //Jetzt gehts
 
  //Speicher wieder frei geben
  SetLength(iVec, 0);
end.
 
mfg
Zuletzt geändert von Lori am Di 9. Dez 2014, 18:17, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Antworten