AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SetLenght mit einem Array als var Parameter

Ein Thema von Rabenrecht · begonnen am 22. Mai 2017 · letzter Beitrag vom 24. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2   
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 13:09
Delphi-Version: 5
Folgendes:

Delphi-Quellcode:
Procedure myProc(var Arr : Array of whatever);
begin
  [...]
  SetLength(Arr, irgendnezahl);
  [...]
end;
Da spuckt mir Delphi eine "Inkompatible Typen" Meldung beim Kompilieren aus.

Habe beim Rumprobieren, was da eigentlich den Fehler verursacht, herausgefunden, dass die Übergabe des Array als Referenz (also als Var Parameter) das Problem ist.

Frage 1: Warum ist das so?
Kann mir da keinen zwingenden technischen Grund denken.

Frage 2: Kann man das irgendwie umgehen?


Die dynamische Veränderung der Größe des Arrays zur Laufzeit ist sinnvoll, da die Frage, ob und wenn ja wie viele Daten, die das Array aufnehmen soll, erst zur Laufzeit beantwortet werden kann.

Die Auslagerung der Logik nach myProc ist auch sinnvoll, da sie an unterschiedlichen Stellen in unterschiedlichen Kontexten gebraucht wird.
Will nicht heißen, dass ich den Code nicht grundlegend umstellen könnte, aber eigentlich wärs mir lieber, wenn das so, wie es jetzt im Wesentlichen ist, funktionieren würde


Nachtrag:

var oder nicht var macht keinen Unterschied.
Allein die Tatsache, dass das Array als Parameter übergeben wird, ist wohl ein Problem ... was mich noch verwirrter als vorher zurücklässt.

Geändert von Rabenrecht (22. Mai 2017 um 13:13 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 13:14
Frage 1: Warum ist das so?
Weil der Compiler anscheinend nicht schlau genug ist zu sehen dass der Typ deiner Variable und der Typ deines Parameters der gleiche ist. Das "Array of" scheint zwei mal inline einen neuen Typ zu generieren. So zumindest hat man mir das mal erklärt.

Kann man das irgendwie umgehen?
Delphi-Quellcode:
type
   TWhatever = type Integer;
const
   someSpookyNumer = 42;
var
   myArray: TArray<TWhatEver>; // statt "array of TWhatEver"

procedure p(var data: TArray<TWhatever>); // statt "array of TWhatEver"
begin
   SetLength(data, someSpookyNumer);
end;

begin
   p(myArray);
end.
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 13:28
Ok, mit TArray<Type> anstatt Array of Type gibt zumindest der Kompiler Ruhe
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 13:54
Zum Warum: In Procedure myProc(var Arr : Array of whatever) ist ein Arr ein Open Array und kein dynamisches Array siehe http://docwiki.embarcadero.com/RADSt...ray_Parameters
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#5

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 14:50
Hallöle...

Alternativ wäre auch eine TList<Whatever> oder TObjectlistList<Whatever> als Parameter, ohne Größeneinstellung, denkbar.

PS: Im Eingangspost steht Delphi 5? Ist das korrekt?

Geändert von haentschman (22. Mai 2017 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 15:16
PS: Im Eingangspost steht Delphi 5? Ist das korrekt?
Das ist leider immer noch der unsägliche Standardwert. Ich hätte da auch lieber ein <nicht angegeben> - das führt zu wesentlich weniger Verwirrung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 15:38
da fallen mir doch uralte Sünden ein?
wie wäre es mit:
Delphi-Quellcode:

type
  Tmyarray : Array of whatever;

Procedure myProc(var Arr : TMyArray);
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 15:52
da fallen mir doch uralte Sünden ein?
wie wäre es mit:
Delphi-Quellcode:

type
  Tmyarray : Array of whatever;

Procedure myProc(var Arr : TMyArray);
Gruß
K-H
Wenn, dann bitte so wie Günther oben schrieb, alles andere führt nur wieder zu Typinkompatibilitäten.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#9

AW: SetLenght mit einem Array als var Parameter

  Alt 22. Mai 2017, 17:22
Delphi-Quellcode:
type
  Tmyarray : Array of whatever;
Hier muß immer dieser Typ verwendet werden ... nochmal irgendwo ein Array of whatever ist mit diesem Typen und mit TArray<whatever> nicht kompatibel.

Der Generic TArray<whatever> ist unterander kompatibel, egal wie oft man das irgendwo deklariert.


Wegen soeinem Mist ist TArray<Byte> , was oft verwendet wird, mit dem TBytes nicht kompatibel und man kann diese Byte-Arrays oftmals in vielen vorhandenen Funktionen verwenden, weil einige mit TArray<> und Andere mit TBytes deklatiert wurden, aber Emba einfach seit Jahren nicht auf die Bugreports reagiert, wo man darum bittet den Typen TBytes als TArray<Byte> zu deklarieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: SetLenght mit einem Array als var Parameter

  Alt 23. Mai 2017, 07:54
...aber Emba einfach seit Jahren nicht auf die Bugreports reagiert, wo man darum bittet den Typen TBytes als TArray<Byte> zu deklarieren.
Vielleicht weil das schon vor Jahren passiert ist?
Siehe bspw. Delphi XE6, Unit System.SysUtils, Zeile 137:
Delphi-Quellcode:
type

  TBytes = TArray<Byte>;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz