AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Adresse eines dynamischen typisierten Arrays als Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

Adresse eines dynamischen typisierten Arrays als Parameter

Ein Thema von Thomas233 · begonnen am 10. Feb 2005 · letzter Beitrag vom 15. Feb 2005
Antwort Antwort
Seite 1 von 3  1 23      
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#1

Adresse eines dynamischen typisierten Arrays als Parameter

  Alt 10. Feb 2005, 18:06
Guten Abend,

ich würde gerne ein dynamisches Array als Parameter übergeben.
Was mir Schwierigkeiten bereitet ist die Tatsache das ich nicht will das die Funktion der das Array übergeben wird mit einer Kopie des übergebenen Arrays arbeitet (also das Array nochmals am Stack anlegt wird und dann deren Inhalte ins neue Array kopiert werden) da dies bei größeren Arrays ein zu großer zeitlicher Aufwand wäre.
Am optimalsten wäre es die Startadresse des dynamischen Arrays als Parameter zu übergeben und dann in der Funktion mit der Startadresse zu arbeiten (wobei es schon recht toll wäre mit einem typisierten Pointer zu arbeiten). In C geht das eben mit typisierten Pointern.

Wie mache ich das in Delphi?

Vielen Dank im Vorraus für eure Hilfe !

Mit freundlichen Grüßen,
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:10
Mit eine var-Parameter wird automatisch die Adresse übergeben, und keine Kopie angelegt.
Delphi-Quellcode:
procedure(var DeinArray: TDeinArrayTyp);
begin
.
.
.
end;
Du musst dir nur einen Type für das dyn. Array machen
Delphi-Quellcode:
type
  TDeinArrayTyp = array of Integer;
Der übergebene Parameter muss dann auch vom Typ TDeinArrayTyp sein.

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:12
Hi Fabian,

danke für die rasche Antwort.

Aber: Wird so nicht das Array bei der Übergabe (in den Stack) kopiert ?

Mit freundlichen Grüßen,
Thomas Tschofenig
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:16
Nope, durch Angabe des Schlüsselwortes "var" wird vom Compiler nur ein Pointer auf das Array übergeben. Du brauchst dich aber, anders als bei C, nicht in der procedure drum zu kümmern; du kannst alles so schreiben wie mit für Kopien. Das ist imho das hauptsächliche was Delphi im Vergleich zu C so schön und lesbar macht

\\edit: Es ist also dann ein Call-by-Reference, während ohne "var" ein Call-by-Value gemacht wird.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:25
Oh, sorry, das hatte ich nicht gewusst.

Und wenn ich jetzt z.b. eine Basisklasse habe und ich will der Funktion aber eine Abwandlung der Basisklasse übergeben (bzw. ein Array vom Typ der abgewandelten Klasse) geht das dann auch wenn man nur ein Array vom Typ der Basisklasse deklariert hat (in der Unit wo die Funktion drinnen ist) ?

Vielen Dank !

Mit freundlichen Grüßen,
Thomas Tschofenig
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:34
Ich schreibe mal, wei ich das jetzt verstanden habe

Delphi-Quellcode:
type
  TBaseClass = class(TObject);
  .
  .
  end;
  
  TDerived = class(TBaseClass);
  .
  .
  end;

  TMyArray = array of TBaseClass;
end;

.
.

procedure Foo(var v: TMyArray);
begin
.
.
end;

var
  arr: TMyArray;
begin
  SetLength(arr, 1);
  arr[0] := TDerived.Create;
  Foo(arr);
end;
So ginge das. Allerdings hat das weniger mit Arrays an sich zu tun, als viel mehr mit OOP. Das hat auch zur Folge, dass du über "arr" nur die Felder der Klassen erreichst, die auch in TBaseClass deklariert sind. Ansonsten musst du casten: TDerived(arr[0]).FunktionInDerived;

Ich hoffe ich hab das jetzt richtig verstanden

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:38
Bei dynamischen Arrays kann man sich in diesem Fall die var-Angabe sparen, da dynamische Arrays von sich aus Referenztypen sind, ähnlich wie die C-Arrays (nur dass diese u.U. auf dem Stack liegen, Delphi dyn. Arrays aber immer auf dem Heap).
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 18:50
Hi dizzy,

fast

Delphi-Quellcode:
type
  TBaseClass = class(TObject); //In BaseClass.pas deklariert
  .
  .
  end;
  
  TDerived = class(TBaseClass); //In DerivedClass.pas deklariert
  .
  .
  end;

  TMyArray1 = array of TBaseClass; // Vorsicht: Ist deklariert in der Unit in welcher die Funktion "Foo" vorkommt, in Unit1.pas
  TMyArray2 = array of TDerived; // Ist deklariert in der Unit in der die Funktion "Foo" aufgerufen wird, also in Unit2.pas
end;

.
.

// In Unit1.pas
procedure Foo(var v: TMyArray1);
begin
.
.
end;

// In Unit2.pas
procuedre TuWas;
var
  arr: TMyArray2;
begin
  SetLength(arr, 1);
  Foo(arr);
end;
uses-Klausel von Unit1.pas:
BaseClass.pas

uses-Klausel von Unit2.pas:
DerivedClass.pas
Unit1.pas

Ich schätze mal das geht so nicht, oder?

Mit freundlichen Grüßen,
Thomas Tschofenig
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 19:05
Zitat:
Bei dynamischen Arrays kann man sich in diesem Fall die var-Angabe sparen, da dynamische Arrays von sich aus Referenztypen sind, ähnlich wie die C-Arrays (nur dass diese u.U. auf dem Stack liegen, Delphi dyn. Arrays aber immer auf dem Heap)
Was ist Heap?
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#10

Re: Adresse eines dynamischen typisierten Arrays als Paramet

  Alt 10. Feb 2005, 19:14
Zitat von dizzy:
Nope, durch Angabe des Schlüsselwortes "var" wird vom Compiler nur ein Pointer auf das Array übergeben. Du brauchst dich aber, anders als bei C, nicht in der procedure drum zu kümmern; du kannst alles so schreiben wie mit für Kopien. Das ist imho das hauptsächliche was Delphi im Vergleich zu C so schön und lesbar macht

\\edit: Es ist also dann ein Call-by-Reference, während ohne "var" ein Call-by-Value gemacht wird.
Äh, sicher? Mit dem Schlüsselwort var wird doch überhaupt kein Wert mehr übergeben (auch kein Zeiger), da es ja eine Referenz darstellt. D.h. es wird kein neuer Zeiger auf dem Stack angelegt, der auf das Array zeigt, sondern die Funktion "kennt" das ursprüngliche Array einfach.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:01 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