Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   FileSplitter: Probleme mit großen Dateien (https://www.delphipraxis.net/110825-filesplitter-probleme-mit-grossen-dateien.html)

MrKnogge 29. Mär 2008 15:26

Re: FileSplitter: Probleme mit großen Dateien
 
Ich hab jetzt nochmal etwas nachgesehen, der Fehler kommt aus GetDlgItemInt (Zeile 519).

Luckie 29. Mär 2008 15:45

Re: FileSplitter: Probleme mit großen Dateien
 
Ja, so was habe ich schon vermutet. Bin blos noch nicht dazu gekommen mir das näher anzugucken. Aber die Größe der Zahl aus dem Edit dürfte den Wertebereich vin Integer aber nicht übersteigen.

MrKnogge 29. Mär 2008 15:57

Re: FileSplitter: Probleme mit großen Dateien
 
Ich habs gefunden :wall:
Hätte mir eigentlich auch eher auffallen müssen, gleiches hatte ich nämlich als ich mir die Dummy-Datei zum splitten erzeugt habe.

Mach einfach aus:
Delphi-Quellcode:
SizeOfParts := GetDlgItemInt(hDlg, IDC_EDT_SIZE, Translated, False) * 1024 * 1024;
dies hier:
Delphi-Quellcode:
SizeOfParts := GetDlgItemInt(hDlg, IDC_EDT_SIZE, Translated, False) * 1024;
SizeOfParts := SizeOfParts * 1024;

Luckie 29. Mär 2008 16:02

Re: FileSplitter: Probleme mit großen Dateien
 
Was passiert denn da im Debugger? Und wenn dann würde ich eventuell gleich
Delphi-Quellcode:
SizeOfParts := GetDlgItemInt(hDlg, IDC_EDT_SIZE, Translated, False);
SizeOfParts := SizeOfParts * 1024 * 1024;
das rausmachen. Könntets du das bitte noch mal eben testen?

MrKnogge 29. Mär 2008 16:13

Re: FileSplitter: Probleme mit großen Dateien
 
Diese Variante geht auch. Warum Delphi ein problem dabei hat, verstehe ich auch nicht.
In diesem Fall steht in SizeOfParts die Größe der Parts wie sie im Editfeld steht.

Ich vermute stark, dass Delphi ein Problem beim Multiplizieren von Integer-Konstanten hat.

Folgendes funktioniert nämlich:
Delphi-Quellcode:
SizeOfParts := GetDlgItemInt(hDlg, IDC_EDT_SIZE, Translated, False) * round(1024.0) * round(1024.0);

x000x 29. Mär 2008 18:12

Re: FileSplitter: Probleme mit großen Dateien
 
Moin moin,
Zitat:

Zitat von Luckie
Was passiert denn da im Debugger?

Delphi rechnet standardmäßig mit 32Bit Werten. Da die Funktion GetDlgItemInt einen 32 Bit Wert als
Result liefert und auch alle anderen Multiplikatoren Delphi zu nichts anderem veranlassen,
wird da auch weiter nichts berücksichtigt.
Du kannst es austesten, in dem du direkt den maximalen LongWord Wert anstelle der Funktion GetDlgItemInt
eingibst. Also:
Delphi-Quellcode:
SizeOfParts := 1024*1024*4294967295;
Jetzt "bemerkt" der Compiler den Überlauf und meckert das auch an.

Folgender Code weißt Delphi an, mit 64 Bit zu rechen,
Delphi-Quellcode:
SizeOfParts := Int64(1024)*1024*4294967295;
und voilà es lässt sich kompilieren + das Ergebnis stimmt.

Hier ist jetzt genau ein Wert mit bei, der vom Typ Int64 ist. Somit richtet der Compiler alles auf
64 Bit aus.

Es müsste also theoretisch ausreichen, einen Faktor in Int64 zu casten.

MrKnogge 29. Mär 2008 18:41

Re: FileSplitter: Probleme mit großen Dateien
 
Moin,

die Rechnung lautete zwar 4096 * 1024 * 1024 aber der Hintergrund bleibt ja der gleiche, da die beiden Konstanten im Bereich von 0 bis + ~4,2Mrd liegen nutzt Delphi einen vorzeichenlosen 32Bit Bereich. Ich war bisher immer der Meinung, dass der Compiler sich nach der "Ziel-Variable" richtet.

Luckie 29. Mär 2008 20:17

Re: FileSplitter: Probleme mit großen Dateien
 
Zitat:

Zitat von MrKnogge
Ich war bisher immer der Meinung, dass der Compiler sich nach der "Ziel-Variable" richtet.

Das dachte ich bisher auch, deswegen hatte ich es ja so gemacht nd dem keine weitere Beachtung geschenkt.

Dann besten Dank noch mal fürs testen, Debuggen und Erklären. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz