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 :wink:

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? :mrgreen:

Da ich abrunde, brauche ich das eh nicht, Beweis:

Code: Alles auswählen

a.l=5.9
Debug a ; ergibt 5
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 :D
'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 :lol:


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.