BASIC Befehle MID und STRING

Fragen und Bugreports zur PureBasic 4.0-Beta.
pickelrobert
Beiträge: 198
Registriert: 09.12.2004 22:09

BASIC Befehle MID und STRING

Beitrag von pickelrobert »

Hallo,

beim Hantieren mit Strings mußte ich feststellen, des es in PB den STRING-Befehl nicht gibt. Außerdem Gibt es nur eine MID-Funktion, jedoch keinen MID-Befehl. Hat da jemand eine einfache Lösung ?

Danke und Gruß
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Kannst du uns , zumindest denen die nicht aus der Basic Ecke kommen,
erklaeren was daran anders als str() und mid() sein soll ?
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Jetzt bin ich mal gespannt wie sich die MID-Funktion von dem MID-Befehl unterscheidet...
Windows 10 Pro, 64-Bit / Outtakes | Derek
pickelrobert
Beiträge: 198
Registriert: 09.12.2004 22:09

Beitrag von pickelrobert »

MID-Funktion = wie vorhanden

MID-Befehl funktioniert so:

tmp="grüne Hose"
MID(tmp,3,2)="au"
tmp="graue Hose"

STRING-Befehl/Funktion
tmp=STRING("a",3)
tmp="aaa"

Die "Fehler" sind mir beim Portieren von Visual Basic 6 - Code aufgefallen
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Du kannst zwar einer Funktion keinen Wert zuweisen aber alles was du brauchst findest du in der Hilfe unter String (rset z.B.).
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Abgefahrene Syntax! Bild

Der MID-Befehl hat mit dem eigentlichem BASIC-MID nix zu tun sondern ist lediglich das Suchen/Ersetzen in Strings mit Start- / Längenangabe.

Was den STRING Befehl angeht:

Code: Alles auswählen

Procedure.s STRING(Char.s,Count)
	Protected Result.s

	lpBuffer = AllocateMemory(Count)
	RtlFillMemory_(lpBuffer,Count,Asc(Char))
	Result = PeekS(lpBuffer)	
	FreeMemory(lpBuffer)
		
	ProcedureReturn Result.s
EndProcedure
Windows 10 Pro, 64-Bit / Outtakes | Derek
pickelrobert
Beiträge: 198
Registriert: 09.12.2004 22:09

Beitrag von pickelrobert »

Danke für den STRING-Tip.

Zur MID-Anweisung sagt die MSDN Folgendes:

http://msdn2.microsoft.com/de-de/librar ... S.80).aspx
Mid-Anweisung

Ersetzt eine bestimmte Anzahl an Zeichen in einer String-Variablen durch Zeichen aus einer anderen Zeichenfolge.

Mid( _
ByRef Target As String, _
ByVal Start As Integer, _
Optional ByVal Length As Integer _
) = StringExpression

BestandteileBestandteile

Target

Erforderlich. Name der zu ändernden String-Variablen.

Start

Erforderlich. Integer-Ausdruck. Zeichenposition in Target, wo die Ersetzung des Texts beginnt. Start verwendet einen mit Eins beginnenden Index.

Length

Optional. Integer-Ausdruck. Anzahl der zu ersetzenden Zeichen. Wird hierfür kein Wert angegeben, so wird String komplett verwendet.

StringExpression

Erforderlich. String-Ausdruck, der einen Teil von Target ersetzt.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Code: Alles auswählen

Macro String(char, count)
  RSet("", count, char)
EndMacro
;)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Code: Alles auswählen


Procedure MidString(*ori, start, *neu, lg=0)
  
  If lg = 0
     lg = MemoryStringLength(*neu)
  EndIf
  
  MoveMemory(*neu, *ori+start-1, lg)
   
  ;in dieser Version kann Ori länger werden, wenn lg nicht angegeben oder zu groß ist

EndProcedure

Procedure MidString1(*ori, start, *neu, lg=0)
  
  lgori = MemoryStringLength(*ori)
  lgneu = MemoryStringLength(*neu)
  
  If lgneu + start > lgori
      lgneu = lgori - start + 1
  EndIf 
  
  
  If lg = 0 Or lg > lgneu
     lg = lgneu     
  EndIf  
   
  MoveMemory(*neu, *ori+start-1, lg)
  
  ;in dieser Version sollte Ori NICHT länger werden

EndProcedure


tmp$="grüne Hose"
MidString(@tmp$,3,@"au"): Debug tmp$

tmp$="grüne Hose"
MidString(@tmp$,3,@"au",2): Debug tmp$

tmp$="grüne Hose" 
MidString1(@tmp$,3,@"au",18): Debug tmp$

tmp$="grüne Hose" 
MidString1(@tmp$,3,@"au123456789123456789",18): Debug tmp$

Habe allerdings nicht alle möglichen Variationen getestet

Wer will kann MoveMemory auch durch CopyMemory ersetzen.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Gesperrt