![]() |
Wie krieg ich eine Referenz auf Array als Rückgabewert
Hey Leute, sagt mal wie mache ich folgendes:
Ich habe eine Klasse die ein Array of double enthält. Nun will ich in der Klasse eine Methode realisieren die mir einen Zeiger auf dieses Array liefert.
Delphi-Quellcode:
Der Grund ist folgender. Das Array ist sehr groß, und deshalb will ich nicht dass es kopiert wird, sondern ich will lediglich eine Referenz haben, um mehr Performance und weniger Speicherverbrauch zu haben.type TKlasse = class DatenArray : array of double; procedure GetRefDatenArray; end; procedure TKlasse.GetRefDatenArray begin // Hier möchte ich ein Referenz auf das DatenArray liefern end; Vielen Dank an Euch schon mal im Vorraus :-D |
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Da es ein dynamisches Array ist, ist es automatisch intern ein Zeiger. Wenn du die Kopie verhindern willst, dann gib es als VAR Parameter weiter.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Stelle DatenArray als Read-Only-Property zur verfügung.
Quatch - wird ja dann kopiert. :-( Nochmal Edit: Interne Implementierungsdetails (hier Array of double) sollten nicht nach außen sichtbar sein. Erstell ein Array-Property und greif dann auf das interne array of double zu. |
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
@Mütze: du hast mich missverstanden. Ich will nicht das Array an die Funktion übergeben. Dann ist klar dass ich mit var vor dem Parameter eine Referenz übergebe. Was ich machen will ist die andere Richtung. Ich möchte die Methode aufrufen und von ihr eine Referenz des Arrays zurückgeliefert bekommen.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Meinst du das so?
Delphi-Quellcode:
type
TMyarray = array of double; TKlasse = class private fDatenArray : TMyarray; function getDatenArray: TMyarray; public property DatenArray: TMyarray read getDatenArray; end; { TKlasse } function TKlasse.getDatenArray: TMyarray; begin result:=fDatenArray; end; |
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Zitat:
@generic: Das Result ist bei dir auch eine Kopie und nicht das originale Array. Dein Result landet in einer lokalen Variable (also der Zeiger) und somit wird es eine Kopie, da jedes Resize etc sich nur auf die lokale Variable auswirkt und somit niemals die Adresse in der Instanz aktualisiert wird. |
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
hmmmm....es muss doch eine Möglichkeit geben, einfach nur einen Zeiger auf ein Array aus einer Funktion zurückbekommen.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Ein Array ist doch schon ein Zeiger.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Um es genau zu sagen, die Funktion soll mit die Speicheradresse zurückliefern unter der das Array gespeichert ist. Und nicht das Array kopieren, und mir einen Zeiger auf das kopierte Array liefern. Weil ich sonst eine Menge Speicher verschwendet wird.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Na du kannst einfach einen Pointer zurückgeben. Aber daraus einfach eine zweite Referenz auf das Array hinzubiegen, dass dürfte der Compiler nicht so ohne weiteres mitmachen.
|
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Hallo,
ich würd's so machen
Delphi-Quellcode:
So in etwa sollte es gehen
type
PMeinArray = ^TMeinArray; TMeinArray = Array [1..1000] of Irgendwas; var MeinArray : PMeinArray; Loop : Integer; procedure HoleAdresse (MeinArray : PMeinArray); begin MeinArray := @LokalesArray end; begin HoleAdresse (MeinArray); for Loop := 1 to 1000 do TuWasMitElement (MeinArray [Loop]^) end. MfG Klaus |
Re: Wie krieg ich eine Referenz auf Array als Rückgabewert
Schön ist es nicht, eine Pascal-Variante wäre besser. Aber wenn sich keine ergibt:
Delphi-Quellcode:
function TTest.getDatenArray:pointer;
// EAX --> self // EDX --> Pointer auf Result function helpTypeInfo:pointer; type TFieldtype=array of Double; //entsprechend des Types DatenArray //besser wäre es gleich einen //einheitlichen Type zu nehmen begin result:=typeinfo(TFieldtype); end; asm push ebx push edx push eax call helptypeinfo mov ebx,eax //Inhalt des Arrays (in Result) löschen mov eax,[esp+4] mov edx,ebx call system.@finalize //Wert von x an Result übergeben pop eax mov edx,[eax]+DatenArray mov eax,[esp] mov [eax],edx //Referenzzähler erhöhen push edx mov eax,esp mov edx,ebx call system.@addref pop eax pop eax pop ebx end; ... //Aufruf nur so: var x:array of double; begin ... x:=Test.getDatenArray; end; Edit: :gruebel: Generics Variante funktioniert doch super. Warum nimmst du nicht die? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz