[gelöst] Dynamisches Array in procedure

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

[gelöst] Dynamisches Array in procedure

Beitrag von h-elsner »

Irgendwie fehlt mir der Zugang. Ich wollte ein dynamisches Array in in einer Function (oder Procedure) nutzen. Da bekomme ich aber beim Kompilieren folgenden Fehler:
"Error: Type mismatch" bei SetLength.
Ich habe das mal auf folgende einfache Prozedur heruntergebrochen, wo der Fehler (bestimmt mein Fehler) auftritt:

Code: Alles auswählen

 
procedure AddValue(var myArr: Array of integer; value: integer);
begin
  SetLength(myArr, Length(MyArr) + 1);
  MyArr[High(myArr)] := value;
end;
 


Die Arrays, die die Prozedur benutzen wollen, sind im Hauptprogramm mit SetLength(testarray, 0); initialisiert worden.
Was mache ich falsch? Ich vermute, das irgendwas mit dem dynamischen Array zu tun, weil die Variable nur ein Pointer ist.

Gruß HE
Zuletzt geändert von h-elsner am Fr 30. Mär 2018, 22:51, insgesamt 1-mal geändert.

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Dynamisches Array in procedure

Beitrag von indianer-frank »

h-elsner hat geschrieben:Irgendwie fehlt mir der Zugang. Ich wollte ein dynamisches Array in in einer Function (oder Procedure) nutzen. Da bekomme ich aber beim Kompilieren folgenden Fehler:
"Error: Type mismatch" bei SetLength.
Ich habe das mal auf folgende einfache Prozedur heruntergebrochen, wo der Fehler (bestimmt mein Fehler) auftritt:

Code: Alles auswählen

 
procedure AddValue(var myArr: Array of integer; value: integer);
 

Die Arrays, die die Prozedur benutzen wollen, sind im Hauptprogramm mit SetLength(testarray, 0); initialisiert worden.

MyArr ist hier kein dynamisches Array sondern ein Open-Array (siehe https://www.freepascal.org/docs-html/re ... 200014.4.5) deshalb der Mismatch-Fehler. Mit dieser Änderung

Code: Alles auswählen

type
  TMyArray: Array of integer;
 
procedure AddValue(var myArr: TMyArray:; value: integer);
begin
  SetLength(myArr, Length(MyArr) + 1);
  MyArr[High(myArr)] := value;
end;
 
sollte es funktionieren.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Dynamisches Array in procedure

Beitrag von h-elsner »

Vielen Dank! Also so geht es, aber leider leuchtet mir das nicht ein.
Wieso kann ich dann in der aufrufenden, zum Formular gehörigen, Prozedur das Array als dynamisches Array benutzen? Da ist es einfach als Variable definiert:
var MyVariable : array of type;
In dieser Prozedur kann ich es mit SetLength "bearbeiten", sprich benutzen, wie ich mir das in meinem naiven Geddanken vorgestellt habe.
Sieht so aus, dass man diese Variable dann nicht als Parameter übergeben kann. Warum, wie durch Zauberhand zu einem Open Array wird verstehe ich erstmal nicht. Ich werde mal die Beschreibung zum Open Array studieren und hoffe ich verstehe das dann (warum und wozu).
Ich würde mich gerne nochmal melden, wenn ich es nicht kapiere, OK?

Gruß HE

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: [gelöst] Dynamisches Array in procedure

Beitrag von indianer-frank »

Open-Arrays gibt es ausschließlich als Parameter in Prozeduren/Funktionen. Es ist ein historisches Überbleibsel aus den Zeiten, als es noch keine dynamischen Arrays gab, der aktuelle Parameter kann so je nach Aufruf auch ein konstantes Array sein. Die Länge des Arrays ist in der Produzur konstant (und wird via Compiler-Magic übergeben), der höchste Index kann mit high() angsprochen werden. Siehe die procedure Average() und die drei verschiedenen Aufrufe in der Doku.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: [gelöst] Dynamisches Array in procedure

Beitrag von h-elsner »

Vielen Dank für die Erläuterungen. Ich glaube, ich verstehe das nun annäherungsweise. Das ist eine Art Kopie, auf der man in einer Prozedur zugreifen kann, aber deren Dimensionen nicht verändert werden können, d.h es kein neuer Speicher allokiert. Und mit dem selbst definierten Array Typ zwingt man der Prozedur das dynamiche Array auf bzw. teilt ihr das zwingend mit.
So mein laienhaftes Verständnis. Auf jeden Fall geht es so, wie du gesagt hast auf's feinste.

Gruß HE

Antworten