Types Types zuweisen?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Cykid

Betreff: Types Types zuweisen?

BeitragDi, Aug 05, 2014 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community!
Ich bin grade unterwegs kann es daher nicht ausprobieren aber mir ist folgender Gedanke gekommen.

Ist es möglich Types Types zu zuweisen?

Es geht darum das ich gerne das Pathfinding via A * Algorythmus realisieren möchte.

Also sollen NPC's 2 Listen bekommen, die Closed List (Alle ausgeschlossenen möglichkeiten) und die Open List (der errechnete Pfad)

Würde es schöner finden wenn alle NPC'S eine eigene Liste haben und nicht eine große Liste wo ich anhand einer ID identifiziere.

Oder kennt ihr eine schönere Lösung?

Viele Grüße, Maik

Chester

BeitragMi, Aug 06, 2014 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht in BB ganz ohne Probleme:

BlitzBasic: [AUSKLAPPEN]

Type X
Field var1
End Type

Type Y
Field vartype.X
End Type

test.Y = New Y
test\vartype = New X

test\vartype\var1 = 42


Types sind hier eleganter und einfacher, ein Nachteil ist jedoch, dass der Umgang mit Types relativ langsam ist. Alternativ könnt man sich noch mit Dim-Feldern was basteln. Vor Ewigkeiten hab ich auch mal einen A* programmiert, falls es dir hilft, begib ich mich mal auf die Suche Smile

DAK

BeitragMi, Aug 06, 2014 6:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du für jedes Objekt eine eigene Liste willst, das wird nicht so leicht gehen. Was aber geht ist für jedes Objekt ein Array, indem du Blitzarrays verwendest. Die sind im Gegensatz zu Dim-Arrays nämlich nicht global.

BlitzBasic: [AUSKLAPPEN]
Type TTest
Field arr.TTest2[5]
End Type
Type TTest2
Field val
End Type

test.TTest = New TTest
test\arr[2] = New TTest2
test\arr[2]\val = 5
Gewinner der 6. und der 68. BlitzCodeCompo
 

Sirrus

BeitragDi, Okt 27, 2015 6:14
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK hat Folgendes geschrieben:
... indem du Blitzarrays verwendest. Die sind im Gegensatz zu Dim-Arrays nämlich nicht global.

Da ein Type aber immer global ist, wird ein Blitzarray in einem Type-Feld auch global Wink

DAK

BeitragDi, Okt 27, 2015 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, das Blitzarray ist nicht global. Du kannst z.B. ein Blitzarray in einer Funktion lokal verwenden. Das das Blitzarray in einem global adressierbaren Objekt drinnen hängt, das macht das Konstrukt Blitzarray nicht inherent global, wie es ein Dim wäre.

Die Aussage "..., indem du Blitzarrays verwendest. Die sind im Gegensatz zu Dim-Arrays nämlich nicht global." sagt kein bisschen was aus über Objekte oder Types oder Felder.

Was sie aussagt, ist, dass man Blitzarrays als Felder verwenden kann, weil Blitzarrays nicht von sich aus global sind. Ein Dim-Array kann man so nicht verwenden, da es von sich aus inherent global ist.

Außerdem sind auch Type-Objekte selbst nicht global. Man kann nicht jedes einzelne Type-Objekt direkt aus dem globalen Space adressieren. Alles was man machen kann, ist sie über Funktionen wie Each oder Next einzeln holen. Dabei werden die nicht-globalen Objekte über die globalen Funktionen Each und Next sowie den globalen Type exposed. Merke hier den Unterschied zwischen Objekten und Types. Der Type ist global (kann z.B. direkt aus dem globalen Space als Parameter für Funktionen wie New angegeben werden). Die Objekte eines Types sind nicht global, da sie nicht direkt aus dem globalen Space angesprochen werden können.

Alles so genau nicht so wichtig, aber wenn du solche Genauigkeiten ansprichst, dann kann man die nicht so falsch stehen lassen Wink
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragDi, Okt 27, 2015 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@Sirrus: Die Variable ist Lokal. Sie enthält eine Referenz auf ein Objekt, das auch über die Globale Typeliste gefunden werden kann, oder an anderen stellen lokal referenziert wird.

Types sind so doof in BB implementiert, es ist kein Wunder das sie jeden verwirren...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Sirrus

BeitragDo, Okt 29, 2015 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie das bei Blitzbasic intern gehandhabt wird ist mir eigentlich egal, den Unterschied zwischen Global und Lokal sehe ich darin, daß alles was global ist, im ganzen Programm genutzt werden kann, jedoch das was lokal ist nur dort, wo es angelegt wurde gültig ist. Also entweder im Hauptprogramm oder in einer Funktion.
Da ich Felder eines Types sowohl im Hauptprogramm als auch in jeder Funktion nutzen kann, sehe ich sie als global an, unabhängig davon, ob ich sie direkt oder nur über eine Funktion erreiche.

Xeres hat Folgendes geschrieben:
@Sirrus: Die Variable ist Lokal. Sie enthält eine Referenz auf ein Objekt, das auch über die Globale Typeliste gefunden werden kann, oder an anderen stellen lokal referenziert wird....

Wenn man das so sieht, wären auch Funktionen und globale Variablen nicht wirklich global, denn Blitzbasic legt die ja nicht dort an, wo sie im Programm definiert sind, sondern erstellt intern eine Liste mit Variableninhalten und Funktionsadressen. Auf diese Listen kann ich auch nicht direkt zugreifen, sondern nur indirekt über die Namen von Variablen und Funktionen

DAK

BeitragFr, Okt 30, 2015 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Pass da auf mit deinen Definitionen:
Hier reden wir von globalen Variablen und nicht von globalen Werten oder Objekten. Werte oder Objekte sind nie global, da sie generell nur über eine Variable oder einen Pointer angesprochen werden können. Selbes zählt auch für Funktonen, nur dass es dort um Funktionspointer/Funktionsvariablen geht.

Es geht also darum, ob man aus dem gesamten Programm auf diese Variable zugreifen kannst, nicht auf den Wert der Variable. Ein Wert (oder ein Objekt) kann nie global oder lokal sein, da er keine Sichtbarkeit hat. Nur Variablen haben Sichtbarkeit.

Ein Dim ist inheränt global, da man in aus dem ganzen Programm auf diese Variable zugreifen kann. Ein Blitzarray ist (außer anders definiert indem man Global davor schreibt), lokal. Das heißt, man kann nicht von überall darauf zugreifen:

BlitzBasic: [AUSKLAPPEN]
Dim ichBinGlobal(5)
ichBinGlobal(1) = 7

Local ichBinNichtGlobal[5]
ichBinNichtGlobal[1] = 9

Function foo()
Print(ichBinGlobal(1)) ;Das hier geht
Print(ichBinNichtGlobal[1]) ;Das hier geht nicht
End Function


Hast du's jetzt verstanden, was Global und Lokal bedeutet?
Gewinner der 6. und der 68. BlitzCodeCompo
  • Zuletzt bearbeitet von DAK am Sa, Okt 31, 2015 20:05, insgesamt einmal bearbeitet
 

Sirrus

BeitragSa, Okt 31, 2015 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Sirrus hat Folgendes geschrieben:
...den Unterschied zwischen Global und Lokal sehe ich darin, daß alles was global ist, im ganzen Programm genutzt werden kann, jedoch das was lokal ist nur dort, wo es angelegt wurde gültig ist. Also entweder im Hauptprogramm oder in einer Funktion....
@DAK das trifft auch auf dein Beispiel zu!

ichBinGlobal(1) wurde im Hauptprogramm global definiert und gilt auch in Funktionen
ichBinNichtGlobal[1] wurde im Hauptprogramm lokal definiert und gilt nicht in Funktionen

Allerdings das ganze Programm geht nicht, wenn wenn du die Funktion nicht mit "End Function" abschließt. Wink

Aber da du in einer Funktion nicht auf Lokale Variablen des Hauptprogramms zugreifen kannst (wie du selber in deinem Beispiel zeigst) und alles was du in einer Funktion definierst, nach Beenden der Funktion nicht mehr verfügbar ist, wenn du es nicht einer Globalen Variablen zuweist, muss ein Feld eines Types global sein, sonst könntest du es nicht in der Funktion ansprechen.
BlitzBasic: [AUSKLAPPEN]
Local S.Test
Type Test
Field IchWurdeImHauptprogrammAngelegt%
End Test
S = New Test
S\IchWurdeImHauptprogrammAngelegt=7

Function foo%()
Local N.Test, A%
N = First Test
A=N\IchWurdeImHauptprogrammAngelegt ;wenn das Feld lokal wäre, würde das nicht gehen!!!
End Function
@DAK, hast du's jetzt verstanden, was Global und Lokal bedeutet?

DAK

BeitragSa, Okt 31, 2015 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das Sample mal schnell am Handy runtergetippt, da passieren Tippfehler.


Wie dem auch sei, worum es ging ist, das Dims inherent global sind (da war kein Global-Keyword, trotzdem ist es Global) und Blitzarrays nicht inherent global sind (das heißt, ohne Global-Keyword ist es nicht global).

Und nein, deine Definition des Ganzen ist noch immer nicht stimmig.

Wie gesagt, es geht darum, dass Werte nie global oder lokal sind, da sie keine Sichtbarkeit haben, sondern nur Variablen Sichtbarkeit haben.


Mach ich noch mal ein simpleres Beispiel:

BlitzBasic: [AUSKLAPPEN]
Function foo$()
Local x$ = "Teststring in der lokalen Variable x$ in Funktion foo$()"
Return x$
End Function

Local y$ = foo$()


Auf die Variable x$ kann man nicht außerhalb der Funktion foo$() zugreifen, da x$ in dieser Funktion lokal definiert wurde. Durch das Return wird der Wert "Teststring in der lokalen Variable x$ in Funktion foo$()" zurück gegeben. Dieser Wert steht jetzt in der im Hauptprogramm lokal definierten Variable y$ und kann somit in diesem Scope gesehen werden. Der Wert dieser Variablen hat keine Sichtbarkeit, und wird hier effektiv von einem Scope in den anderen übergeben. Die Variablen selbst haben schon eine Sichtbarkeit und können somit nicht direkt angefasst werden. x$ wird nicht dadurch global, dass der Wert von x$ returned wird.

Ok, haben wir soweit den Unterschied zwischen einem Wert und einer Variablen verstanden?

Wenn nicht, dann lies den Absatz noch ein paar mal, oder lies dir (falls du Englisch kannst), den Artikel im englischen Wiki zu globalen Variablen durch.


Gut, jetzt mal weiter zu deinem genauen Beispiel:

BlitzBasic: [AUSKLAPPEN]
Type Test
Field IchWurdeImHauptprogrammAngelegt%
End Test


Typedefinitionen gehen nur im Hauptprogramm. In Funktionen gehen die nicht. Somit macht dein Punkt hier wenig Sinn. Bei Types ist es wieder der gleiche Unterschied: Es gibt das Type und es gibt Objekte eines Types. Das Type selbst gibt die Struktur des Types vor, die Objekte sind die einzelnen Ausprägungen davon. Das Type sagt dem Programm, wie es ein Objekt auslesen soll.

Beispiel:

Wenn die Typedefinition so aussieht:
BlitzBasic: [AUSKLAPPEN]
Type TTest
Field a%
Field b#
Field c%
End Type


Und man erstellt ein Objekt mit diesen Werten:

BlitzBasic: [AUSKLAPPEN]
Local test = New TTest
test\a=5
test\b=5.5
test\c=9


Dann sieht das Objekt im Speicher so aus (in Hex):

Code: [AUSKLAPPEN]
0000000540b0000000000009


Über die Type-Definition weiß Blitz dann, dass wenn du test\b schreibst, dass er die 32 Bit an den (binären) Stellen 32-63 als Float auslesen soll, um so auf 5.5 zu kommen. Die Type-Definition ist global und von überall im Programm aus sichtbar.

Die einzelnen Objekte sind nur Werte im Speicher, so wie das obrige Beispiel.

Bei der Type-Definition wird automatisch für jedes Type eine Liste erstellt. Diese Liste ist fix an den Type gebunden, und kann über den Type aus erreicht werden. Da der Type global ist, dann man mit dieser Liste interagieren, obwohl sie nicht direkt sichtbar ist.

Dazu gibt es die (globalen) Zugriffs-Funktionen wie "New", "First", "Next", "Each" und den Rest davon. Da die Syntax von diesen Funktionen anders ist, als von User-definierten Funktionen, mag es für dein Laien nicht offensichtlich sein, dass es sich dabei um Funktionen handelt. Mit diesen Funktionen kannst du auf diese Liste zugreifen und dir die Objekte aus der Liste fischen. Objekte sind Werte, haben also keine Sichtbarkeit. Ohne diese Hilfsfunktionen kannst du nicht direkt auf die Objekte zugreifen, und schon gar nicht auf die Felder-Variablen in den Objekten. Das heißt, diese sind nicht global.

Schau dir also mal diese Zeile genau an:

BlitzBasic: [AUSKLAPPEN]
N = First Test


Sag mal, woran erinnert dich das? .... Jaaa, genau! Das ist ein komplett normaler Funktionsaufruf, nur das die Syntax hier keine Klammern erwartet, da es eine Special-Funktion ist.

Also, First() ist hier eine ganz normale Funktion (minus die Klammern), die von der Liste im Type Test das erste Element holt.

Um das zu verdeutlichen, noch mal exakt das Gleiche in einer anderen Sprache, wo das sichtbarer ist. Ich nehm mal hierfür BlitzMax:

BlitzMax: [AUSKLAPPEN]
Framework BRL.StandardIO
Import BRL.LinkedList

Type TTest
Global list:TList = CreateList() 'In BlitzMax haben Types nicht automatisch eine Liste daran gebunden, deswegen erstelle ich hier eine selbst.
Field x% 'Gleich wie in BB

Function Create:TTest() 'Diese Funktion wird verwendet, um ein neues Objekt zu erstellen
Local t:TTest = New TTest 'New legt hier nur das Objekt an, es kommt in keine Liste
list.AddLast(t) 'Diese Zeile fügt das Objekt der Liste hinzu
Return t
End Function
End Type

Function First:TTest(typelist:TList) 'Das ist eine ungefähre Nachbildung der First()-Funktion in Blitz
Return typelist.first() 'Sie liefert einfach das erste Objekt der Typeliste zurück
End Function



Local s:TTest = TTest.Create() 'Hier wird das Objekt erstellt. Das Objekt selbst hat keine Sichtbarkeit, wird aber in eine lokale Variable geschrieben
s.x = 5

Function foo()
Local n:TTest = First(TTest.list) 'Hier wird First aufgerufen, mit der Typeliste des Types Test und wieder in eine lokale Variable gesteckt. Die Variable t aus dem Hauptprogramm ist hier nicht sichtbar, genauso wie S in deiner Funktion foo nicht sichtbar ist. Genauso ist n nicht aus dem Hauptprogramm sichtbar, genauso wie in deinem Beispiel
Print(n.x)
End Function
Gewinner der 6. und der 68. BlitzCodeCompo

Holzchopf

Meisterpacker

BeitragSa, Okt 31, 2015 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte kurz anmerken, dass die Foren nach wie vor moderiert werden... Wink Der vorherrschende Ton ist z.T. schon grenzwertig.
Ihr dürft jetzt weiter diskutieren, das Thema ist auch sehr interessant, aber lasst es bitte nicht ausarten mit den Unterstellungen, Dinge nicht verstanden zu haben.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Mirco1989

BeitragDo, Aug 10, 2017 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Äh, erst mal sorry, dass ich hier einen alten Thread aufgreife, in dem wohl auch schon heftig gestritten wurde.....
(eigentlich hatte ich auch was anderes gesucht und bin durch die Forensuche hierauf gekommen)

DAK hat Folgendes geschrieben:
Schau dir also mal diese Zeile genau an:

BlitzBasic: [AUSKLAPPEN]
N = First Test


Sag mal, woran erinnert dich das? .... Jaaa, genau! Das ist ein komplett normaler Funktionsaufruf, nur das die Syntax hier keine Klammern erwartet, da es eine Special-Funktion ist.

Also, First() ist hier eine ganz normale Funktion (minus die Klammern), die von der Liste im Type Test das erste Element holt.


Aber die Aussage von DAK, dass First eine Funktion (bzw. eine Spezial-Funktion ohne Klammern) ist, wollte ich so nicht als letztes stehen lassen....

In der Hilfe von Blitz3D bei "Language Reference" im Abschnitt "Expressions and Conversions" steht, dass New, First, Last, Before und After Operatoren sind (was auch erklärt, warum da keine Klammern sind)

Also weder Funktionen noch Spezialfunktionen. Wer lesen kann ist klar im Vorteil Very Happy
Wer Rechtschreibfehler findet, darf sie behalten

BladeRunner

Moderator

BeitragFr, Aug 11, 2017 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Fledderei ist dennoch recht sinnfrei, da Blitz das Klammerngeraffel eh optional anbietet - was divers für Durcheinander gesorgt hat. Daher ist der Ansatz es so zu erklären für meine Begriffe valide.
Man kann nun auch noch sehr ausgiebig darüber streiten was genau einen Operator von einer Funktion unterscheidet - grundsätzlich tun beide im Wesentlichen das Gleiche - sie nehmen (einen oder mehrere) Eingabewerte, verarbeiten sie, und reichen eine Ausgabe zurück.

Intern - ohne den Code jetzt explizit zu kennen - vermute ich eh dass Herr Sibly das ganze nur als Teil eines Methodenkomplexes für seine TypeKlasse umgesetzt hat.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mirco1989

BeitragFr, Aug 11, 2017 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Forensuche nicht so alte Beiträge als Such-Ergebnis geben würde, hätte ich das wohl gar nicht gelesen.
Andererseits hab ich auch schon öfters mal was sinnvolles in noch älteren Beiträgen gefunden...

Aber wie Mark Sibly sich das gedacht hat is mir eigentlich egal, hauptsache meine Programm funzen so, wie ich mir das denke Very Happy
Wer Rechtschreibfehler findet, darf sie behalten

DAK

BeitragFr, Aug 11, 2017 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Forensuche keine alten Beiträge zeigen täte, dann wär sie recht sinnlos Wink

Operatoren sind im Endeffekt nichts anders als Funktionen in Infix-Notation. Und das hier ist nicht mal in Infix-, sondern in Prefix-Notation, genauso wie Funktionen.


Eine Funktion nimmt eine Anzahl von Parametern (abhängig von der Funktion), führt einen bestimmten Satz an Code aus, und gibt basierend darauf eventuell etwas zurück.

Ein Operator macht defacto das Gleiche.

In vielen Programmiersprachen (z.B. C++, Kotlin, Python, ...) können die üblichen Infix-Operatoren (+, -, *, /, ...) mit Funktionen überladen werden, die ausgeführt werden, wenn der dazu passende Operator verwendet wird. Ist ganz praktisch, wenn man diese Operatoren mit selbst definierten Datentypen (z.B. einer Vektor-Klasse) verwenden will. Da zeigt sich's ganz gut, dass Operatoren auch nichts Anderes sind als Funktionen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group