AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 2-Dimensionale Stringlisten übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

2-Dimensionale Stringlisten übergeben

Ein Thema von Incocnito · begonnen am 5. Sep 2024 · letzter Beitrag vom 22. Sep 2024
Antwort Antwort
Seite 1 von 2  1 2      
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

2-Dimensionale Stringlisten übergeben

  Alt 5. Sep 2024, 13:36
Moin Zusammen!

ich kann ja folgendes defineiren:

Delphi-Quellcode:
type
  TAbcPair = Array [0..1] of string;
Procedure Test(const slValues : Array of TAbcPair);
aber wenn ich dann
Test([['hi', 'bla'], ['test1', 'test2']]);
aufrufen will, findet das Delphi uncool.

Ich könnte nun Funktionen drumzu bauen, so dass da beispielsweise
Test([C('hi', 'bla'), C('test1', 'test2')]);
steht. Das finde ich aber nicht so sympatisch.

Das ist nun kein Weltuntergang, aber vielleicht hat da jemand ein
"mach das doch so-und-so" spotan im Kopf.

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#2

AW: 2-Dimensionale Stringlisten übergeben

  Alt 5. Sep 2024, 14:31
"mach das doch so-und-so"
Wenn du flexibel sein willst, schreibe: procedure Test(const pmcNameValuePairs: array of const); Jedes Element im Array ist vom Typ TVarRec. Dann kannst du: Test(['hi'‚ 3, 'test'‚ 'bla']); schreiben.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: 2-Dimensionale Stringlisten übergeben

  Alt 5. Sep 2024, 21:10
So sollte es funktionieren:
Delphi-Quellcode:
type
  TAbcPair = TArray<string>;

Procedure Test(const slValues : TArray<TAbcPair>);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: 2-Dimensionale Stringlisten übergeben

  Alt 6. Sep 2024, 00:30
Niemand hat hier gesagt, um welche Delphiversion es geht.

Ursprünglich konnte man Array-Deklarationen nur direkt an ein OpenArray übergeben, also wo der Parameter direkt als array of ... deklariert wurde.
Allem Anderen konnte man ausschließlich Variablen/Konstanten (und Property, sowie Function-Results) genau dieses Typs übergeben.

Auch wenn sich da in den letzten Jahren / Delphiversionen schon so einiges getan hatte und man nun auch Variablen direkt solche Array via [...] übergeben kann,
ist der Compiler manchmal echt saudämlich.
Neuerdings geht es "eigentlich" auch direkt an dynamische Array-Konstanten, aber ... siehe unten der erste Link.

Delphi-Quellcode:
type TAbcPairArray = TArray<TArray<string>>;
procedure Test(const slValues : TAbcPairArray);

type TAbcPair = TArray<string>;
procedure Test(const slValues : TArray<TAbcPair>);

procedure Test(const slValues : TArray<TArray<string>>);

procedure Test(const slValues : array of TArray<string>); // OpenArray mit Array-Typ

procedure Test(const slValues : array of array of string); // OpenArray

PS: auch noch bissl was zu Arrays:
https://embt.atlassian.net/servicede...tal/1/RSS-1691
https://quality.embarcadero.com/browse/RSP-42255
https://quality.embarcadero.com/browse/RSP-39686
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Sep 2024 um 00:48 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#5

AW: 2-Dimensionale Stringlisten übergeben

  Alt 6. Sep 2024, 16:00
Moin Zusammen,

ich nutze Delphi 11.

Das witzige ist ja, dass ich die Funktion so definieren kann, aber nicht mit "[['1', '2'], ['3', '4']]" aufrufen kann.
Und ich würde schon gerne vorgeben, dass ich eine Liste haben will mit Elementen, die je 2 Strings haben.
Das scheint also nicht zu gehen.

https://quality.embarcadero.com/browse/RSP-42255
... verwirrt mich vollends. Das ergibt für mich 0 Sinn.
Also jeder einzelne Punkt dort ist was anderes, als was ich erwarten würde ...
einzig "Sig0 is OK" ist für mich noch logisch.
Ich hoffe (da es als "Bug" gelistet ist) dass es ein Bug ist, der schon behoben wurde.
Ich hätte nun schon gesagt, dass ich in Delphi nicht absolut unfähig bin und das passt für mich gar nicht.

Vielen Dank für die Zeit und Mühe.

LG
Incocnito
  Mit Zitat antworten Zitat
rebas

Registriert seit: 18. Sep 2024
3 Beiträge
 
#6

AW: 2-Dimensionale Stringlisten übergeben

  Alt 18. Sep 2024, 04:56
Zitat:
Moin Zusammen,

ich nutze Delphi 11.

Das witzige ist ja, dass ich die Funktion so definieren kann, aber nicht mit "[['1', '2'], ['3', '4']]" aufrufen kann.
Und ich würde schon gerne vorgeben, dass ich eine Liste haben will mit Elementen, die je 2 Strings haben.
Das scheint also nicht zu gehen.

https://quality.embarcadero.com/browse/RSP-42255geometry dash subzero

... verwirrt mich vollends. Das ergibt für mich 0 Sinn.
Also jeder einzelne Punkt dort ist was anderes, als was ich erwarten würde ...
einzig "Sig0 is OK" ist für mich noch logisch.
Ich hoffe (da es als "Bug" gelistet ist) dass es ein Bug ist, der schon behoben wurde.
Ich hätte nun schon gesagt, dass ich in Delphi nicht absolut unfähig bin und das passt für mich gar nicht.

Vielen Dank für die Zeit und Mühe.

LG
Incocnito
Wenn du versuchst, eine Liste mit Elementen zu erstellen, die jeweils zwei Strings enthalten, dann könnte eine Datenstruktur wie TList<TArray<string>> oder eine benutzerdefinierte Record- oder Tuple-Implementierung hilfreich sein.
Code:
uses
  System.Generics.Collections, System.SysUtils;

var
  List: TList<TArray<string>>;
  Item: TArray<string>;
begin
  List := TList<TArray<string>>.Create;
  try
    Item := TArray<string>.Create('1', '2');
    List.Add(Item);
    Item := TArray<string>.Create('3', '4');
    List.Add(Item);

    // Zugriff auf die Liste
    Writeln(List[0][0] + ', ' + List[0][1]); // Ausgabe: 1, 2
    Writeln(List[1][0] + ', ' + List[1][1]); // Ausgabe: 3, 4
  finally
    List.Free;
  end;
end.
Hiermit erzeugst du eine Liste, die Paare von Strings als Arrays speichert. Wichtig ist, dass bei der Erstellung der Arrays die Methode TArray<string>.Create() verwendet wird.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#7

AW: 2-Dimensionale Stringlisten übergeben

  Alt 18. Sep 2024, 08:32
Es ist ja kein Problem records / objekte zu erstelllen, die diese Daten abbilden.

Was geht ist:

Delphi-Quellcode:
type
  TAbcPair = Array [0..1] of string;
  TSomeList = Array of TAbcPair;
Procedure Test(const slValues : TSomeList);
...
Procedure DoSomething();
var
  liste : TSomeList;
begin
  SetLength(liste, 2);
  liste[0][0] := '1';
  liste[1][0] := '2';
  liste[0][1] := '3';
  liste[1][1] := '4';
  Test(liste);
end;
aber ich will ja nicht den Umweg über eine (oder gar mehrere Variablen) gehen,
sondern einfach nur:

Delphi-Quellcode:
Procedure DoSomething();
begin
  Test([['1', '2'], ['3', '4']]);
end;
und das geht nicht.

Da aber

Delphi-Quellcode:
Procedure Text(vals : TDynStringArray);
...
Procedure DoSomething();
begin
  Test(['1', '2', '3', '4']);
end;
geht, verstehe ich nicht, warum ich 2-dimensionale Listen nicht zum Laufen bringen kann.
Generell scheint es doch zu gehen mit Listen als Parameter diese direkt zu füllen.
  Mit Zitat antworten Zitat
TiGü

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

AW: 2-Dimensionale Stringlisten übergeben

  Alt 18. Sep 2024, 09:19
Kompiliert in Delphi 11.3 und spuckt die Strings aus:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
    System.SysUtils;

procedure Test(const A2DStringArray: TArray<TArray<string>>);
begin
     for var SingleStringArray in A2DStringArray do
     begin
         for var SingleString in SingleStringArray do
         begin
            Writeln(SingleString);
         end;
     end;
end;

procedure DoSomething();
begin
    Test([['1', '2'], ['3', '4'], ['5', '6'], ['Auto', 'Baum'], ['Steuererklärung', 'Die Waldfee']]);
end;

begin
    try
        DoSomething
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
    Readln;
end.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#9

AW: 2-Dimensionale Stringlisten übergeben

  Alt 18. Sep 2024, 13:25
Delphi erlaubt hier aber nur Listen von variabler Länge, nicht "Array [0..1] of string".
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TAbcPair = Array [0..1] of string;
  TSomeList = Array of TAbcPair;

procedure Test(const A2DStringArray: TSomeList);
begin
  for var SingleStringArray in A2DStringArray do
  begin
    for var SingleString in SingleStringArray do
    begin
      Writeln(SingleString);
    end;
  end;
end;

procedure Test2(const A2DStringArray: TAbcPair);
begin
  for var SingleStringArray in A2DStringArray do
  begin
    Writeln(SingleStringArray);
  end;
end;

begin
  try
    Test([['1', '2'], ['3', '4']]); // <- Inkompatible Typen: 'TAbcPair' und 'Set'
    Test2(['1', '2']); // <- Inkompatible Typen: 'TAbcPair' und 'Set'

    var liste : TAbcPair;
    liste[0] := '5';
    liste[1] := '6';
    Test([liste]); // <- Alles cool
    Test2(liste); // <- Alles cool
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Geändert von Incocnito (18. Sep 2024 um 13:28 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: 2-Dimensionale Stringlisten übergeben

  Alt 18. Sep 2024, 15:40
Ja, dann mach doch nicht?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:21 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