riesengroße Zahlen in einem 32-Bit System



  • Hallo,

    ich brauche seeeeeehr große Zahlen für mein Qt-Programm um groooooße Dateien sehr genau zu Adressieren (viele Gb).

    Habe qint64 verwendet, allerdings kommt es bei ~2,1Gb immer zu einem Überlauf. Nach 2138850800 kommt wenn ich ein Stück weitergehe gleich -2141159488.

    In der Doku steht, dass es bis 932838457459459 geht.(~900Petabyte, das würd mir reichen)
    Allerdings steht auch in der Doku:

    This type is guaranteed to be 64-bit on all platforms supported by Qt.

    und ich denke er macht bei 2Gb Schluss weil ich ein 32-Bit System verwende^^

    Wie kann ich denn trotzdem so große Zahlen verwenden?



  • das wundert mich ein wenig. Vor allem, da selbst bei einer vorzeichenbelasteten 32 Bit Zahl der Bereich von -2147483648 bis 2147483647 gehen sollte

    Welchen Compiler verwendest du bzw mit welchem qmakespec wurde qt kompiliert?



  • zwutz schrieb:

    das wundert mich ein wenig. Vor allem, da selbst bei einer vorzeichenbelasteten 32 Bit Zahl der Bereich von -2147483648 bis 2147483647 gehen sollte

    Welchen Compiler verwendest du bzw mit welchem qmakespec wurde qt kompiliert?

    Ich verwende Qt-Creator 4.5 von der nokiaseite mit der standard sdk.
    Die werte die du geschrieben hast stimmen natürlich, ich konnte nur nicht so genau scrollen, weil ich die Werte an einer Scrollbar hatte 😉

    Ich will halt weiterhin qint64 verwenden, weil ich die Methode QIODevice::seek ( qint64 pos ) verwende.

    Ich habe mal Testweise folgendes ausprobiert:

    datei.seek(7138850800 );
    

    und da kriege ich den Fehler

    error: integer constant is too large for "long" type

    obwohl die Zahl "7138850800" locker in qint64, also 2^64 reinpassen sollte. Die Zahl liegt bei ungefähr ~7GB und 2^64 passen wie gesagt mehrere hundert petabyte an adressierungsmöglichkeiten.

    Wofür ich das brauche:
    ich möchte zum Beispiel bei einer 50GB großen Datei einen 1kb großen Teil bei 40Gb auslesen. (hoffe man kann das nachvollziehen). Ich will nicht die komplette Datei auslesen, sondern nur einen winzigst kleinen Teil, aber halt so weit hinten in der Datei. Das hat perfekt funktioniert, aber halt nur bis 2Gb!
    Für das Beispiel oben hab ich mir vorgestellt, dass ich datei.seek(400000000000) mache und mit einer forschleife einen kleinen Teil auslesen. Dummerweise meckert mein Compiler und sagt mir, dass so ne zahl (in dem Fall 40*1000^3=Adressierung bei 40Gb) in qint64 nicht reinpasst, obwohl es eigtl gehen sollte!
    Wie gesagt, ich denke es liegt daran, dass ich ein 32-Bit System verwende und da dieses doofe qint64 da nicht richtig funktioniert. suche jetzt nach Lösungsmöglichkeiten.
    Habe auch schon überlegt eine BigInt-Bibliothek zu verwenden, allerdings könnte ich dann seek(qint64) nicht mehr benutzen und das brauche ich!
    War sogar schon so verzweifelt und hab mir überlegt, ob ich die Methode für QFile nicht überlade mit BigInt, allerdings verwendet die vieeele Klassen und übergibt überall ein qint64 weiter und dann müsste ich seeeehr viele Qt-Klassen überladen.

    Hoffe ich konnte mein Problem jetzt verdeutlichen.



  • Dein Compiler ist offensichtlich der Meinung, dass seek einen long fordert. Wenn das die richtige Methode ist (davon muss man mal ausgehen), dann könnte das bedeuten, dass dein QT long für einen 64bit-Typen hält und irgendwo einen typedef long qint64; hat. Das stimmt aber für dein System nicht. Benutzt du eine Plattform, die QT nur so lala unterstützt? Oder ist bei der Installation irgendwas schiefgegangen?



  • Bashar schrieb:

    Dein Compiler ist offensichtlich der Meinung, dass seek einen long fordert.

    Ich habe Qt an meinem Arbeitspc und an meinem Privatlaptop installiert und es ausprobiert. (Windows XP und Windows7, beides 32bit)
    Das seek ist IMO nicht der problemherd,sondern das qint64.
    auch

    qint64 test = 7138850800;
    

    führt zu dem oben genannten fehler.

    Bashar schrieb:

    Wenn das die richtige Methode ist (davon muss man mal ausgehen), dann könnte das bedeuten, dass dein QT long für einen 64bit-Typen hält und irgendwo einen typedef long qint64; hat. Das stimmt aber für dein System nicht.

    Wo könnte ich das finden, bzw wie kann ich das beheben?

    Bashar schrieb:

    Benutzt du eine Plattform, die QT nur so lala unterstützt? Oder ist bei der Installation irgendwas schiefgegangen?

    Bei der Installation gabs keine Probleme



  • Schau mal hier:
    http://qt.nokia.com/doc/4.0/qtglobal.html#qint64-typedef

    Benutz mal dieses Makro, vielleicht hilft das. Dann wäre die Ursache, dass der Compiler ein 64-Bit-Literal ohne angehängtes Suffix (kenn ich jetzt nicht für Windows' _int64, für long long wäre es das Suffix LL) nicht erkennt und ohne Warnung runterkonvertiert.


Anmelden zum Antworten