Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
25. Jul 2018
Danke für eure Antworten bisher.
Ich habe eine Funktion die eine Datei in Häppchen zerteilt, deren Größe ich bestimmen kann. Dafür ist die ganze Umrechnung die zuvor erwähnt wurde da.
Meine Teilfunktion nimmt UInt64 entgegen.
Wäre es korrekter wenn ich meine ConvertToBytes so abändere, dass Result maximal High(UInt64) betragen kann?
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
25. Jul 2018
ddd
Vor 10 Jahren waren TB für Privatanwender undenkbar, so Dinge ändern sich. Außerdem: Das ist schlechter Stil. Das macht man einfach nicht.
Wie verhindere ich sonst das angesprochene Problem?
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
25. Jul 2018
Vielleicht ist es so klarer.
Ich habe einen numerischen Wert und die Zusatzinformation, ob das B, KiB, MiB, GiB oder TiB sein sollen.
Rufe ich meine (umbenannte) Funktion nun so auf, erhalte ich 46080 Bytes.
type
TFileSizes = (_B, _KiB, _MiB, _GiB, _TiB, _PiB);
Ausgabe := ConvertToBytes(45, _KiB);
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
25. Jul 2018
Das funktioniert perfekt!
function ConvertBytes(Bytes: UInt64; Multiplier: Integer): UInt64;
const
// When the calculated filesize is bigger than MaxSize, than normalise it to MaxSize.
// I think nobody (not a "normal" person) would ever create a file bigger than 1 EiB
MaxSize: UInt64 = 1152921504606847000; // 1 EiB
begin
if Multiplier> 0 then
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Ich habe meine Funktion jetzt angepasst. Maximaledateigröße 16 EiB minus 1 KiB. Laut Wikipedia die größte zulässige Dateigröße unter NTFS.
Die Funktion funktioniert soweit ganz gut und macht genau was ich brauche.
function CalculateSize(Bytes, Multiplier: UInt64): UInt64;
const
MaxSize: UInt64 = 18446744073709551615 - 1024; // 16 EiB - 1 KiB
var
dTmp: Double;
begin
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Weil die Funktion der ich das Ergebnis übergebe Int64 erwartet.
Das Ergebnis darf maximal so groß sein wie die maximale Dateigröße unter NTFS. Also 16 TiB.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
So sieht mein Versuch aus. Alles was über 1 TiB hinaus geht, kann ich verwerfen.
function CalculateSize(Bytes, Multiplier: Int64): UInt64;
const
MaxSize: Int64 = 1099511627776; // 1 TiB
var
dTmp: Double;
begin
if Multiplier > 0 then
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Vielleicht helfe ich euch und auch mir, wenn ich mein Problem erkläre.
Ich habe ein TEdit sowie eine TComboBox. Im Edit kann ich eine Zahl eingeben und in der ComboBox kann ich von Byte bis Gigabyte alles auswählen.
Die eingegebene Zahl soll später in das umgerechnet werden, was ich in der ComboBox ausgewählt habe. Das schaffe ich. Aber wie außer mit try except fange ich Fehleingaben ab, sodass...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Würde ein Hardcast auf Int64 die Zahl verkleinern und keinen Fehler mehr erzeugen?
Schematisch
I := Int64(1024^7);
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Ich bin mir unsicher aber ich glaube I := Round(System.Math.Power(1024, 7)) funktioniert nicht, selbst wenn I Int64 ist.
Der Fehler lautet
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Funktioniert sehr gut. Mit Int64 sollte ich eigentlich keine Grenzen sprengen können.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Wenn ich Doubvle verwende bekomme ich an anderen Stellen Probleme wo ich Integer-Variablen verwende.
Was ist denn hiermit?
I := Round(Power(1024, 3));
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Dann bekomme ich
Inkompatible Typen: 'Integer' und 'Single'
Forum: Algorithmen, Datenstrukturen und Klassendesign
by DieDolly,
24. Jul 2018
Ich möchte gerne Byte in MB, GB usw umrechnen. In einer Variablen steht drin, wie oft *1024 gerechnet werden muss. Da dachte ich kann ich doch gut Power nutzen
var I: Integer;
I := Power(1024, 3); // I := (1024 * 1024 * 1024)
Der Fehlter lautet Inkompatible Typen: 'Integer' und 'Extended'
Wie bekomme ich diesen Fehler weg? Oder gibt es eine andere Möglichkeit um die Schreibweise...