Autor Beitrag
reptile
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Sa 08.08.09 17:04 
folgendes problem: ich will auf einem schachbrett alle möglichen züge des spielers berechnen, der gerade dran ist.
nun ist es kein großes ding, eine funktion zu schreiben, die alle möglichen züge einer einzelnen figur ausgibt. diese funktion könnte ich dann für alle figuren des spielers aufrufen. wie aber kann ich dann die einzelnen arrays die ich dadurch bekomme, zu einem großen array mit allen zügen machen ?
gibt es vielleicht eine art "append" für arrays ?

natürlich kann ich das ganze mit einer schleife einfach in ein neues, großes array kopieren, aber das würde relativ lange dauern...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 08.08.09 17:24 
user profile iconreptile hat folgendes geschrieben Zum zitierten Posting springen:
natürlich kann ich das ganze mit einer schleife einfach in ein neues, großes array kopieren, aber das würde relativ lange dauern...
Was sollte denn eine entsprechende fertige Funktion anderes machen? Also wie kommst du darauf, dass deine Lösung so viel langsamer wäre?

Wie schnell das geht kommt da natürlich auch darauf an wie die Arrays aussehen.

Eine fertige Funktion kenne ich da jedenfalls nicht, wenn du Arrays benutzen möchtest.
reptile Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Sa 08.08.09 17:58 
hmm na gut, ich werde wohl mal versuchen ob ich das irgendwie so schreiben kann, dass die züge direkt schon in ein großes array geschrieben werden (nacheinander). das müsste ich halt dann immer übergeben


Zitat:
Wie schnell das geht kommt da natürlich auch darauf an wie die Arrays aussehen.


wie gesagt, es sollen züge darin gespeichert werden, und ein zug besteht momentan nur aus anfangsfeld und zielfeld.

Zitat:
Eine fertige Funktion kenne ich da jedenfalls nicht, wenn du Arrays benutzen möchtest.


gäbe es denn was sinnvolleres als arrays ?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 08.08.09 18:01 
Wenn du Klassen benutzt, könntest du einfach eine TObjectList aus der Unit Contnrs benutzen mit OwnsObjects auf True. Dann brauchst du dich auch nicht um die Freigabe der Objekte kümmern.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 08.08.09 18:39 
Mach besser eine Liste von Listen statt eine grosse Liste. Ist schneller, spart dir die Kopiererei, und du brauchst keinen immer grösserwerdenden, zusammenhängenden Speicherblock.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 08.08.09 19:09 
Hey,

du könntest ja auch gleich ein großes Aray machen. Du beerechnest die max. Länge die du brauchst un übergibst das Array dann an deine Prozedur, die die Züge brechnet un schreibst dann direkt in das Array...
Aber ich würde dir auch eher zu Listen raten!

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Sa 08.08.09 19:11 
Und, wenn du die Liste selbst als Zeigerkonstrukt implementierst brauchst du zum zusammenhängen nur einen einzigen Zeiger zu setzen. Beispiel für eine solche Liste:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type pMeineListe = ^tMeineListe;
     tMeineListe = record
        Daten: Integer; 
        Next_Item: pMeineListe;
     end;


Wobei Next_Item immer auf das nächste Item zeigt (rekursiv sehr elegant zu lösen). Dann musst du später nur noch Next_Item vom letzten Element auf das erste Element der zweiten Liste setzen, und shcon hast du eine lange Liste.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
reptile Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Sa 08.08.09 20:00 
vielen dank für die antworten
ich denke eine TObjectList ist hier sinnvoll. die könnte ich dann einfach immer als parameter übergeben, und die neuen züge da eintragen.
eine liste aus listen ist zwar auch keine schlechte idee, aber ich glaube das lohnt sich hier nicht. der geschwindigkeitsvorteil gegenüber einer großen liste wäre glaube ich nicht so groß. schließlich geht es nur um alle möglichen züge in einer stellung, nicht um die folgezüge des gegners oder noch mehr folgezüge. diese liste dürfte nicht größer als ca. 50 elemente werden, oder? in der anfangsstellung hat man 20 möglichkeiten, später werden es etwas mehr.

mal schauen ob das so geht

EDIT: scheint bis jetzt ganz gut zu funktionieren