AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Syntax-Frage: Einem Array mehrere Werte "aufeinmal" zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

Syntax-Frage: Einem Array mehrere Werte "aufeinmal" zuweisen

Ein Thema von STaRDoGGCHaMP · begonnen am 15. Okt 2008 · letzter Beitrag vom 15. Okt 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#11

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:11
Da passiert mit Zeigern gar nichts. Dest und Source sind doch im Header der procedure als Arrays deklariert.
Aufgedröselt bedeutet
  Move(Source[Low(Source)],Dest[Low(Dest)],Length(Dest)*4); nichts anderes als:
Verschiebe vom ersten Element des Arrays Source an, alle seine Elemente in das Array Dest, aber nur maximal so viele wie in Dest reinpassen. Und da ist glaub ich noch ein Problem, denn wenn in Source weniger ist als in Dest rein passt, wird unvorhersehbares als weiteres Arrayelement zugeordnet.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:13
Hi,

1) Da hast du recht
2) Dachte ich auch, aber scheinbar ist das nicht der Fall.

Folgendes funktioniert:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    arr: Array[3..7] of String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure FillArray(var Dest: Array of String; Source: Array of String);
begin
  Move(Source[Low(Source)],Dest[Low(Dest)],Length(Dest)*4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillArray(arr,['Hallo','Welt','!','DelphiPraxis','!']);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
  for i:= low(arr) to high(arr) do
    ShowMessage(arr[i]);
end;
Wegen 1) werd ich mal gucken...

@Sherlock

Zitat:
Da passiert mit Zeigern gar nichts.
Doch, es werden nur die Pointer auf die eigentlichen Strings von Array zu Array kopiert

Zitat:
Verschiebe vom ersten Element des Arrays Source an, alle seine Elemente in das Array Dest, aber nur maximal so viele wie in Dest reinpassen.
Richtig.

Zitat:
Und da ist glaub ich noch ein Problem, denn wenn in Source weniger ist als in Dest rein passt, wird unvorhersehbares als weiteres Arrayelement zugeordnet.
Dieser Teil des Arrays wird dann gar nicht angerührt. Von daher kein Problem.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Apollonius

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

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:31
Mit konstanten Strings funktioniert das, da der Referenzzähler dort immer auf -1 steht. Trotzdem sollte man es lieber sauber machen.
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 Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#14

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:32
Hmmm...ich seh das mit den Pointern nicht.
Aus der OH:
Zitat:
procedure Move(const Source; var Dest; Count: Integer);
Move kopiert Count Bytes vom Speicherblock Source in den Block Dest. Bei der Operation wird keine Bereichsprüfung durchgeführt. Überlappungen zwischen Quell- und Zielblock werden automatisch ausgeglichen.

Die Anzahl der zu kopierenden Bytes sollte aus Sicherheitsgründen mit der globalen Funktion SizeOf (Delphi) bzw. dem Operator sizeof (C++) ermittelt werden.
Und in Deinem Code zeigst Du move, wo es anfangen soll, wo es hin soll etc.
In dieser Hinsicht sind vielleicht Source[Low(Source)] und Dest[Low(Dest)] als Zeiger zu werten. Aber kopiert wir doch der Inhalt des Arrays Source.

Aber...

Sherlock
Oliver
  Mit Zitat antworten Zitat
Apollonius

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

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:34
Das Array enthält Ansistrings, welche Zeiger sind. Dabei wird der Referenzzähler nicht erhöht.
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 Uwe Raabe
Uwe Raabe

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

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:49
Zitat von Apollonius:
Das Array enthält Ansistrings, welche Zeiger sind. Dabei wird der Referenzzähler nicht erhöht.
Deswegen ist das

Delphi-Quellcode:
  procedure FillArray(var Dest: array of string; const Source: array of string);
  var
    I: Integer;
  begin
    for I := 0 to Min(Length(source), Length(Dest)) - 1 do
      Dest[I] := Source[I];
  end;
auch die sauberste Methode.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 17:51
Zitat von Uwe Raabe:
Deswegen ist das auch die sauberste Methode.
Mhh.. Wo er Recht hat, hat er Recht
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#18

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 18:49
Zitat von Apollonius:
Mit konstanten Strings funktioniert das, da der Referenzzähler dort immer auf -1 steht.
Problem wird auch sein, wenn folgendes passiert:

Delphi-Quellcode:
  FillArray(arr,['Hallo','Welt','!','DelphiPraxis','!']);

  arr[4]:='bla';

Das Array erhält mit "FillArray" die Zeiger der Konstanten. Dann wird mit dem Zweiten Befehl in den Speicher der Konstanten geschrieben. Übel.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#19

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 19:00
Zitat von Uwe Raabe:
Delphi-Quellcode:
  procedure FillArray(var Dest: array of string; const Source: array of string);
  var
    I: Integer;
  begin
    for I := 0 to Min(Length(source), Length(Dest)) - 1 do
      Dest[I] := Source[I];
  end;
auch die sauberste Methode.

Das ist tatsächlich die eleganteste Lösung.

Zugelernt habe ich, daß der Anfang eines Array in der Procedure immer mit 0 beginnt, obwohl das übergebende Array einen ganz anderen Indexbereich hat. z.B. von 4 bis 8.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

Re: Syntax-Frage: Einem Array mehrere Werte "aufeinmal&

  Alt 15. Okt 2008, 19:21
Zitat von bernau:
Das Array erhält mit "FillArray" die Zeiger der Konstanten. Dann wird mit dem Zweiten Befehl in den Speicher der Konstanten geschrieben. Übel.
Ich kenn mich da nicht 100%ig aus, aber es sind ja keine echten Konstanten. Von daher denke ich, dass es da keinen Unterschied zu "normalen" Variablen gibt. Kann mich aber auch täuschen
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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