Seite 5 von 6
Verfasst: 12.10.2006 14:04
von Karl
Ich habe hier seltsame Fehler:
Code: Alles auswählen
Procedure.s ByteHeinz(wert.q)
Protected anzahl.l, swert.s, temp.d, lokwert.q
lokwert = wert
anzahl = Int(Log(lokwert)/Log(2))
Debug anzahl
anzahl = anzahl - (anzahl % 10)
Debug anzahl
Debug lokwert
Debug Pow(2, anzahl)
temp = lokwert/Pow(2, anzahl)
Debug temp
swert = StrD(temp, 1)
Select anzahl
Case 10
swert + " KB"
Case 20
swert + " MB"
Case 30
swert + " GB"
Case 40
swert + " TB"
Case 50
swert + " PB"
Case 60
swert + " EB"
EndSelect
ProcedureReturn swert
EndProcedure
Debug ByteHeinz(100000)
Das Kopieren der Quadwerte schlägt fehl. Die Rückgabe funktioniert nicht. Ist das bei euch auch so?
Gruß Karl
Verfasst: 12.10.2006 14:55
von NicTheQuick
Bei mir funktioniert deine Version. Aber warum machst du nicht gleich
Log(1024) statt Log(2)?
Verfasst: 12.10.2006 15:01
von #NULL
ich erhalte den gleichen fehler wie karl, geht also bei mir nicht.
Verfasst: 12.10.2006 15:11
von ts-soft
Bei mir gehts auch nicht
@NTQ
So wie es aussieht, über mehrere Threads beobachtet, benutzt Du eine
andere PB4 Version. Vielleicht mal neuladen, installieren, updates von der
Beta-Seite, damit Du dieselben Fehler hast, wie die anderen
Gruß
Thomas
Verfasst: 03.11.2006 21:24
von AND51
habe den Code nochmals verkürzt:
Code: Alles auswählen
Procedure.s byterechner(byte.q, NbDecimals.b=1)
Protected unit.b=Round(Log(byte)/Log(1024), 0)
ProcedureReturn StrD(byte/Pow(1024, unit), NbDecimals*(unit And 1))+" "+StringField("Byte,KB,MB,GB,TB,PB,EB", unit+1, ",")
EndProcedure
Der Trck: Die eine protected Variable vom Typ Double (.d) ist weggefallen, stattdessen wird der Parameter byte.q direkt überall eingesetzt. Funktioniert mit PB 4.01 (das Update).
Verfasst: 03.04.2007 11:15
von AND51
Welcher Heini hat sich eigentlich das
Round() hinzugedichtet?
Da ich abrunde, brauche ich das eh nicht, Beweis:
Bei der Zuweisung eines Floats zu einer Integer-Variablen geht der Nachkommateil automatisch flöten.
Habe die Procedure nochmals verbessert. Außerdem habe ich 'unit' zu einem Long gemacht, sollte schneller als Byte sein

'NbDecimals' ist jetzt auch ein Long
Code: Alles auswählen
Procedure.s byterechner(byte.q, NbDecimals.l=1)
Protected unit.l=Log(byte)/Log(1024)
ProcedureReturn StrD(byte/Pow(1024, unit), NbDecimals*(unit And 1))+" "+StringField("Byte,KB,MB,GB,TB,PB,EB", unit+1, ",")
EndProcedure
Beschreibung:
Geht bis 8.999.999.999.999.999.999 Byte (7,8 EB) Kann also auch für Wetterstationen benutzt werden
So, damit wir's auch alle korrekt haben.
Das StringField() gefällt mir noch nicht ganz. Ich habe es verwendet, weil "Byte" und "KB" eine unterschiedliche Länge haben, sonst hätte man einfach PeekS() in Zusammenhang mit 'unit' nehmen können, welcher immer einen Teilstring gleicher Länge rausschneidet.
Hat jemand eine bessere Idee?
Verfasst: 03.04.2007 11:20
von Kiffi
AND51 hat geschrieben:Hat jemand eine bessere Idee?
Byte durch BT ersetzen und dann ein nachträgliches Replace auf den
gepeekten String (BT zu Byte)? Aber so richtig schick ist das auch nicht...
Grüße ... Kiffi
Verfasst: 05.04.2007 14:06
von HeX0R
z.B. so, wie NTQ und ich es bereits
vor einem Jahr ausgearbeitet haben.
Ist auch noch wesentlich schneller als das hier...
Verfasst: 05.04.2007 14:46
von AND51
Kiffi: Nein, wenn dann würd ich ehere "B " nehmen und RTrim drauf anwenden. Aber egal, solche Methodne sind zu langsam.
@ Hexor: Warum nimmst du den Input als Double entgehen? Quad kann (auch auf die Gefahr hin, mich auf Glatteis zu begeben) einen viel größeren Zahlenbreich fassen.
Und selbst Quad mit seinem Bereich von bis zu 9e+10-1 nur bis EB gehen, das Z und Y sind also überflüssig. Aber interessant deine Lösung!
Verfasst: 05.04.2007 14:51
von HeX0R
AND51 hat geschrieben:
@ Hexor: Warum nimmst du den Input als Double entgehen? Quad kann (auch auf die Gefahr hin, mich auf Glatteis zu begeben) einen viel größeren Zahlenbreich fassen.
Schau mal in Sachen Wertebereich.