www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

  1 2 nächste Seite

funnysmell

Gepostet:
13.05.2005 15:24

Fehler abfangen  
Kaum ist das ein Problem gelöst kommt das nächste.
Mit

readHandelUntilWhitespace handle command = do
char <- hGetChar handle
if ( char == ' ' ) then return (reverse command)
else readHandelUntilWhitespace handle (char:command)

lese ich Zeichen für Zeichen vom Handle ein, bis ein Leerzeichen kommt. Für “ABC 123“ erhalte ich “ABC“, aber was ist wenn es keine Leerzeichen gib? Dann bleibt das Programm einfach stehen. Das ganze mit hIsEOF abzufangen geht auch nicht. Meine Idee war mit catch zu erkennen wenn kein Zeichen mehr gelesen werden kann und dann entsprechend eine Fehlermeldung auszugeben

gruß funnySmell
Zum Seitenanfang    
 
Jacke

Gepostet:
13.05.2005 15:53

   
kannst du mal die ganze aufgabenstellung geben? ich kann mir das jetzt nich so richtig vorstellen was du machen willst...
also wenn es keine Leerzeichen gibt dann liest du das programm den ganzen string ein
wenn das leerzeichen am anfang des strings steht dann liest du garnix ein

willst du abfangen das es kein leerzeichen gibt? wozu?
und gib mir mal das was du an getWord geändert hast...

Zum Seitenanfang    
 
Jammni

Gepostet:
13.05.2005 16:05

   
Kann es sein, dass du das nicht in Haskell sonder in einer anderen Programmiersprache programmierst? Dein Quelltext-Auszug sieht ja eher C-like aus - und nicht Haskell-like ;-)
Zum Seitenanfang Homepage   ICQ    
 
funnysmell

Gepostet:
13.05.2005 16:13

   
Die Aufgabenstellung lautet einen Server in Haskell zu schreiben und eine Client in Python.
http://www.ki.cs.uni-frankfurt.de/lehre/SS2005/Praktische-Informatik/praktikum/
Der Client erzeugt nen Socket (wie der Server auch) und schickt eine Anfrage z.B. “PROPF 3 a&b“ wobei sich die 3 auf die Länge der Formel a&b bezieht.
Da in den Regeln des Protokolls nichts drin steht das der Client den Socket einseitig schließt oder am Ende der Anfrage ein \n mit sendet um dem Server zu sagen jetzt ist die Anfrage zu ende muss man Zeichen für Zeichen einlesen und auswerten. Funktioniert im normal fall auch.
Wenn man aber “PROPF“ schickt hängt sich das Programm auf.
getWord heißt bei mir readHandelUntilWhitespace

ich rufe readHandelUntilWhitespace mit dem Handel vom Socket und einer leeren liste [] auf.
request <- readHandelUntilWhitespace handle []
Und dann bleibt das Programm einfach stehen.
Zum Seitenanfang    
 
Jacke

Gepostet:
13.05.2005 17:37

   
alllllllllsooooo:



whitespace =[' ']
getWord ::[Char] ->String
getWord [] =[]
getWord(x:xs)
|elem x whitespace = []
|otherwise = x: getWord xs


Testlauf
Type :? for help
Main> getWord "das nich"
"das"
Main> getWord "das"
"das"
Main> getWord " das"
""
Main> getWord ""
""

du brauchst getword nicht mit einer leeren liste aufrufen...
du hast mir immernoch nicht dein readuntilwhitespace reinkopiert...bei der aufgabe hast du ja noch einiges zu machen ;)
ich denke der fehler liegt in deinen quelltext

gruß jacke
Zum Seitenanfang    
 
funnysmell

Gepostet:
13.05.2005 18:19

   
Das Problem an der Sache ist das ich nicht mit (x:xs) auf den Handel zugreifen kann. Also übergebe ich den Handel und lese mit hGetChar das erste Zeichen aus. Wenn der Handel aber zu ende ist und kein Leerzeichen gekommen ist dann hängt sich der Server auf.
Ich mail dir mal dis Script.
Zum Seitenanfang    
 
Jacke

Gepostet:
13.05.2005 19:58

   

readHandelUntilWhitespace handle command = do
char <- hGetChar handle
if ( char == ' ' ) then return command
else if (wenn das handle leer ist) then return ("kein leerzeichen":command)
else readHandelUntilWhitespace handle (char:command)


so in der art müßte es eigentlich gehen
Zum Seitenanfang    
 
funnysmell

Gepostet:
13.05.2005 22:00

   
Danke erstmal für deine Bemühungen!!!

Kann es sein das hGetChar keinen Fehler ausgibt, wenn versucht wird etwas zu lesen wo nichts mehr ist? Hab grade versucht mit try either und catch diverse IoErrors abzufangen aber da tut sich rein gar nix
Zum Seitenanfang    
 
Jacke

Gepostet:
13.05.2005 23:52

   
ich hab das normale gerChar benutzt...ja und getChar gibt keinen fehler zurrück...;)
du kannst nur selber von hand kucken ob das handel leer is also z.b mit nen if

gruß jacke
Zum Seitenanfang    
 
funnysmell

Gepostet:
14.05.2005 00:22

   
Ich hab’s folgendermaßen gelöst

readHandel handle command = do
char <- hGetChar handle
eof <- hIsEOF handle
if ( char == ' ' ) then return ( reverse command )
else if ( eof ) then return "ERROR"
else readHandel handle ( char:command )

und es schein zu funktionieren.
Dumm wenn man versuch eine Exception zu fangen wo gar keine ausgegeben wird na ja aus Fehlern lernt man. Es Läuft mim Pythen Client und per Telnet kann man sich auch einwählen. Ich denke das hat zu reichen. Ehrlichgesagt hab ich auch keinen Bock mehr genug Haskell für heute.
Noch mal Tausend Dank für deine Hilfe!
Zum Seitenanfang    
 

  1 2 nächste Seite