[gelöst] Dynamisches Array in procedure

Für Fragen von Einsteigern und Programmieranfängern...

[gelöst] Dynamisches Array in procedure

Beitragvon h-elsner » 30. Mär 2018, 17:40 [gelöst] Dynamisches Array in procedure

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 30. Mär 2018, 21:51, insgesamt 1-mal geändert.
h-elsner
 
Beiträge: 42
Registriert: 24. Jul 2012, 14:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 30. Mär 2018, 18:35 Re: Dynamisches Array in procedure

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.
indianer-frank
 
Beiträge: 132
Registriert: 30. Nov 2008, 21:53

Beitragvon h-elsner » 30. Mär 2018, 21:51 Re: Dynamisches Array in procedure

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
h-elsner
 
Beiträge: 42
Registriert: 24. Jul 2012, 14:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 30. Mär 2018, 22:12 Re: [gelöst] Dynamisches Array in procedure

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.
indianer-frank
 
Beiträge: 132
Registriert: 30. Nov 2008, 21:53

Beitragvon h-elsner » 2. Apr 2018, 08:54 Re: [gelöst] Dynamisches Array in procedure

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
h-elsner
 
Beiträge: 42
Registriert: 24. Jul 2012, 14:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste

porpoises-institution
accuracy-worried