|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 23.06.2005, 18:11 Titel: Funktion Revers$ |
|
|
Hallo,
ich wollte eine Funktion vorstellen die nicht gerade zu den VIF (very important function) zählt aber recht nützlich sein kann.
Die Funktion Revers$ spiegelt einen Text vom Anfang zum Ende.
Eigentlich zum Umkehren eines Byte-Arrays gedacht, wurde dann das daraus.
Revers$ ( String [,Startpunkt, Laenge])
Startpunkt und Laenge können Optional angegeben werden.
Code: | Dim t As String
' Deklaration der Funktion mit Vorbelegung der Variablen start=0 und laenge=0
' Erspart die Angabe beim Aufruf, wenn man diese Optionen nicht nutzen möchte.
Declare Function Revers$ (ByVal txt As String, ByVal start=0, ByVal laenge=0 )
t = "Dieser Text wird gespiegelt. Das ist 'just for fun' oder zum Verschluesseln?"
Print Revers$(" !dlroW olleH ")
Print t
Print Revers$ (t,28)
Print Revers$ (t,,28)
Print Revers$ (t)
Sleep
End
Public Function Revers$ (ByVal txt As String, ByVal start As Integer, ByVal laenge As Integer)
Dim p As Byte Ptr 'Damit man Zeichen für Zeichen tauschen kann
Dim l As Integer,i As Integer
Dim y As Byte
Dim memtxt As String
memtxt = txt 'Text umkopieren
l = Len(memtxt)
p = StrPtr(memtxt) -1 ' @memtext geht auch
If (start >= 0) And (Start < l) Then
l -= start
p += start
End If
If (laenge > 1) And (laenge <= l) Then l = laenge
If l > 1 Then
For i= 1 To l\2
y = p[i]
p[i] = p[l+1-i]
p[l+1-i] = y
Next
End If
Revers$ = memtxt
End Function |
Als Übung habe ich dann das Ganze in ASM- versucht, allerdings mit weniger Komfort nur einfache Spiegelung.
Code: | Dim t As String
Declare Function Revers$ (ByVal Text As String)
t = "Dieser Text wird gespiegelt. Das ist 'just for fun' oder zum Verschluesseln?"
Print Revers$(" !dlroW olleH ")
Print Revers$ (t)
Print t
Sleep
End
Public Function Revers$ (ByVal txt As String)
Dim lt As Integer
Dim Text As String
Text = txt
lt = Len(Text)
If lt > 1 Then
asm
mov eax, [Text] 'Anfang des String im RAM
mov ebx, [lt] 'Laenge des String
mov esi, eax
add eax, ebx
dec eax
mov edi, eax 'letzes Zeichen des String
mov ecx,ebx
shr ecx 'ecx =a\2 Laufvariable
lnext:
mov al, [esi] 'al = Anfang
mov ah, [edi] 'ah = Ende
mov [edi], al 'Ende = al
mov [esi], ah 'Anfang = ah
inc esi 'Anfang + 1
dec edi 'Ende - 1
loop lnext 'wie for .. next
End asm
End If
Revers$ = Text
End Function |
Bei beiden Funktionen habe ich einen Effekt festgestellt, den ich mir bis jetzt nicht erklären kann;
obwohl ich den Text als byval, also als Kopie, an die Funktion übergebe wird der Orginalstring an txt Übergeben.
Abhilfe schafft hier nur das umkopieren in einen lokalen String in der Funktion, damit der Orginalstring nicht verändert wird.
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 23.06.2005, 19:52 Titel: |
|
|
Schick das ganze an v1ctor, vielleicht kannst du dann beim release von v0.15 in der Referenz den Eintrag Reverse$ lesen _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|