Each Type in Each-Type / Wo liegt der Fehler?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

jonnyboy

Betreff: Each Type in Each-Type / Wo liegt der Fehler?

BeitragMo, Apr 14, 2008 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.

Also zuerst: Ich war mir nicht sicher, ob ich diesen Thread in der Beginner's Corner oder in der allgemeinen Abteilung zu schreiben...
Aber da ich meine eigene Erklärung für das Problem nicht glaube, habe ich es hier erstellt.

Also als erstes: Ist es möglich, Each-Type-Schleifen IN einer Each-Type-Schleife abzufragen?

Wenn Nein, dann hat sich mein Problem hier schon erledigt, dann muss ich mir etwas anderes einfallen lassen...

Wenn ja, dann verstehe ich nicht, wo das Problem ist.
Ich will wie gesagt Each type in Each Type abfragen. Kurz zu meinem Thema: Ich mache ein 2D-Strategiespiel machen und bin gerade bei den Wegen. Die sollen halt verknüpft werden. Jeder Weg soll mit allen anderen Wegen verglichen werden, dann werden je nach Richtung Zahlen zusammengerechnet und aus denen ergibt sich dann der Wegtile. Smile

Wenn ich die 2te Each-Type-schleife auskommentiere, geht alles perfekt. Sobald ich aber NUR DIE SCHLEIFE,nicht den Inhalt, wieder "Re-kommentiere", dann gibts schon einen "Memory Access Violation"-Fehler.

Hier noch den Codeausschnitt (Und zur Info, MAV-Fehler kommen ja oft, wenn Bildernicht vorhanden zB. Aber erstens geht das ganze ja ohne die 2te Each-Schleife, außerdem bin ich mir sicher, das es das Bild gibt. Und es gibt wie gesagt NUR die Fehlermeldung, wenn diese simple Schleife mit imProgramm ist...???) Sad...

EDIT: Noch eine Info.. Razz Es dürfte ja auchnicht schlimm sein, das der eine Wegtile sich mit selber abfragt, da das ja mit einer Ifschleife verbunden ist und die dann nicht zutrifft. Aber vielleicht geht das deswegen irgendwie nicht???

Funktion:


Code: [AUSKLAPPEN]
Function wegezeigen()                                       ;Die Wege werden gezeichnet

   For gebaudezeig.gebaudeset = Each gebaudeset                  ;Gebaude, in diesem fall Wege werden durchlaufen
   
      If gebaudezeig\typ = 0 Then                              ;Wenn Gebaude = Weg, dann:
         
         xkoo = gebaudezeig\xpos                              ;XPOS und YPOS des Weges
         ykoo = gebaudezeig\ypos
         rechenoperation = 0                                 ;Rechenvariable fuer Wegtile
         



            For gebaudezeig.gebaudeset = Each gebaudeset         ;Jedes andere Wegtile vergleichen
               If gebaudezeig\typ = 0 Then
            ;      If gebaudezeig\xpos - 60 = xkoo Then         ;Wenn Wegtile2 XPOS - 60 Pixel vom ersten Wegtile
            ;         rechenoperation = rechenoperation + 10      ;Dann Rechenoperator + 10, d.h. berührt links einen anderen Weg
            ;      End If
               End If
            Next
      



         DrawImage(weg(rechenoperation),xkoo - bufferfieldx,ykoo - bufferfieldy)   ;Weg zeichnen
      End If
   
   Next

End Function

BladeRunner

Moderator

BeitragMo, Apr 14, 2008 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die Variable in der inneren Schleife anders benennen, dann sollte es gehen.
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

jonnyboy

BeitragDi, Apr 15, 2008 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahja, danke, jetzt geht es... naja, da hab ich wohl types immernochnicht so richtig verstanden... Embarassed

BladeRunner

Moderator

BeitragMi, Apr 16, 2008 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Name der Variablew in der Schleife ist ja nur ein Platzhalter. Es werden bei der Schleife immer alle Einheiten eines Types durchlaufen, egal wie der Bezeichner heisst. Wenn Du jedoch 2mal denselben Bezeichner nimmst verwirrst Du den Compiler damit, der kann damit nix anfangen.
Das ist genau dasselbe weshalb du auch nicht 2mal denselben variablennamen bei for next nehmen solltest wenn Du verschachtelst.
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

jonnyboy

BeitragMi, Apr 16, 2008 9:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm.. wenn man das so sieht, dann verstehe ich das schon und ich werde es ab jetzt auch immer anwenden... Nur ich meine, dann ist es ja so das das erste, das

"gebaudezeig2" das das praktisch der Name der Schleife wäre? Aber... also ich habe das doch so verstanden,
das gebaudezeig praktisch ein Container ist. Darin befinden sich dann "Unterfächer", wie xPos, yPos und Typ zum Beispiel. Aber ich kann dochnicht einfach den Container umbenennen? Oder wird das durch das gebaudeset gemacht? Aber das ist doch nur der Typebezeichner sozusagen???? Confused
Man, Das ist schon nicht so leicht.. Sorry, das ich jetzt hier so diese Basisfragen stelle... Najo.

Noch eine Frage übrigens.. gehen auch 3 Type-Schleifen?

Nach dem Motto:

For bla\blubb = Each blo

For bla2\blubb = Each blo

For bla3\blubb = Each blo
Next
Next
Next

Ich will jetzt hier keinen Codeschnipsel oder sowass zeigen, weil ich die Schleife eh an der falschen Stelle gesetzt habe... Aber ich habe wie gesagt jetzt 3 Verschachtelungen und wenn ich dahin komme bei meine Spiel hängt sich das Programm auf und mein gesamter PC dazu...^^

Danke für eure Hilfe

garret

BeitragMi, Apr 16, 2008 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie BladeRunner schrieb, ist gebaudezeig ebenso wie gebaudezeig2 nur ein Platzhalter innerhalb deiner Schleife. Da deine Type-Einträge untereinander praktisch alle gleich sind, musst du einen als Vorgabe angeben, nach dessen Muster die anderen alle behandelt werden.

Das hieße also in Pseudocode:
Code: [AUSKLAPPEN]

For gebaudezeig.gebaudeset = Each gebaudeset; Für alle Type-Einträge wie gebaudezeig

  For gebaudezeig2.gebaudeset = Each gebaudeset; Für alle Type-Einträge wie gebaudezeig2

    If gebaudezeig <> gebaudezeig2; ausschließende Abfrage

      (Befehle)

    EndIf

  Next

Next


Mit
Code: [AUSKLAPPEN]

If gebaudezeig <> gebaudezeig2


verhinderst du, dass die beiden Schleifen den jeweils gleichen Eintrag miteinander vergleichen. Da es sich ja um ein und denselben Eintrag handelt, wären logischerweise immer die Bedingungen erfüllt. Rallimen hatte dazu irgendwann in letzter Zeit noch einen besseren Code gezeigt, einfach mal nach ihm suchen (das mach' ich jetzt nicht Smile).

Zu deiner zweiten Frage: Ja, du kannst drei und mehr Schleifen innerhalb verschachteln. Mit jeder neuen inneren Schleife erhöht sich aber logischerweise die Anzahl der Durchläufe. Wenn zum Beispiel Schleife 1 10, Schleife 2 10 und Schleife 3 auch 10 Durchläufe hätte, wären es insgesamt 10*10*10 = 1000 Durchläufe. Darum sollte man mit zuvielen Schleifen vorsichtig sein.
Ich würde aus meiner Erfahrung heraus sogar behaupten, dass man eigentlich nie mehr als zwei verschachtelte For-Each-Schleifen (des gleichen Type-Containers natürlich) benötigt - und ich nutze so gut wie immer Types Wink Das solltest du also auch irgendwie umgehen können.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

jonnyboy

BeitragMi, Apr 16, 2008 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antowtr, garet =)
Also die zweite Frage war ehrlich gesagt auch nichtnur für gleiche types gestellt.. sondern wie ich mir schon gedacht habe, wollte ich Fragen ob das nicht zuviel für den Computer wird bzw. ob der das irgendwann eifnach nichtmehr hinbekommt keine Ahnung Razz
Ich willnämlich xstep alle durchläufe, ystep alle durchläufe (also x und y positionen alle durchgehen) und dann nochmal alle gebaude durchgehen.. naja ist ja jetzt auch egal..

nochmals danke, grüße und Peace Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group