Größe von 'time_t' ?

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Größe von 'time_t' ?

Beitrag von Sicro »

Ich habe jetzt mal kurz die Structure mit verschiedenen Typ-Zuweisungen unter 32- und 64-Bit Linux getestet.

Test-Code:

Code: Alles auswählen

Structure timeval
  tv_sec.l
  tv_usec.l
EndStructure

Structure timeval2
  tv_sec.l
  tv_usec.q
EndStructure

Structure timeval3
  tv_sec.q
  tv_usec.l
EndStructure

Structure timeval4
  tv_sec.q
  tv_usec.q
EndStructure

ImportC ""
  clock_gettime.i(clock_id.i, *tv)
EndImport

Debug "; tv_sec.l und tv_usec.l:"
clock_gettime(0, @time.timeval)
Debug "tv_sec:  " + Str(time\tv_sec)
Debug "tv_usec: " + Str(time\tv_usec)

Debug "; tv_sec.l und tv_usec.q:"
clock_gettime(0, @time2.timeval2)
Debug "tv_sec:  " + Str(time2\tv_sec)
Debug "tv_usec: " + Str(time2\tv_usec)

Debug "; tv_sec.q und tv_usec.l:"
clock_gettime(0, @time3.timeval3)
Debug "tv_sec:  " + Str(time3\tv_sec)
Debug "tv_usec: " + Str(time3\tv_usec)

Debug "; tv_sec.q und tv_usec.q:"
clock_gettime(0, @time4.timeval4)
Debug "tv_sec:  " + Str(time4\tv_sec)
Debug "tv_usec: " + Str(time4\tv_usec)
32-Bit:

Code: Alles auswählen

; tv_sec.l und tv_usec.l:
tv_sec:  1409419167
tv_usec: 596094686

; tv_sec.l und tv_usec.q:
tv_sec:  1409419167
tv_usec: 596112620

; tv_sec.q und tv_usec.l:
tv_sec:  2560310154939729823
tv_usec: 0

; tv_sec.q und tv_usec.q:
tv_sec:  2560340176761128863
tv_usec: 0
64-Bit:

Code: Alles auswählen

; tv_sec.l und tv_usec.l:
tv_sec:  1409419239
tv_usec: 0

; tv_sec.l und tv_usec.q:
tv_sec:  1409419239
tv_usec: 3340233608408334336

; tv_sec.q und tv_usec.l:
tv_sec:  1409419239
tv_usec: 777717368

; tv_sec.q und tv_usec.q:
tv_sec:  1409419239
tv_usec: 777725751
Demzufolge ist folgende Structure korrekt:

Code: Alles auswählen

Structure timeval
  tv_sec.i  ; Integer
  tv_usec.l ; Long
EndStructure
Als Clock-ID habe ich hier "0" gewählt, da die #CLOCK_"-Konstanten in Purebasic nicht vordefiniert sind und ich jetzt nicht noch die Werte heraussuchen wollte. Das wird den Test aber sicherlich nicht verfälscht haben.
Zuletzt geändert von Sicro am 31.08.2014 13:37, insgesamt 1-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
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

Re: Größe von 'time_t' ?

Beitrag von ts-soft »

Leider "falsche" Strukture getested!
Es geht ja um diese hier:

Code: Alles auswählen

    struct timespec
       {
          time_t   tv_sec;   /* seconds *
          long     tv_nsec;  /* nanoseconds *
       }
Da ist es genau umgekehrt, also tv_sec.i und tv_nsec.l
Wenn jetzt tv_sec.i verkehrt ist, unter 64-Bit, dann kommt der Fehler, bzw. nicht.

Bei Deiner Strukture ist es nicht so schlimm, wenn die zu groß ist.
Wenn Du das auch noch testen könntes?

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
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Größe von 'time_t' ?

Beitrag von NicTheQuick »

SBond hat geschrieben:meinst du diesen?: http://www.purebasic.fr/german/viewtopi ... 12#p325012
Genau. Danke.
Und zwar findet man diese Struktur bei Linux unter dem Pfad "/usr/include/x86_64-linux-gnu/bits/time.h". Zusammen mit "/usr/include/x86_64-linux-gnu/bits/types.h" und "/usr/include/x86_64-linux-gnu/bits/typesizes.h" kann man den Typ so rekonstruieren wie ich das getan habe. In "typesizes.h" wird auch unterschieden welche Architektur (32, 64 Bit) benutzt wird und entsprechend getypt.
Siehe hier:

Code: Alles auswählen

#if defined __x86_64__ && defined __ILP32__
# define __SYSCALL_SLONG_TYPE	__SQUAD_TYPE
# define __SYSCALL_ULONG_TYPE	__UQUAD_TYPE
#else
# define __SYSCALL_SLONG_TYPE	__SLONGWORD_TYPE
# define __SYSCALL_ULONG_TYPE	__ULONGWORD_TYPE
#endif
Bei 64-Bit-Systemen wird sozusagen das Äquivalent zu Integer in PB genommen und bei 32-Bit-Systemen wird Quad genommen. Also sollte unsere time-Struktur immer Quad sein. Außer ihr habt veraltete Includes bzw. Systeme.
Bild
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35
Computerausstattung: armseliger Laptop, mit wenig RAM und noch weniger CPU-Leistung. ...und die Grafikkarte.... ....naja.. da male ich doch lieber selber.
Wohnort: nahe Wolfsburg

Re: Größe von 'time_t' ?

Beitrag von SBond »

cool. Danke für die Infos :)

dann müsste es so aussehen...

Code: Alles auswählen

   Structure timespec
      tv_sec.q
      tv_nsec.l
   EndStructure
Werde es morgen mal Testen, wenn ich wieder zu Hause bin. Da habe ich ein Linux (x86).
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Größe von 'time_t' ?

Beitrag von Sicro »

ts-soft hat geschrieben:Leider "falsche" Strukture getested!
Es geht ja um diese hier:

Code: Alles auswählen

    struct timespec
       {
          time_t   tv_sec;   /* seconds *
          long     tv_nsec;  /* nanoseconds *
       }
Da ist es genau umgekehrt, also tv_sec.i und tv_nsec.l
[...]
Wenn Du das auch noch testen könntes?
Mit meinem Code habe ich doch alle Varianten getestet - auch die umgekehrte. Die "timespec"- ist identisch mit der "timeval"-Structure. Bei der timeval-Structure sind es nur stattdessen bei der zweiten Variable Mikrosekunden.

Du hast allerdings Recht, bei der endgültigen Structure, die müsste umgekehrt sein (ich habe es auch oben geändert):

Code: Alles auswählen

Structure timeval
  tv_sec.i  ; Integer
  tv_usec.l ; Long
EndStructure
und nicht, wie ich es zuvor hatte: tv_sec.l (Long) und tv_usec.i (Integer). Bei 64-Bit habe ich mich von der größeren Zahl täuschen lassen und habe deshalb diese als die Richtige gewählt. Betrachtet man die anderen tv_usec-Werte kann der Wert jedoch nicht korrekt sein, da die größere Zahl mit "334" anfängt und die anderen zwei mit "777" anfangen.
NicTheQuick hat geschrieben:Also sollte unsere time-Struktur immer Quad sein.
Unter 32-Bit bekommt man dann aber so was:

Code: Alles auswählen

; tv_sec.q und tv_usec.l:
tv_sec:  2560310154939729823
tv_usec: 0 ; Null?
Hm...
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
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

Re: Größe von 'time_t' ?

Beitrag von ts-soft »

@sirco
Da das ganze Umgekehrt ist, kommen doch ganz andere Ergebnisse unter 64-Bit :mrgreen:
Da wäre es interessant, ob dort bei time_nsec das richtige Ergebnis ankommt oder
time_sec überschrieben wird.

@NicTheQuick
2x quad glaub ich nicht, jedenfalls nicht bei dieser Strukture, aber die sind sich alle so ähnlich :mrgreen:

1, 2 oder 3, wer jetzt Recht hat, zeigt das Licht. Auf jedenfall sind dies die Dinge, die C so unpraktisch
machen.
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
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35
Computerausstattung: armseliger Laptop, mit wenig RAM und noch weniger CPU-Leistung. ...und die Grafikkarte.... ....naja.. da male ich doch lieber selber.
Wohnort: nahe Wolfsburg

Re: Größe von 'time_t' ?

Beitrag von SBond »

ts-soft hat geschrieben:Auf jedenfall sind dies die Dinge, die C so unpraktisch machen.
...naja zumindest, wenn man diese Funktionen in PB importiert. <)

Ich habe diese Struktur unter Linux Mint x86 gestestet:

Code: Alles auswählen

   
Structure timespec
      tv_sec.q
      tv_nsec.l
   EndStructure
das geht auf jeden Fall nicht. tv_sec wird riesig und tv_nsec wird null. Als Long oder Interger geht es. Ein x64-System habe ich allerdings nicht um es zu testen. Das große Struktur-Rätsel :mrgreen:. Ich werde tv_sec wohl erstmal als Long deklarieren. Integer verwende ich eigentlich sehr ungerne, da die Größe abhängig von der Architektur ist und in genau solchen Fällen Probleme verursachen kann.
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
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

Re: Größe von 'time_t' ?

Beitrag von ts-soft »

SBond hat geschrieben:Integer verwende ich eigentlich sehr ungerne, da die Größe abhängig von der Architektur ist und in genau solchen Fällen Probleme verursachen kann.
Hä, ist doch toll, das die Variable sich der Architektur anpasst. Außerdem ist das die "gebräuchlichste" Variable,
jedenfalls für handle, pointer usw.

Warum installierst Du dir keine 64-Bit Linux z.B. unter VirtualBox?
Ansonsten mußte mal Code posten, den ich testen kann.

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
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Größe von 'time_t' ?

Beitrag von Sicro »

ts-soft hat geschrieben:@sirco
Da das ganze Umgekehrt ist, kommen doch ganz andere Ergebnisse unter 64-Bit :mrgreen:
Da wäre es interessant, ob dort bei time_nsec das richtige Ergebnis ankommt oder
time_sec überschrieben wird.
Also, wenn man die Werte oben zwischen 32- und 64-Bit Linux vergleicht, kommen die mit meiner aktuellen Structure sehr nahe, daher halte ich diese für die Richtige:

Code: Alles auswählen

 Structure timeval
  tv_sec.i  ; Integer
  tv_usec.l ; Long
EndStructure
Nur, wenn die Structure-Beschreibung auch nicht mehr stimmen sollte, stellt sich die Frage, ob die zweite Variable vielleicht immer Long, immer Quad oder Integer (32-Bit: Long, 64-Bit: Quad) sein müsste. Bei Codes im Forum benutzen ja manche für beide Variablen Integer. Notfalls könnte man da aber einfach immer Quad nehmen.
SBond hat geschrieben:tv_sec wird riesig und tv_nsec wird null.
So ist es auch bei mir, wie oben im Test zu sehen.
SBond hat geschrieben:Ein x64-System habe ich allerdings nicht um es zu testen.
Ich denke nicht, dass das Ergebnis anders sein wird, als bei mir. Siehe ebenfalls oben bei 64-Bit.
Zuletzt geändert von Sicro am 31.08.2014 17:36, insgesamt 1-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
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

Re: Größe von 'time_t' ?

Beitrag von ts-soft »

Zum Testen solltet ihr aber solch eine Strukture verwenden:

Code: Alles auswählen

Structure timespec
  tv_sec.i
  tv_nsec.l
  dummy1.q
EndStructure
Das auf 0 testen ist ja gut, aber das andere ende solltest ihr auch auf 0 testen.
Und dann wird alles gut :)
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
Antworten