Seite 6 von 7

Verfasst: 20.11.2006 15:46
von AND51
>@and110011
>deine proc vermisst unicode.
Doch, das tut sie jetzt. <)
es war nur eine winzig kleine Veränderung nötig, überall, wo mit Peeks() gearbeitet wird, das Anhängsel *(1+#PB_Compiler_Unicode) bei Pointern etc. hinzuzufügen. Normalerweise, wird ind er FOR-Schleife mit PeekS() nur drei Zeichen (=drei Bytes) gelesen. Das Anhängsel bewirkt, dass bei eingeschaltetem Unicode die 3 auf eine 6 erweitert wird. Somit ist keine zusätzliche IF-Abfrage nötig.
Damit ist meine proc auch endlich vollendet. (hoffe ich)

Code: Alles auswählen

Procedure.s tausendertrennzeichen(zahl.q, separator.s=".") 
   If zahl > -1000 And zahl < 1000 
      ProcedureReturn Str(zahl) 
   EndIf 
   Protected zahl$=RemoveString(StrQ(zahl), "-"), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l 
   For n=start To Len(zahl$)-start-1 Step 3 
      res+separator+PeekS(@zahl$+n*(1+#PB_Compiler_Unicode), 3*(1+#PB_Compiler_Unicode)) 
   Next 
   If zahl < 0 
      res="-"+res 
   EndIf 
   If start 
      ProcedureReturn res 
   Else 
      ProcedureReturn PeekS(@res+Len(separator)*(1+#PB_Compiler_Unicode)) 
   EndIf 
EndProcedure 

Debug tausendertrennzeichen(1234567890) 
Debug tausendertrennzeichen(123456789) 
Debug tausendertrennzeichen(12345678) 
Debug tausendertrennzeichen(1234567) 
Debug tausendertrennzeichen(123456) 
Debug tausendertrennzeichen(12345) 
Debug tausendertrennzeichen(1234) 
Debug tausendertrennzeichen(123) 
Debug tausendertrennzeichen(12) 
Debug tausendertrennzeichen(1) 
Debug tausendertrennzeichen(0) 
Debug tausendertrennzeichen(-1) 
Debug tausendertrennzeichen(-12) 
Debug tausendertrennzeichen(-123) 
Debug tausendertrennzeichen(-1234) 
Debug tausendertrennzeichen(-12345) 
Debug tausendertrennzeichen(-123456) 
Debug tausendertrennzeichen(-1234567) 
Debug tausendertrennzeichen(-12345678) 
Debug tausendertrennzeichen(-123456789) 
Debug tausendertrennzeichen(-1234567890)
Ich persönlich habe noch nie mit Unicode gearbeitet und sehe derzeit auch keinen Grund, warum ich umsteigen sollte, deshalb habe ich leider nicht so die Erfahrung damit... :oops:

Verfasst: 21.11.2006 23:02
von Kaeru Gaman
AND51 hat geschrieben:*(1+#PB_Compiler_Unicode)
...gabs da nich ne konstante oder funktion,
die direkt die größe eines zeichens im momentan verwendeten modus zurückgibt?

Verfasst: 22.11.2006 00:00
von remi_meier
Sizeof(Character) is the way to go...

Verfasst: 22.11.2006 08:45
von AND51
Tut mir leid, aber ich habe direkt noch nie mit Unicode gearbeitet, deswegen denke ich an sowas nicht; ich weiß nur, das ein Zeichen in Unicode 2 Byte groß ist; da greift die von Kaeru zitierte Formel aber auch 8)

Und ihr müsst doch zugeben, dass das ziemlich einfallsreich ist, oder? :wink:

Verfasst: 22.11.2006 10:43
von edel
AND51 hat geschrieben:Und ihr müsst doch zugeben, dass das ziemlich einfallsreich ist, oder? :wink:
Ja man merkt schon das du nicht nachgedacht hast. Wer sagt dir denn
das die Konstante immer 1 haben wird ? SizeOf(Character) ist, wie remi
schon geschrieben hat, der richtige Weg.

Verfasst: 22.11.2006 16:40
von AND51
Habe mir SiozeOf() in der Hilfe angesehen und festgestellt, das dass daselbe ist, wie meines; trotzdem ist SizeOf() viel besser.

>Wer sagt dir denn das die Konstante immer 1 haben wird ?
Ich sage das, weil (1+#PB_Compiler_Unicode) 1 ergeben wird, wenn das programm in ASCII kompiliert wird. n*1 bleibt für ASCII also genau daselbe wie n.

Der Ausdruck wird aber 2 ergeben, wenn das programm in Unicode kompiliert wird. Die Länge n mit 2 multipliziert ergibt den Speicherverbrauch, da 1 Zeichen=2 Byte in Unicode.

#PB_Compiler_Unicode ist also entweder immer 0 (ASCII) oder 1 (Unicode).

Verfasst: 22.11.2006 18:08
von #NULL
edel meint nicht (nur) das ergebnis deines ausdruckes, sondern die konstante selbst. da die konstante keine zahl repräsentieren soll, sondern eher sowas wie einen boolean-flag. kann sie in zukunft auch andere werte haben. ist nicht wahrscheinlich, aber sie als numerischen wert zu verwenden ist nicht besonders weitsichtig.

Verfasst: 22.11.2006 20:04
von Kaeru Gaman
sic.

also für solche fälle:

Code: Alles auswählen

* ( 1+  ( #False Or ( #PB_Compiler_Unicode <> #False ) ) )
:mrgreen:

Verfasst: 22.11.2006 20:06
von #NULL
:mrgreen:

Verfasst: 23.11.2006 00:21
von AND51
Ich habe 100%ig verstanden was ihr meint. Trotzdem ist es kein Booloean; die Klammern verwende ich nur wegen Punkt vor Strichrechnung.
Wie gesagt, ich habe genau verstanden, was ihr meint und gebe jetzt auch Ruhe. :)