  | 
					
						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: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 23.06.2005, 17: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, 18: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.
  | 
   
 
     |