Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Funktion Revers$

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 23.06.2005, 17:11    Titel: Funktion Revers$ Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 23.06.2005, 18:52    Titel: Antworten mit Zitat

Schick das ganze an v1ctor, vielleicht kannst du dann beim release von v0.15 in der Referenz den Eintrag Reverse$ lesen Zunge rausstrecken
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz