AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

const foo: array of TMyRecord = (myArray:???)

Ein Thema von yankee · begonnen am 12. Mai 2010 · letzter Beitrag vom 12. Mai 2010
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 11:30
Hi @ll,

folgendes Beispiel:
Delphi-Quellcode:
type
  TDynIntegerArray: array of integer;
  TMyRecord = record
    myArray: TDynIntegerArray;
  end;
...
procedure foobar;
const
  foo: array of TMyRecord = (myArray:(1,2,3)); // <-- Falsch. Wie geht es richtig?
begin
...
end;
Dieser code funktioniert so nicht, aber ich hoffe man kann sehen, was ich versuche zu tun. (Mir fällt es nämlich leider etwas schwer das Problem in Worte zu fassen: "Ich hätte gerne einen konstanten dynamischen array...")
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  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
 
#2

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 11:31
foo: array of TMyRecord = (myArray: TDynIntegerArray.Create(1,2,3)); So könnte es evtl. gehen.

PS: So geht es doch nicht. Außerdem kann man dynamische Arrays allgemein nicht initialisieren. D.h. du müsstest schon ein Array[0..Max] of TMyRecord nehmen oder so.
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 himitsu
himitsu

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

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 11:35
ein Laufzeitcode ( .Create ) zum Compilierungs-Zeit ... das kann nicht gehn.

Dynamische Arrays können nicht als Konstante initialisiert werden.
Abgesehn davon, daß ein dynamisches "veränderliches" Array als "statische" Konstannte eh sinnlos ist.


Also entweder ein statisches Array verwenden (siehe Neutral General)
oder du kommst nicht drumrum das Array erst zur Laufzeit via QuellCode zu erstellen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 11:41
Zitat von himitsu:
Abgesehn davon, daß ein dynamisches "veränderliches" Array als "statische" Konstannte eh sinnlos ist.
Nicht so ganz, denn ich habe mehrere array Konstanten, die unterschiedlich lang sein sollen. Also mal kurzgefasst in JSON:
Code:
({myArray:[1]},{myArray:[1,2,3]},{myArray:[]})
In der deklaration is myArray dynamisch. Wenn ich es statisch machen würde, dann müssten alle meine Konstanten dieses Typs die gleiche Größe haben oder sehe ich das falsch?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 11:52
Du weißt aber, daß JSON eh keine "echten" Konstanten kennt, da es "nur" ein Format einer ScriptSprache ist und somit alles "nur" dynamisch verwaltet wird.
(dieses JSON-String wird da auch erst zur Laufzeit über einen Parser zerlegt)

Dynamische Array und statische Arrays werden im statisch generierten Delphi-Code nunmal komplett unterschiedlich verwaltet.

Dynamische Arrays werden im Speichermanager verwaltet und dieser existiert nunmal, zum Zeitpunkt der Compilierung, noch nicht.

Was du aber machen kannst:
Die Konstanten als statisches Array anlegen und dann über eine Funktion zur Laufzeit in das dynamische Array umkopieren.

[info]
Ich will nicht sagen, daß es absolut keine Möglichkeit gibt, ein dynArray nicht zur CompileTime statisch vorzubelegen, aber sowas ist mit mehr Schwierigkeiten verbunden, als es Nutzen bringt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#6

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 13:49
Zitat von himitsu:
Du weißt aber, daß JSON eh keine "echten" Konstanten kennt, da es "nur" ein Format einer ScriptSprache ist und somit alles "nur" dynamisch verwaltet wird.
(dieses JSON-String wird da auch erst zur Laufzeit über einen Parser zerlegt)
Ja, das ist schon klar, ich habe das nur als JSON geschrieben um zu verdeutlichen, was ich nachher im Speicher stehen haben will. Nur um eine Vorstellung zu vermitteln. Ich hätte es natürlich auch auf deutsch ausformulieren können, aber das wäre dann vermutlich auch schlecht zu verstehen gewesen.

Ich habe rein zu Demonstrationszwecken den KMP-Algorithmus implementiert und ein paar einfach test cases geschrieben, die ich einfach zu Demonstrationszwecken drüberrasseln lassen kann.

Delphi-Quellcode:
// == Defining test cases == //
// 1. testcase (pattern + text is identical)
  testCases[0].pattern := 'aababaab';
  testCases[0].text := testCases[0].pattern; // text and pattern is identical
  // there should be exactly one occurence at the first character of the string
  SetLength(testCases[0].occurences, 1);
  testCases[0].occurences[0] := 1;
// 2. testcase (pattern occures somewhere in the middle)
  testCases[1].pattern := 'aababaab';
  testCases[1].text := 'aaa' + testCases[1].pattern + 'aaa';
  // there should be exactly one occurence at the fourth character of the string
  SetLength(testCases[1].occurences, 1);
  testCases[1].occurences[0] := 4;
// 3. testcase: (pattern does not occur in the string)
  testCases[2].pattern := 'aababaab';
  testCases[2].text := 'aaaaaabbbbbbbbaaaabbbbhhhhhaaadddd';
  // there should be no occurences
  SetLength(testCases[2].occurences, 0);
// 4. testcase: (pattern occures several time without overlapping each other)
  testCases[3].pattern := 'aababaab';
  testCases[3].text := 'aa' + testCases[3].pattern + 'a' + testCases[3].pattern;
  // there should be two occurences at the 3rd and 12th character of the string
  SetLength(testCases[3].occurences, 2);
  testCases[3].occurences[0] := 3;
  testCases[3].occurences[1] := 12;
// 5. testcase (pattern occures several times with overlapping each other)
  testCases[4].pattern := 'aababaab';
  testCases[4].text := 'aababaababaab';
  // there should be two occurences at the 1st and 6th character of the string
  SetLength(testCases[4].occurences, 2);
  testCases[4].occurences[0] := 1;
  testCases[4].occurences[1] := 6;
// DONE: Building test cases
Gut, geht natürlich. Aber so richtig hyperübersichtlich ist es dann finde ich doch nicht. Vorallem, weil es auch etwas fehleranfällig ist, wenn man einmal sich beim setlength vertut oder bei einem array index. Das könnte man ja theoretisch auch automatisch auflösen. Also wenn da noch wer eine Idee hat...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 14:25
Sind in FPC auch Record-Methoden möglich?
Wenn ja, dann würde ich eine Verwendung dieser Vorschlagen.

Delphi-Quellcode:
TMyRecord = record
  myArray: TDynIntegerArray;
  procedure Add(Value: Integer);
end;

procedure TMyRecord.Add(Value: Integer);
var
  i: Integer
begin
  i := Length(myArray);
  SetLength(myArray, i + 1);
  myArray[i] := Value;
end;
Delphi-Quellcode:
TTestCases = record
  FData: Array of TData;
  ...
  property Data[index: Integer]: TData read GetData; default;
  function Add(Pattern, Text: String; occurences: array of Integer): Integer;
end;


// == Defining test cases == //
// 1. testcase (pattern + text is identical)
testCases.Add('aababaab', testCases[0].pattern, [1]);
// 2. testcase (pattern occures somewhere in the middle)
testCases.Add('aababaab', 'aaa' + testCases[1].pattern + 'aaa', [4]);
// 3. testcase: (pattern does not occur in the string)
testCases.Add('aababaab', 'aaaaaabbbbbbbbaaaabbbbhhhhhaaadddd', []);
// 4. testcase: (pattern occures several time without overlapping each other)
testCases.Add('aababaab', 'aa' + testCases[3].pattern + 'a' + testCases[3].pattern, [3, 12]);
// 5. testcase (pattern occures several times with overlapping each other)
testCases.Add('aababaab', 'aababaababaab', [1, 6]);
// DONE: Building test cases
Wobei sich das Ganze auch über eine Klasse lösen liese.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#8

Re: const foo: array of TMyRecord = (myArray:???)

  Alt 12. Mai 2010, 14:44
Zitat von himitsu:
Sind in FPC auch Record-Methoden möglich?
Wenn ja, dann würde ich eine Verwendung dieser Vorschlagen.
Also bis Version 2.4.0 noch nicht. Muss man evtl. Klassen oder TP-Objekte nehmen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:08 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