Autor Beitrag
nkp90
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24
Erhaltene Danke: 2



BeitragVerfasst: Mi 18.06.08 17:01 
und zwar wöllt ich ne procedure/function machen um für ein creep den schnellsten weg zu finden von einem punkt zum anderen (pathfinding halt ^^)

1. wie beschreibt man diese procedure/function so dasss diese 2 oder mehr werte wieder zurückgibt?

bissl noch was: man hat x und y koordinate vom creep gegeben und wo das ziel is (x und y halt, und man weiß wie die karte aussieht, dh wo hindernisse stehen oder nicht ^^)

anfänglich hätte ich so was gemacht wie: procedure Tcreep.findpath(xs,ys,xz,yz:integer);

aber ich weiß nicht wie ich dann das ausgrechnete zurüückgeben kann ...



ps: gibts auch methoden wo der weg der als schnellster ausgerechnet wurde gespeichert wird somit der mob dort immer lang rennt? (ich weiß A* und so ... aber geht das auch ohne dem?^^)
(als 2. frage --> 2.)

Moderiert von user profile iconNarses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mi 18.06.2008 um 18:02


Zuletzt bearbeitet von nkp90 am Mi 18.06.08 17:08, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 18.06.08 17:05 
Moin und :welcome: im Forum!

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Vorschlag: "procedure soll Werte zurückliefern" :nixweiss:

Hier der entsprechende Absatz aus den Richtlinien:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

btw: Bitte nicht mehr als eine Frage pro Thread, sonst wird das "unübersichtlich" und wir müssen den Thread schließen. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mi 18.06.08 18:29 
schau dir mal records an damit kann man leicht mehrere werte zurückliefern. oder mit arrays.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 18.06.08 18:30 
Alternativ kannst du mit var- oder out-Parametern arbeiten.

_________________
We are, we were and will not be.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 18.06.08 20:06 
Oder im Falle von Variabler Anzahl gleichartiger Rückgabewerte EIN dynamisches Array zurückgeben.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 18.06.08 21:29 
user profile iconBenBE hat folgendes geschrieben:
Oder im Falle von Variabler Anzahl gleichartiger Rückgabewerte EIN dynamisches Array zurückgeben.
Oder auch einen varianten record damit gehen auch unterschiedliche Rückgabewerte.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Do 19.06.08 08:52 
Hi
Sicherlich kann man aus Proceduren auch Werte zurückbekommen, aber ich halte es nach wie vor nicht elegant. Dafür hat mal ein schlauer Erfinder die Function vorgesehen. Was spricht für eine Typisierung des Rückgabewertes. Wo doch klar ist, das es sich um einen Punkt handelt (x- y Koordinatte) sollte auch ein TPoint die richtige Lösung sein.
Function TMyForm.New_Point( OldPoint :TPoint):TPoint;
Soweit ich weiß, ist TPoint bereits definiert

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Type 
             TPoint = Record
                  x : LongInt;
                  y : LongInt;
             end;

Über die Variablendeklaration geht
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Var
  ....
  MyPoint   : TPoint;

  .....
Procedure TMyForm.Initialisiere;
Begin
  MyPoint.x:=23243;
  MyPoint.Y:=23123
end;

Ich denke, wenn es solche vordefinierten geeigneten Variablentypen gibt, sollte man diese auch benutzen. Außerdem sieht man auch sehr deutlich, das man sich für alles mögliche auch geeignete Variablentypen selbst zusammenstellen kann.
Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 19.06.08 09:14 
Naja, er möchte ja den Weg zurück kriegen und nicht nur einen einzelnen Punkt.

Man könnte hier natürlich ein Array oder eine Liste von Punkten zurückgeben lassen. Die Reihenfolge der Einträge ist dann entsprechend der Weg.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 19.06.08 09:38 
user profile iconoldmax hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Type 
             TPoint = Record
                  x : LongInt;
                  y : LongInt;
             end;

Über die Variablendeklaration geht
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Var
  ....
  MyPoint   : TPoint;

  .....
Procedure TMyForm.Initialisiere;
Begin
  MyPoint.x:=23243;
  MyPoint.Y:=23123
end;

Bloß nicht mit globalen Variablen arbeiten!!! Dann lieber Var\Out-Parameter oder gar eine ordinäre Funktion, ABER in keinem Fall globale Variablen für die Rückgabe eines Wertes nutzen!!! Wenn man sauber programmiert ist JEDE Funktion reentrant - das geht einem durch so nen Scheiß SOFORT!!! verloren!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 19.06.08 09:51 
Huch, gar nicht gesehen.

Da kann ich Ben nur voll unterstützen!

Habe hier gerade Sourcecode am Wickel bei dem es hunderte(!) von globalen Variablen gibt, die dann lustig von Funktionen und Prozeduren gelesen und geschrieben werden - das zu verfolgen ist wirklich grausam.

Was jedoch für (einige, wenige(!)) globale Einstellungen funktionieren mag, sollte für Rückgabewerte definitiv nicht verwendet werden.
Man könnte das ganze in ein Objekt kapseln und eine Objekt-lokale (als private deklarierte) Variable verwenden, aber nicht global.
Irgendwann schreibt irgendwer auf jeden Fall von wo anders da rein und dann geht gar nichts mehr :)
Fabian E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Do 19.06.08 11:15 
Wenn du doch schon eine Klasse TCreep hast, warum lässt du die Methode dass dann nicht direkt intern auswerten?
Dann brauchst du auch nichts zurück geben.
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Do 19.06.08 11:40 
hi
Sorry, sollte nur ein Beispiel für den Zugriff auf die einzelnen Elemete des Records sein. Ist mir heut morgen bei der oberflächlichen Betrachtung gar nicht bewußt gewesen, das es in Richtung globale Variable verstanden werden kann. :shock:
gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
nkp90 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24
Erhaltene Danke: 2



BeitragVerfasst: Do 19.06.08 14:25 
erst ma danke für die vielen antworten :)

und wenn ich mir das so durchgelesen hab bin ich der meinung das ich ein record erstellen werde das gleich in TCreep drin is und dann in dieser unit das ganze berechnen lasse ^^... so brauch ich kein rückgabe-wert und hab trotzdem das ergebniss ^^

aber das mit den globalen variablen und so was ihr dort mit ins spiel geworfen habt verwirrt mich etwas... globale variablen sind doch das worauf von jeder unit aus darauf zugegriffen werden kann? wenn ja ... is doch nicht so schlimm wenn es von mehreren proceduren bearbeitet werden kann? oder täusch ich mich da^^?

mfg
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 19.06.08 15:56 
Solang dein Programm klein ist und nur aus wenigen Units und Funktionen besteht, mag das alles kein Problem sein.
Wenn dein Programm jedoch wächst, kann es sein, dass du irgendwann vergisst, welche Funktion unter welchen Umständen in welche globale Variable schreibt und bekommst auf einmal Seiteneffekte die du dir nicht erklären kannst.

Wenn du dann 30 Units à 1.500 Zeilen Code hast ... viel Spaß beim Suchen ;)
nkp90 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24
Erhaltene Danke: 2



BeitragVerfasst: Do 19.06.08 16:15 
aso ^^

ne so viel code hab ich noch net .. aber ma sehen wie weit wir kommen :P

ty
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 19.06.08 17:08 
Da gibt es unzählige Möglichkeiten. Je nach Fall und Grösse der Rückgabe:

  • Out parameter
  • Var parameter
  • Array Rückgabewert
  • Record Rückgabewert
  • Variant Rückgabewert
  • Neues Objekt Rückgabewert (Factory Methode)
  • Objekt als Eingabewert (analog Referenz auf Interface Instanz)
  • Callback als Eingabe
  • ...
Pointer und globale Variablen erwähne ich jetzt nicht ;)
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 19.06.08 18:56 
Da gibts wirklich viele Möglichkeiten. Was noch fehlt sind Form-basierende Variablen. Also solche im private Abschnitt deklarierte. Nur die eine Form kann die dann benutzen. Vorteil : die (eventuell lange) Parameterliste entfällt.

_________________
Gruß
Hansa
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 19.06.08 19:50 
user profile iconhansa hat folgendes geschrieben:
Vorteil : die (eventuell lange) Parameterliste entfällt.

In Zeiten von Code Completion kein großer Vorteil.

Ich plädiere für klare Formen und Parameter. Funktionen liefern etwas, Prozeduren führen Aktionen aus. Wenn eine Aktion bzw. Prozedur die Änderung von Werten mit sich zieht, wird der (Var)Parameter eben verändert. Wieso sollte nur deshalb eine Funktion draus werden?

Beide Metapher können im Code friedlich nebeneinander koexistieren.

Eine Funktion kann eine Klasse liefern, oder einen Record. Ein Array ist theoretisch auch möglch nur fällt mir gerade kein Beispiel ein, wo eine Funktion ein Array liefert bzw. berechnet.

Letztendlich bleibt es jedem selbst überlassen, wie er seine Parameter ändert oder Werte zurückliefert. Persönlich finde ich die Methode mit privaten Feldern oder globalen Variablen nicht gut, ums mal sehr freundlich auszudrücken.

_________________
Na denn, dann. Bis dann, denn.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 19.06.08 20:20 
user profile iconalzaimar hat folgendes geschrieben:
Eine Funktion kann eine Klasse liefern
Eine Klasse zurückliefern bringt nicht viel. Du meinst ein Objekt, d.h. eine Klasseninstanz ;) (die Vermischung mag ich nicht...)

user profile iconhansa hat folgendes geschrieben:
Persönlich finde ich die Methode mit privaten Feldern oder globalen Variablen nicht gut, ums mal sehr freundlich auszudrücken.
Da bin ich nicht einverstanden. Man kann ruhig eine Klasse haben mit einer Methode Calculate; die den Weg berechnet und im Objekt ablegt.

Das unterscheidet sich nicht wesentlich davon eine Liste zuerst mit Namen zu füllen und am Schluss mit Sort; zu sortieren und wieder auszulesen. Oder du macht bei den Indy's ein TIdHTTP().Get('http://www.delphi-forum.de') und liest den Inhalt über eine andere Methode wieder aus.

Es gibt sogar ein Design-Pattern (Command Pattern), wo man einzelne Befehle in einzelne Klassen packt. Dabei wird die Klasse zuerst instanziert, dann die Parameter über Properties gesetzt und am Schluss die Aktion (z.B. Berechnung) über eine Methode gestartet. Das Objekt verändert sich dann entweder selbst oder verändert ein anderes. Wenn das Resultat einigermassen komplex ist kannst du dann über die geeignete Methode das Resultat abholen, du kannst aber auch das Objekt unverändert an eine Grafikengine zum Rendern übergeben, das Objekt als XML serialisieren, was auch immer.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 19.06.08 22:45 
Das hier ist falsch zitiert.

user profile icondelfiphan hat folgendes geschrieben:
user profile iconhansa hat folgendes geschrieben:
Persönlich finde ich die Methode mit privaten Feldern oder globalen Variablen nicht gut, ums mal sehr freundlich auszudrücken.


Das war Alzaimar und dem sind globale Variablen anscheinend auch suspekt. :mrgreen:

user profile iconalzaimar hat folgendes geschrieben:
user profile iconhansa hat folgendes geschrieben:
Vorteil : die (eventuell lange) Parameterliste entfällt.

In Zeiten von Code Completion kein großer Vorteil.


Was nützt denn eine mehrzeilige Parameterliste mit Code-Completion und dem Verwechseln der Parameter. Viel zu fehlerträchtig.

_________________
Gruß
Hansa