byterechner() - Bytes in größtmögliche Einheit umrechnen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Bei mir funktioniert deine Version. Aber warum machst du nicht gleich
Log(1024) statt Log(2)?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich erhalte den gleichen fehler wie karl, geht also bei mir nicht.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

z.B. so, wie NTQ und ich es bereits vor einem Jahr ausgearbeitet haben.
Ist auch noch wesentlich schneller als das hier...
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
Antworten