TStreamWrapper-Frage

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

n-Halbleiter

Betreff: TStreamWrapper-Frage

BeitragMi, Jun 23, 2010 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute!

Ich wollte mich Gestern mal mit Streams (und Streamwrappern und Streamfactories) auseinandersetzen. Dafür gibt es ja ein Beispiel in der Standarddokumentation (Tutorials -> BlitzMax Overview) über die Verwendung. Jedoch funktioniert das nicht. Der Code ist folgender, komplett aus der Dokumentation übernommen:

BlitzMax: [AUSKLAPPEN]
Strict

Type TUpperStream Extends TStreamWrapper

Method Read( buf:Byte Ptr,count )
'Read data from the underlying stream
count=Super.Read( buf,count )
'Convert the data to uppercase
For Local i=0 Until count
If buf[i]>=Asc("a") And Buf[i]<=Asc("z")
buf[i]=buf[i]-Asc("a")+Asc("A")
EndIf
Next
'Done!
Return count
End Method

Method Write( buf:Byte Ptr,count )
'Copy the data to a new buffer, converting to uppercase as we go
Local tmp:Byte[count]
For Local i=0 Until count
If buf[i]>=Asc("a") And buf[i]<=Asc("z")
tmp[i]=buf[i]-Asc("a")+Asc("A")
Else
tmp[i]=buf[i]
EndIf
Next
'Write the data to the underlying stream
Return Super.Write( tmp,count )
End Method

Function Create:TUpperStream( stream:TStream )
Local t:TUpperStream=New TUpperStream
'SetStream is a TStreamWrapper method that sets the underlying stream.
t.SetStream stream
Return t
End Function

End Type

'Exmaple of manually creating a TUpperStream:

'Create a tmp file and write some text to it.
Local tmp:TStream=WriteStream( "tmp" )
tmp.WriteLine "A little example..."
tmp.WriteLine "of our cool TUpperStream!"
tmp.Close

'Open tmp file again, and wrap it with a TUpperStream
tmp:TStream=ReadStream( "tmp" )
Local upperizer:TUpperStream=TUpperStream.Create( tmp )

'Dump file contents
While Not upperizer.Eof()
Print upperizer.ReadLine()
Wend

upperizer.Close
tmp.Close


Theoretisch sollte es ja den Text "A little example... of our cool TUpperStream!" in Großbuchstaben anzeigen, aber das tut es nicht.

Das Problem liegt (so wie ich das sehe) in der nicht-Implementation von ReadLine() im Type TUpperStream. Die ReadLine()-Methode des TStreamWrappers sieht folgendermaßen aus:
BlitzMax: [AUSKLAPPEN]
Method ReadLine$()
Return _stream.ReadLine()
End Method


Man sieht: Die Anweisung wird einfach an den darunterliegenden Stream weitergegeben.

Meine Schlussfolgerung: Ich muss entweder für jeden abgeleiteten StreamWrapper die ReadLine()-Methode selbst schreiben, damit sie die Read()-Methode des StreamWrappers bemüht, oder im Modul BRL.Stream die Methode ändern. An sich dürfte das ja kein Problem, aber mir stellen sich die Fragen: Wieso steht in der Dokumentation etwas so grausam nicht korrektes? Hat sich da sonst noch keiner reingelesen? Wieso muss man erst einen solchen Eingriff vornehmen, damit etwas, was eigentlich funktionieren sollte, funktioniert?


P.S.: Hat jemand schonmal so eine Modifikation geschrieben, an der man sich orientieren könnte?
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

mpmxyz

BeitragMi, Jun 23, 2010 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ganz klar Mark Siblys Stil. (leider)
Man merkt, dass er Dokumentationen nicht mag. (Ich mag sie auch nicht, aber ich bin wenigstens beim Schreiben von diesen gründlicher.)
Wahrscheinlich hat er den StreamWrapper irgendwann einmal verändert/umgeplant gehabt und die Änderung bei der Dokumentation nicht beachtet.
Eventuell bringt ein Beitrag auf blitzbasic.com ihn dazu, seine Antriebslosigkeit zu überwinden. Wink
Für Streamwrapper, welche nur TIO-Methoden verändern, sollte man eher direkt TStream erweitern und die entsprechenden Eigenschaften und Methoden, die ein "echter" Streamwrapper braucht, ergänzen.
Spezielle Fragen kannst du gerne an mich stellen. Smile
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

n-Halbleiter

BeitragMi, Jun 23, 2010 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich hab' mich ein wenig damit auseinandergesetzt, und auch das Problem gefunden (Hier ist der Post auf BB.com). Ich weiß nicht genau, ob es nun am Modul oder an der Dokumentation liegt (Missverständnis z.B.), auf jeden Fall muss man, um das Beispiel zum Laufen zu kriegen, in der Implementation von TStreamWrapper einige Zeilen auskommentieren (alles mit Read/Write[bla], mal abgesehen von ReadBytes/WriteBytes), dann funktioniert das Beispiel, wie es soll.

Der Source des veränderten TStreamWrapper:
BlitzMax: [AUSKLAPPEN]
Type TStreamWrapper Extends TStream
Field _stream:TStream

Rem
bbdoc: Set underlying stream
about:
Sets the stream to be __COMMENT1__
redirected to @stream.
end rem

Method SetStream( stream:TStream )
_stream=stream
End Method

Method Eof()
Return _stream.Eof()
End Method

Method Pos()
Return _stream.Pos()
End Method

Method Size()
Return _stream.Size()
End Method

Method Seek( pos )
Return _stream.Seek( pos )
End Method

Method Flush()
_stream.Flush
End Method

Method Close()
_stream.Close
End Method

Method Read( buf:Byte Ptr,count )
Return _stream.Read( buf,count )
End Method

Method Write( buf:Byte Ptr,count )
Return _stream.Write( buf,count )
End Method

Rem
Method ReadByte()
Return _stream.ReadByte()
End Method

Method WriteByte( n )
_stream.WriteByte n
End Method

Method ReadShort()
Return _stream.ReadShort()
End Method

Method WriteShort( n )
_stream.WriteShort n
End Method

Method ReadInt()
Return _stream.ReadInt()
End Method

Method WriteInt( n )
_stream.WriteInt n
End Method

Method ReadFloat:Float()
Return _stream.ReadFloat()
End Method

Method WriteFloat( n:Float )
_stream.WriteFloat n
End Method

Method ReadDouble:Double()
Return _stream.ReadDouble()
End Method

Method WriteDouble( n:Double )
_stream.WriteDouble n
End Method

Method ReadLine$()
Return _stream.ReadLine()
End Method

Method WriteLine( t$ )
Return _stream.WriteLine( t )
End Method

Method ReadString$( n )
Return _stream.ReadString( n )
End Method

Method WriteString( t$ )
_stream.WriteString t
End Method

Method ReadObject:Object()
Return _stream.ReadObject()
End Method

Method WriteObject( obj:Object )
_stream.WriteObject obj
End Method
End Rem


End Type


Ich hoffe, jemand kann damit etwas anfangen. Smile
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group