Types - For ... Next

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Types - For ... Next

BeitragFr, Mai 14, 2010 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Ich habe einen Type (player) und möchte alle Einträge dieses Types auf etwas überprüfen. (es existiert allerdings noch keiner)
Dafür benutzt man doch eine For - Next Schleife, nicht wahr?
Da ich vorher mit BB gearbeitet habe weiß ich nicht so recht wie ich das angehen soll.

Habe mir das folgendermaßen gedacht:
Code: [AUSKLAPPEN]
Local p:player
For p = EachIn player
   If p.name$<>lName$ Then
      Print "Klappt."
   EndIf
Next


Was fehlt? Muss ich die Einträge in eine TList eintragen? (Wenn ja, wie funktioniert das?)

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Goodjee

BeitragFr, Mai 14, 2010 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, alles in eine liste die du dann durchläufst

BlitzMax: [AUSKLAPPEN]

Local list:TList=New TList
Local a:Player=New Player
list.addLast(a)
For Local b:Player=EachIn list
Print "freu"
Next


du kannst uach die liste im type definieren und im konstruktor die neu erstellten objekte gleich speichern, um ein bb verhalten zu erreichen

BlitzMax: [AUSKLAPPEN]
Type Player
Field x:Int,y:Int

Global players:TList=New TList

Method New()
players.addLast(Self)
EndMethod
End Type

For Local a:Player=EachIn Player.players
Print "freu"
Next
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

N0X

BeitragFr, Mai 14, 2010 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, wie kann ich auf alle existierenden Player überprüfen ob ein Player mit einem bestimmten Namen überhaupt existiert, wenn doch das Überprüfen in der For-Next Schleife steht, diese aber nie aufgerufen wird, weil ja noch kein Player existiert?

Dazu ein wenig Code:
Code: [AUSKLAPPEN]
                        For Local a:player = EachIn player.list
                           If a.name$<>lName$ Then
                              iFileExists = 1
                              Local p:player = New player
                              p.name$ = lName$
                              p.pass$ = lPass$
                              Print Chr(34)+p.name$+Chr(34)+" "+Chr(34)+p.pass$+Chr(34)
                           Else
                              Print "Failed Login detected! (Incorrect Password)"
                           EndIf
                        Next


Mfg,
N0X

//EDIT:
Gelöst.
Neues Problem:

Ich möchte einen Login verhindern, wenn der Spieler schon in der Liste ist.
Wie mache ich das? (Oder besser warum funzt das nicht? Crying or Very sad )

Code: [AUSKLAPPEN]
Print "Client logging..."
Local lName$ = udpStream.ReadLine()
Local lPass$ = udpStream.ReadLine()
Local iFileExists = 0
ChangeDir(".\users\")
dir = ReadDir(CurrentDir())
Repeat
   nFile$ = NextFile(dir)
   If nFile$="" Then Exit
   If FileType(nFile$)=1 Then
      If Instr(lName$+".txt",nFile$) Then
         file = ReadFile(lName$+".txt")
         For i = 0 To 1
            trash$ = ReadLine(file)
         Next
         rPass$ = ReadLine(file)
         If lPass$ = rPass$ Then
            For Local a:player = EachIn player.list
               If a.name$<>lName$ Then
                  iFileExists = 1
                  Exit
               Else
                  Print "Failed Login detected! (Incorrect Password)"
                  Exit
               EndIf
            Next
         EndIf
         CloseFile(file)
      EndIf
   EndIf
Until nFile$ = ""
CloseDir(dir)
If iFileExists = 0 Then
   Print "Failed Login detected! (Incorrect User)"
Else
   Local p:player = New player
   p.name$ = lName$
   p.pass$ = lPass$
   Print Chr(34)+p.name$+Chr(34)+" "+Chr(34)+p.pass$+Chr(34)
EndIf


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragFr, Mai 14, 2010 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
            For Local a:player = EachIn player.list
If a.name$<>lName$ Then
iFileExists = 1
Exit
Else
Print "Failed Login detected! (Incorrect Password)"
Exit
EndIf
Next

Hier scheint ein Fehler zu liegen:
Es wird nur der erste Spieler untersucht.
Diese Kontrollschleife solltest du noch einmal neu schreiben, da z.B. iFileExists auch nicht richtig angewandt wird.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

N0X

BeitragFr, Mai 14, 2010 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab die beiden Exit's mal wieder rausgenommen.
Der erste Login klappt, aber wenn ich mich nocheinmal einloggen möchte (Mit gleichen Daten), was ja verhindert werden soll, kommt einmal "Failed Login detected! (Incorrect Password)" und danach direkt die Daten des Spielers (was ja bedeutet das der Login dann doch noch einmal ausgeführt wird).
Es wird ja jeder Spieler durchgegangen und einmal existiert er ja schon (deswegen "Failed Login...") aber ein anderes Mal existiert er ja noch nicht.
Wie kann ich das verhindern?

Mfg,
N0X

//EDIT:

Achja, einmal existiert er nicht, weil ich am Anfang einen Test-User erstellt haben muss.
Das gleiche würde ja aber auch auftreten, wenn mehr als ein User eingeloggt ist.

Code war etwas falsch, hier der Neue:
BlitzMax: [AUSKLAPPEN]
Print "Client logging..."
Local lName$ = udpStream.ReadLine()
Local lPass$ = udpStream.ReadLine()
Local iFileExists = 0
ChangeDir(".\users\")
dir = ReadDir(CurrentDir())
Repeat
nFile$ = NextFile(dir)
If nFile$="" Then Exit
If FileType(nFile$)=1 Then
If Instr(lName$+".txt",nFile$) Then
file = ReadFile(lName$+".txt")
For i = 0 To 1
trash$ = ReadLine(file)
Next
rPass$ = ReadLine(file)
If lPass$ = rPass$ Then
For Local a:player = EachIn player.list
If a.name$<>lName$ Then
iFileExists = 1
Else
Print "ERROR: User already logged in!"
EndIf
Next
Else
Print "Failed Login detected! (Incorrect Password)"
EndIf
CloseFile(file)
EndIf
EndIf
Until nFile$ = ""
CloseDir(dir)
If iFileExists = 0 Then
Print "Failed Login detected! (Incorrect User)"
Else
Local p:player = New player
p.name$ = lName$
p.pass$ = lPass$
Print Chr(34)+p.name$+Chr(34)+" "+Chr(34)+p.pass$+Chr(34)
EndIf
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragFr, Mai 14, 2010 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wäre dafür, dass du mit Debuggen anfängst.
Das ist nämlich viel effektiver, als anderen den Code zum "manuellen Ausführen" zu geben. Wink
Die Anmerkung mit der Kontrollschleife hast du auch noch nicht beachtet.
Im Moment wird der Kontrollwert auf 1 gesetzt, wenn es einen anderen angemeldeten Benutzer gibt.
Eigentlich sollte also sogar gar kein Benutzer erstellt werden, da iFileExists immer 0 ist.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

N0X

BeitragFr, Mai 14, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, iFileExists hätte ich wohl eher erlaube_login nennen sollen... Rolling Eyes
Also, wenn der User der sich gerade einloggen möchte noch NICHT in der aktuellen Userliste vorhanden ist, und er registriert ist (also wenn die Datei mit dem Usernamen existiert), ist es ihm erlaubt sich anzumelden.
Mein Problem ist doch eher, das er alle durchgeht und dann erlaubt wenn noch ein anderer User drin ist und dann doch wieder nicht erlaubt weil man selbst auch drin ist etc.

Aber vom restlichen Code her ist doch alles richtig. (?!)
Kannst du mir bitte nochmal genau erklären was ich da jetzt falsch mache?

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragFr, Mai 14, 2010 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich habe mir jetzt noch einmal die Zeit genommen, den Code durchzuarbeiten und die Auffälligkeiten zu markieren.
BlitzMax: [AUSKLAPPEN]
Print "Client logging..."
Local lName$ = udpStream.ReadLine()
Local lPass$ = udpStream.ReadLine()
Local iFileExists = 0
ChangeDir(".\users\")
dir = ReadDir(CurrentDir())
Repeat 'Warum wird überhaupt nach der User-Datei gesucht?
nFile$ = NextFile(dir)
If nFile$="" Then Exit
If FileType(nFile$)=1 Then
If Instr(lName$+".txt",nFile$) Then 'Wenn es einen Spieler "OX" gäbe, würde sich der Spieler "NOX" als dieser eventuell anmelden, wenn die "OX"-Datei vor der "NOX"-Datei kommt. Im Momentanen Code käme wahrscheinlich nur eine Warnung wegen eines falschen Passwortes, aber wenn hier weitere Features kommen, kann es unsicher werden.
file = ReadFile(lName$+".txt")
For i = 0 To 1
trash$ = ReadLine(file) 'Wenn du das eh nicht brauchst: Warum speicherst du die Ergebnisse in einer Variable?
Next
rPass$ = ReadLine(file) 'Falls es wirklich mal verwendet werden soll: Passwörter im Klartext sind nicht wirklich sicher; das gilt erst recht, wenn sie nicht nur so gespeichert, sondern auch übertragen werden sollen.
If lPass$ = rPass$ Then
For Local a:player = EachIn player.list 'In dieser Schleife liegt ein großer logischer Fehler.
If a.name$<>lName$ Then 'Nur wenn es einen angemeldeten Spieler gibt, welcher einen anderen Namen hat, ...
iFileExists = 1 'darf man sich anmelden.
Else
Print "ERROR: User already logged in!"
EndIf
Next
Else
Print "Failed Login detected! (Incorrect Password)"
EndIf
CloseFile(file)
EndIf
EndIf
Until nFile$ = ""
CloseDir(dir)
If iFileExists = 0 Then
Print "Failed Login detected! (Incorrect User)"
Else
Local p:player = New player
p.name$ = lName$
p.pass$ = lPass$
Print Chr(34)+p.name$+Chr(34)+" "+Chr(34)+p.pass$+Chr(34)
EndIf

mfG
mpmxyz
P.S.: Es ist viel praktischer, wenn man selbst auf Fehlersuche geht. Wink
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group