Gelöst - kein Bug: Bug in Date()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Gelöst - kein Bug: Bug in Date()

Beitrag von margro »

Hallo Fans von PB,

mir ist in der Date()-Bibo etwas mysteriöses aufgefallen:
Wenn ich zum 01.01.1901 vier Tage hinzu addiere, dann wird mir der 10.02.2037 angezeigt:

Code: Alles auswählen

date = Date(1901, 1, 1, 0, 0, 0)
Debug FormatDate("%dd.%mm.%yyyy", AddDate(date, #PB_Date_Day, 4))
Stelle ich das Jahr 1902 ein, dann komme ich richtigerweise auf den 05.01.1902.

Könnt Ihr das so reproduzieren?
Ich arbeite mit PB 6.12 32-Bit unter Windows 11 x64.

// Verschoben aus "Bugs" zu "Allgemein" (Kiffi)
Zuletzt geändert von margro am 15.02.2025 20:22, insgesamt 1-mal geändert.
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Bug in Date()

Beitrag von margro »

Das Problem scheint gelöst: Für Integer einfach Quad angeben (date.q)!
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Bug in Date()

Beitrag von Macros »

Exakt. steht auch so in der Hilfe:

Code: Alles auswählen

Datumswert.q = Date([Jahr, Monat, Tag, Stunde, Minute, Sekunde])
Als kurze Erklärung: Man hat sich irgendwann man darauf geeinigt die Unix Zeit zu verwenden. Sekunden ab dem 01.01.1970.
Deine Zuweisung sieht also in etwa so aus:

Code: Alles auswählen

date = -2177452800
Eine 32 bit Integer (long) geht aber nur bis -2147483648 (siehe Hilfe)

Du hast also einen Overflow, und kommst damit auf wieder auf einen positiven 32 bit Wert. (2037 ist nahe am gefürchteten Jahr 2038, wo die obere Grenze ist) Mit der Quad bist du das Problem los, weil der Zahlenbereich viel größer ist.

Zwei Tipps:
- Rückgabetypen sind wichtig, immer einen Moment überlegen ob der Variablentyp oder der Rückgabetyp bei einer eigenen Prozedur passt.
- Man neigt sehr flott dazu ein Problem auf einen Bug zu schieben, wenn man sich mal verrannt hat. Das musste ich mir erst beibringen dann lieber noch 3 mal zu schauen, oder Rubberducky Debugging anzuwenden (Dadurch kann meine Frau nun auch programmieren :mrgreen: ). Auch wenn es natürlich manchmal doch ein echter Bug ist.

Aber super wie schnell du die Lösung selbst gefunden hast :)
Bild
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

Re: Bug in Date()

Beitrag von NicTheQuick »

Warum nutzt du überhaupt Purebasic in der 32-Bit-Version, wenn heutzutage nirgends mehr ein 32-Bit Windows genutzt wird.
(Ausgenommen im industriellen Umfeld vielleicht, wo immer noch Windows-Leichen in Verwendung sind)
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Bug in Date()

Beitrag von margro »

Hallo Macros, vielen Dank für die tolle Erklärung!

Hallo NicTheQuick, ich weiß es selber nicht mehr so genau, weil ich von Anbeginn die 32er Version nutze und die damit erstellten Anwendungen auch auf 64er Systemen laufen. Aber Du hast mich auf jeden Fall dazu angeregt, mal über einen Wechsel zur 64er Version nachzudenken - ich werde es mal testen.
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bug in Date()

Beitrag von mk-soft »

Denk aber daran das bei x64 alte Codes die Variablen für Handle, Pointer und ID's von Long (.l) auf Integer (.i) umzustellen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
margro
Beiträge: 19
Registriert: 17.07.2024 14:25

Re: Bug in Date()

Beitrag von margro »

Danke für den Hinweis, mk-soft! Wer noch was beisteuern kann - immer her damit!
PureBasic 6.12 LTS (x64) * Windows 11 (x64)
Antworten