BUCH: Array Aufgabe erklärt

  • Hiho liebe Mitmenschens,


    also worum geht es: Ich übe ja mit Hilfe eines Buches ''Spiele entwickeln mit Unreal Engine 4 von Jonas Richartz'', ich bin dort nun an einer stelle angekommen wo man zu Übungszwecken eine Array basierende Blueprint erstellt, das eine Auflistung auf dem Viewport ausgibt wenn man ein Probespiel anfängt.


    Nun sind da einige Funktionen und Nodes drinnen die ich so nicht ganz verstehe bzw will ich ihre Funktion im zusammenspiel mit den anderen Nodes und Funktionen verstehen. Ich habe deswegen extra ein Screenshot des Blueprints angefertigt um nach und nach zu fragen was was zu bedeuten hat, welche Aufgabe welche Funktion oder Node erfüllt und warum dies so gemacht werden muss.


    Highscore (Array):

    0 = 123

    1 = 52

    2 = 6

    3 = 97
    4 = 532


    Nun denn fange ich mal an.


    1. Und zwar das zusammenspiel davon würde ich gerne verstehen. Ich weis das das Array von dem ''ForLoop'' am ende ausgewertet wird, aber wozu genau brauche ich die ''Length'' bzw warum muss ich das ganze ''Minus 1'' nehmen.

    Im Buch wird das so erklärt, ich Zitiere:

    ''Sie beginnt mit einem Event BeginPlay, an das sich eine ForEach-Node anschließt: angefangen bei Element 0 bis hin zur Länge des Arrays minus eins. Würden wir nur die reine Länge des Arrays benutzten, würde ForEacheinmal, zu viel ausgeführt werden. Sind wie hier fünf Elemente im Array, wäre die Länge dementsprechend 5. Da das Array aber bei 0 anfängt würde das ForEach 6-mal ausgeführt werden, wenn ich nicht minus eins rechnen würde.''


    Müsste ich da nun immer egal wie viele Elemente ich in einem Array habe es ''Minus 1'' nehmen weil ja in jedem auch eine 0 Ziffer steckt, oder liegt es hier bei diesem bsp daran das auf der 0 Position wir einen Wert ausgelegt haben, sprich: hätten wir statt von 0 mit 1 bei den einzelnen Werten angefangen hätte man das ''Minus 1'' nicht gebrauchen müssen?




    2. Die zweite fragen ist relativ Simple, ich würde gerne denn unterschied zwischen diesen beiden wissen. Was bewerkstelligen sie?



    3. So hier versuche ich bisschen zu verstehen wie es abläuft, also die logischen Vorgänge dahinter. Also:


    Ich weis das ich mit ''Highscore'' Array mit ''Max of Int Array'' verbinde, um den höchsten Wert aus der Array zu ziehen, und diesen dann mit ''Add'' verbinden damit es als Richtwert in ''Sorted'' deklariert wird.


    (kleine neben Frage: ''Max of Int Array'' sucht nur nach dem größten Wert oder Stuft er denn Wert vom Größten aus angefangen an ab?)


    Den Punkt denn ich so am wenigsten verstehe ist der bei ''Set Array Elem'' was genau bewirkt es, wofür ist es da? Ich habe da nur irgendwie was raus lesen können das es nachdem ''Max of Int Array'' seine Werte übermittelt hat, das es durch das -1 setzen bei ''Set Array Elem'' das erneute aufrufen von ''Max of Int Array'' unterbindet. Ich würde mir gerne sicher sein was genau die Funktion bei die dieser Node ist damit ich sie auch je nach Blueprint auch richtig einsetzen kann.



    So das wären soweit meine fragen. Ich hoffe ich habe mich verständlich ausgedrückt. Ich will an dieser stelle noch einmal betonen das ich keinerlei Programmier Kenntnisse habe und daher wohl auch so bestimmte Logiken die in diversen Programmiersprache doch gang und gebe sind wohl auch nicht kenne. Ich versuche einfach nur alle Bruchstücke in ihrer Funktionalität zu erfassen das ich sie auch anderweitig einsetzen kann. ^ ^


    Ich bedanke mich hier auch schon mal im voraus für jede Hilfe die ihr mir bieten könnt und seit nachsichtig sollte ich etwas nicht auf anhieb verstehen. ^ ^

  • Hallöchen, gerne versuche ich dir deine Fragen zu beantworten. :)


    1. Ein Array ist nichts anderes als eine Auflistung an werten/Inhalten. Um auf diese Liste zuzugreifen wird der sogenannte Index verwendet der bei einem Array bei 0 beginnt. Willst du dementsprechend den ersten Eintrag in dem Array haben musst du den Index 0 nehmen. Willst du den 5ten Eintrag in dem Array haben musst du den Index 4 nehmen. Immer "N-1".

    Wenn du einen ForLoop verwendest geht dieser vom "First Index" zum "Last Index". Enthält das Array 5 Einträge und du willst dieses Array mit der ForLoop komplett durchgehen musst du also bei 0 Anfangen und bei länge-1 aufhören. In dem Beispiel dort ist der Index eher un-relevant da du innerhalb des "Loop Body" nicht den "Index" benutzt.

    In dem Beispiel hätte (da der "Index" nicht verwendet wird) auch von "First Index": 1 zu "Last Index": länge des Arrays nehmen können.

    Problematisch ist es in diesem Beispiel nur wenn du von dem ausgehenden Index ein get machen würdest und dann das Risiko bestehen würde ein "Get Index 5" zu haben obwohl Index 5 bei 5 Einträgen nicht existieren würde und der letzte Index auf 4 liegt. (Sprich Länge minus eins) Das kommt dann zu Fehler-Nachrichten.


    2. Der Unterschied zwischen den beiden Nodes ist das die "ForEachLoop" alle Einträge durchgeht und du die ArrayElement sowie ArrayIndex im LoopBody zur Verfügung hast. Aber es wird immer das komplette Array durchgegangen egal wieviele Einträge dort vorhanden sind. Willst du also nur einen gewissen Teil des Arrays durchgehen kannst du dies mit einem ForLoop regeln um dann Beispielsweise nur die ersten 10 Einträge auszulesen und dann der Rest des Arrays nicht unnötigerweise überprüft wird.

    Es geht bei diesen Aufgaben vor allem darum zu überprüfen und eventuell zu experimentieren was die einzelnen Nodes machen und man sich Gedanken machen kann wie man diese anderweitig verwenden könnte.

    Es gibt einige bessere und schönere Lösungen, aber hier geht es eher ums Lernen und experimentieren von Nodes. :) (Zumindest war dies meine Intention)


    3. Stelle dir den Vorgang am besten Bildlich vor. Das Array fängt wie folgt an


    Highscore:

    0 = 123

    1 = 52

    2 = 6

    3 = 97

    4 = 532


    Sorted:


    Sorted ist leer und Highscore ist unsortiert befüllt. Beim ersten durchgang wird nach dem größten Wert im Highscore Array gesucht welcher am Index 4 zu finden ist. Diesen fügen wir in der Sorted Variable mit dem Add hinzu.


    Sorted:

    0 = 532


    Den Highscore Array ändern wir mit "SetArrayElem" am den Index des höchsten Wertes. Nach diesem Vorgang sieht das Highscore Array wie folgt aus:


    Highscore:

    0 = 123

    1 = 52

    2 = 6

    3 = 97

    4 = -1


    Sorted:

    0 = 532


    Beim zweiten Durchgang ändert sich alles auf folgendes:


    Highscore:

    0 = -1

    1 = 52

    2 = 6

    3 = 97

    4 = -1


    Sorted:

    0 = 532

    1 = 123


    Es wurde wieder auf das Highscore-Array zugegriffen welches die Änderung von eben mit einbezogen hat. Da wir nach dem höchsten Wert im Array suchen und den vorherigen höchsten Wert auf -1 gesetzt haben wird dieser bei einem einmaligen kompletten Durchgang nicht nochmal als MaxValue bekommen. am Ende sieht es dann so aus:


    Highscore:

    0 = -1

    1 = -1

    2 = -1

    3 = -1

    4 = -1


    Sorted:

    0 = 532

    1 = 123

    2 = 97

    3 = 52

    4 = 6


    Ich hoffe das hilft dir bei deinen fragen. :)

    Array können am Anfang ein bisschen verwirrend sein mit dem Konzept von "Indexen" anstelle von "normalen" Aufzählungen die man aus dem Alltag gewohnt ist.


    Viele Grüße,


    Jonas

  • Enthält das Array 5 Einträge und du willst dieses Array mit der ForLoop komplett durchgehen musst du also bei 0 Anfangen und bei länge-1 aufhören


    Im Buch beschreibst du es so:

    ''Sie beginnt mit einem Event BeginPlay, an das sich eine ForEach-Node anschließt: angefangen bei Element 0 bis hin zur Länge des Arrays minus eins. Würden wir nur die reine Länge des Arrays benutzten, würde ForEach einmal, zu viel ausgeführt werden.''


    Ich verstehe nicht ganz wie dieses einmal zu viel zustande kommt. Heißt das die ForEach-Node würde bei jeder Array die man so anbindet immer so bald sie an ihre End Position kommt (in unserem bsp Postion 4) einfach noch eine Imaginäre 5te Position hinzufügen, würde man das ganze nicht mit -1 unterbinden?




    Wenn du einen ForLoop verwendest geht dieser vom "First Index" zum "Last Index". Enthält das Array 5 Einträge und du willst dieses Array mit der ForLoop komplett durchgehen musst du also bei 0 Anfangen und bei länge-1 aufhören. In dem Beispiel dort ist der Index eher un-relevant da du innerhalb des "Loop Body" nicht den "Index" benutzt.

    In dem Beispiel hätte (da der "Index" nicht verwendet wird) auch von "First Index": 1 zu "Last Index": länge des Arrays nehmen können.

    Ich muss hier nochmal nachfragen da das Wort Index ziemlich oft gefallen ist. Mir ist bewusst das First Index & Last Index die jeweils Erste bzw Letzte Position eines Arrays darstellt (In unserem Fall Postion 0 & 4). Im letzten abschnitt benutzt du allerdings nur das Wort Index, wenn du da von Index redest sprichst du da Explizit denn First- bzw Last- Index an?


    Enthält das Array 5 Einträge und du willst dieses Array mit der ForLoop komplett durchgehen musst du also bei 0 Anfangen und bei länge-1 aufhören. In dem Beispiel dort ist der Index eher un-relevant da du innerhalb des "Loop Body" nicht den "Index" benutzt.

    Hier auch nochmal, wenn du Index sagst meinst du damit First- bzw Last- Index oder meinst du damit alle Postion innerhalb der beiden und warum ist es Irrelevant für den Loop Body? (Weil eh alle Index durch gegangen werden?)


    Eine weitere Frage dies bezüglich, warum genau hast du das Array die Länge minus 1 an Last Index angeschlossen statt an Frist Index,



    Der Unterschied zwischen den beiden Nodes ist das die "ForEachLoop" alle Einträge durchgeht und du die ArrayElement sowie ArrayIndex im LoopBody zur Verfügung hast. Aber es wird immer das komplette Array durchgegangen egal wieviele Einträge dort vorhanden sind. Willst du also nur einen gewissen Teil des Arrays durchgehen kannst du dies mit einem ForLoop regeln um dann Beispielsweise nur die ersten 10 Einträge auszulesen und dann der Rest des Arrays nicht unnötigerweise überprüft wird.

    um sagen wir mal 3 Postionen von unserem bsp ausgeben zu lassen müsste ich bei Frist Index bei ForLoop von einer 0 zu einer 4 umschreiben?




    Es geht bei diesen Aufgaben vor allem darum zu überprüfen und eventuell zu experimentieren was die einzelnen Nodes machen und man sich Gedanken machen kann wie man diese anderweitig verwenden könnte.

    Das ist mir durch aus bewusst, aber bevor ich mit den Bausteinen Experimentieren kann, muss ich sie in ihrer Funktionalität verstehen. ^ ^

    Wie gesagt, ich habe 0 Programmier Kenntnis und jemand der etwa C++ oder andere Programmier Sprachen schon beherrscht dürfte diese Aufgabe wesentlich eindeutiger gegenüber stehen als ich. ^^

    Oh man das war jetzt echt viel, sry sollte ich es nicht so einfach rallen, ich gebe mein bestes alles so gut es geht in meinen Schädel zu drücken und zu verstehen. Danke auf jeden fall für die mühe es mir zu erklären. :saint:

  • Im Buch beschreibst du es so:

    ''Sie beginnt mit einem Event BeginPlay, an das sich eine ForEach-Node anschließt: angefangen bei Element 0 bis hin zur Länge des Arrays minus eins. Würden wir nur die reine Länge des Arrays benutzten, würde ForEach einmal, zu viel ausgeführt werden.''


    Ich verstehe nicht ganz wie dieses einmal zu viel zustande kommt. Heißt das die ForEach-Node würde bei jeder Array die man so anbindet immer so bald sie an ihre End Position kommt (in unserem bsp Postion 4) einfach noch eine Imaginäre 5te Position hinzufügen, würde man das ganze nicht mit -1 unterbinden?

    Okay, sorry da ist jedenfalls schon mal ein Fehler in dem Zitat, da die erste Node eine ForLoop-Node und nicht eine ForEach Node ist. Da muss wohl etwas beim korrigieren oder Indexierung schief gelaufen sein.

    Aber ich hoffe du hast dennoch verstanden das es am Anfang um die ForLoop-Node geht und nicht um die ForEach.


    Ich hoffe es hilft dir auch wiederum hier dir das Bildlich zu verdeutlichen.



    Wenn wir die ForLoop so benutzen würden um als ersten Index 0 und als letzten Index die länge des Arrays, so würde der Loop Body 6 mal ausgeführt werden. Wenn wir anschließend den Index innerhalb des Loop Body benutzen würden so würde dies 5 mal gut gehen, aber beim letzten Durchgang einen Error abgeben.


    0 - Kein Problem

    1 - Kein Problem

    2 - Kein Problem

    3 - Kein Problem

    4 - Kein Problem

    5 - Error



    Um dies zu umgehen aber den Index ohne weiteres benutzen zu können rechnen wir die Länge - 1 damit der Index immer als "Last Index" den letzten Index hat.


    Alternativ kann man natürlich auf den First Index und Last Index von 1 bis länge des Arrays gehen lassen. Dann muss man aber um Errors zu vermeiden den LoopBody Index -1 rechnen.



    Bei einer ForEach-Loop im zweiten Teil des Beispiels kann sowas nicht passieren, da man keine manuelle angaben macht und das Array als solches verwendet. Dann gibts auch keine Errors.



    Ich muss hier nochmal nachfragen da das Wort Index ziemlich oft gefallen ist. Mir ist bewusst das First Index & Last Index die jeweils Erste bzw Letzte Position eines Arrays darstellt (In unserem Fall Postion 0 & 4). Im letzten abschnitt benutzt du allerdings nur das Wort Index, wenn du da von Index redest sprichst du da Explizit denn First- bzw Last- Index an?

    Genau da meinte ich explizit den First Index und Last Index aus der Node und nicht den eigentlichen Index. Diese ganzen Begriffe können schnell verwirrend wirken, sorry. ?(


    Hier auch nochmal, wenn du Index sagst meinst du damit First- bzw Last- Index oder meinst du damit alle Postion innerhalb der beiden und warum ist es Irrelevant für den Loop Body? (Weil eh alle Index durch gegangen werden?)


    Eine weitere Frage dies bezüglich, warum genau hast du das Array die Länge minus 1 an Last Index angeschlossen statt an Frist Index,


    Also der Index ist dann vor allem wichtig wenn du in auch verwendest z.b. in einer Get-Node.



    Hier nochmal das Bild von eben. Wenn wir aktiv den Index des Loop Bodys verwenden ist der Richtige Index es wichtiger Bestandteil des ganzen und kann dann wie auf den Bild zu einem Error führen wenn der jeweilige Index im Array nicht existiert.


    Der ForLoop addiert nur pro Durchgang eine lokale variable und subtahiert nicht. D.h. es kann nur in eine Richtung funktionieren sonst wird gar nichts ausgegeben.


    So schaut die ForLoop intern aus:




    um sagen wir mal 3 Postionen von unserem bsp ausgeben zu lassen müsste ich bei Frist Index bei ForLoop von einer 0 zu einer 4 umschreiben?

    Nein, gehen wir mal davon aus du bist das komplette Array durchgegangen und hast es sortiert. Anschließend willst du die Top 3 Ergebnisse ausgeben lassen. Dann kannst du das einfach so machen:



    Der Loop Body wird 3 mal ausgeführt und um der "Get"-Node bekommst du die Top 1, Top 2 und Top 3 Ergebnisse aus Index 0, Index 1 und Index 2.

    Das ist mir durch aus bewusst, aber bevor ich mit den Bausteinen Experimentieren kann, muss ich sie in ihrer Funktionalität verstehen. ^ ^

    Wie gesagt, ich habe 0 Programmier Kenntnis und jemand der etwa C++ oder andere Programmier Sprachen schon beherrscht dürfte diese Aufgabe wesentlich eindeutiger gegenüber stehen als ich. ^^


    Oh man das war jetzt echt viel, sry sollte ich es nicht so einfach rallen, ich gebe mein bestes alles so gut es geht in meinen Schädel zu drücken und zu verstehen. Danke auf jeden fall für die mühe es mir zu erklären. :saint:

    Kein Problem, für mich waren Arrays anfangs auch sehr kompliziert und ich habe oft Fehler mit falschen Indexen gehabt. Kann das also alles gut Nachvollziehen. :)

    Sorry falls ich nicht ganz in der Lage bin das vernünftig zu erklären aber ich hoffe dir jetzt nochmal ein bisschen näher gebracht zu haben wie das alles so funktioniert, wenn nicht kann ichs gern weiter versuchen. :D


    Vom Prinzip kannst du dir Denken (Ich will Position 4 haben. Also 4 - 1 = Index 3. Ich brauche Index 3)

    Aber wie gesagt falls noch weitere Fragen bestehen oder es immer noch unklar ist helfe ich gerne weiter. :)