AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Array als Referenz einer Methode übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Array als Referenz einer Methode übergeben

Ein Thema von TheMiller · begonnen am 22. Nov 2009 · letzter Beitrag vom 23. Nov 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 13:31
Genau. Wenn Du wieder testen kannst, versuch es mal damit (klitzekleine Änderung):
Delphi-Quellcode:
type tNumArray = Array of Byte;

procedure AddNumbers(var a:tNumArray);
begin
  SetLength(a,High(a)+3); // add 2 numbers
  a[High(a)-1]:=44;
  a[high(a) ]:=55;
end;

procedure TfoTest03.FormShow(Sender:TObject);
var i : Integer;
    NumArray : tNumArray; //nun als lokale Variable
begin
  SetLength(NumArray,Listbox1.Items.Count);

  for i:=0 to Listbox1.Items.Count-1 do // array aus listbox1
   NumArray[i]:=StrToInt(Listbox1.Items[i]); // füllen

  AddNumbers(NumArray); // array erweitern

  for i:=0 to high(NumArray) do // array in listbox2
   Listbox2.Items.Add(IntToStr(NumArray[i])) // anzeigen
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#12

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 13:34
Danke. Das wird in ca. 1-2 Stunden sein. Gebe auf jeden Fall Rückmeldung. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#13

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 17:24
Also, genau so, wie es jetzt von dir gepostet wurde (DeddyH), hatte ich es von Anfang an gehabt. Hier nochmal meine Version, falls ich was übersehen habe.

Delphi-Quellcode:
type
  TSQLData = array of array of String;

type
  //SQL-Funktionen
  procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true);
  function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean;

//SQL-Funktionen
procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true);
begin
  SetLength(data, Succ(Length(data)), 2);
  if (utf8enc) then
  begin
    data[High(data)][0]:=utf8encode(feld);
    data[High(data)][1]:=utf8encode(wert);
  end else
  begin
    data[High(data)][0]:=feld;
    data[High(data)][1]:=wert;
  end;
end;

function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean;
var
  i: Integer;
begin
  for i:=0 to High(data) do
  begin
    ShowMessage(data[i][0]+' '+data[i][1]);
  end;
end;

///////////////////
//// HAUPTUNIT ////
///////////////////

procedure TForm1.frmSchemabtnSaveClick(Sender: TObject);
var
  daten: TSQLData;
begin
  AddSQLField(daten, 'pid', '1');
  AddSQLField(daten, 'titel', frmGesetz.Editor.Text);
  AddSQLField(daten, 'text', 'test2');
  InsertSQL(ZQuery1, 'test', daten);
end;
So, und in der Bibliotheks-Unit wird nicht die lokale Variable "Daten" genutzt, sondern eine völlig neue, gleichen Typs initialisiert und beschrieben.

Ich verstehe aber ehrlich gesagt nicht, wieso das so ist. Denn, ein Array ist doch schon ein Pointer auf eine Adresse und wenn ich diesen übergebe, wie kann dann ein neues Array angelegt werden?

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 17:30
Bei Arrays verhält es sich anders als bei Objekten. Übergib die Arrays doch einmal als Var-Parameter, dann sollte das auch klappen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 17:31
Du hast Detlefs "var" unterschlagen. Der Grund, warum dies nötig ist, ist einfach: Es kann vorkommen, dass SetLength die Array-Daten verschieben muss, der Zeiger selbst wird also verändert. Aus diesem Grund ist der erste Parameter von SetLength auch als var deklariert. Wenn du nun den Array-Parameter nicht als var deklarierst, zählt der Parameter als neue Referenz (dynamische Arrays unterliegen der Referenzzählung). SetLength muss daher in jedem Fall ein neues Array anlegen, um die andere Referenz nicht zu verändern.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#16

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 17:46
Oha... das wusste ich nicht. Auch ist mir das VAR garnicht aufgefallen. Ich sollte öfter 9Live schauen, um meine Augen zu trainieren

Ich werde das - leider wieder - erst später testen ...

Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 18:43
Warum muss es denn ein Array sein?
Ein Liste (z.B. eine Ableitung von TList oder TObjectlist) kann all das leisten, was du brauchst.

Übrigens, schau die mal folgende Deklarationen an:
Delphi-Quellcode:
procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true);
function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean;
Was fällt auf? Richtig, beides Mal wird TSQLData übergeben.
Eigentlich müsste doch TSQLData eine Klasse sein, dann würde sich Einiges vereinfachen.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#18

Re: Array als Referenz einer Methode übergeben

  Alt 22. Nov 2009, 21:08
Oh jubel, oh freu...

Funktioniert richtig gut. Es lag tatsächlich am --var--. Vielen Dank.

@sx2008: Ich mag arrays... Nein, ich wollte keine Klasse bauen, weil mir dafür der Aufwand zu groß und das Projekt in dem Punkt zu klein ist. Außerdem kann ich auf Grund einer Bandscheiben-OP nicht sitzen. Darf nur stehen. Das ist auch der Grund, warum ich nie so lange am PC sein kann. Nunja, all diese Sachen summieren sich dann dazu, dass ich mich zu dieser Lösung entscheide, die ja eigentlich so auch nicht schlecht ist, oder?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#19

Re: Array als Referenz einer Methode übergeben

  Alt 23. Nov 2009, 04:15
Zitat von DJ-SPM:
@sx2008: Ich mag arrays...
Deine Fixierung auf einfache Datentypen nennt man übrigens "Bei Google suchenPrimitive Obsession"
Bei Konstruktionen wie array of array of TDatentyp muss man jeder Stelle die Indexgrenzen beachten.
Durch eine Klasse wird dies wesentlich vereinfacht und sicherer.
Ansonsten gute Besserung.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#20

Re: Array als Referenz einer Methode übergeben

  Alt 23. Nov 2009, 08:50


Danke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:38 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