Seite 3 von 4
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 17:41
von freak
Ich finde diese Experimente ja sehr amüsant, aber wenn ihr es genau wissen wollt warum fragt ihr nicht einfach den C compiler?
Code: Alles auswählen
#include <stdio.h>
#include <time.h>
int main()
{
struct timespec t;
printf("SizeOf(timespec) = %d, OffsetOf(timespec\\tv_nsec) = %d\n", (int)sizeof(t), (int)((char *)&(t.tv_nsec) - (char *)&t));
return 1;
}
Ubuntu 14.4:
x86: SizeOf(timespec) = 8, OffsetOf(timespec\tv_nsec) = 4
x64: SizeOf(timespec) = 16, OffsetOf(timespec\tv_nsec) = 8
Demnach ist das hier richtig:
Da die genaue Definition nicht standardisiert ist könnte es natürlich bei einem anderen Linux anders sein, aber im Sinne der Portierbarkeit wird warscheinlich kaum eine Distribution davon abweichen.
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 17:44
von Sicro
Gute Idee, ts-soft, da bin ich noch nicht draufgekommen
dummy wurde davor jeweils auf "33" gesetzt.
Linux 32-Bit:
Linux 64-Bit:
Code: Alles auswählen
tv_sec: 1409499999
tv_usec: 300502151
dummy: 0 ; <<< wurde überschrieben
Edit:
dummy musste natürlich vorher auf einen Wert gesetzt werden

Wie nun schon von freak bekanntgegeben, ist für beide Variablen Integer richtig.
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 17:49
von SBond
ts-soft hat geschrieben:
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.
Natürlich

. Ich meinte nur im Zusammenhang mit Strukturen für APIs. Hab im letzten Post die Info ausgelassen... sorry.
Die Idee mit der VM kam mir auch, allerdings habe ich Probleme mit der Hardware-Leistung meines PCs. Meine RAM-Auslastung ist meist schon im 2/3-Bereich und eine VM sorgt dann für eine unschöne RAM-Auslagerung. Bin nicht sicher, ob 1GB RAM für eine Linux-VM ausreicht.
hier mal der extrahierte Code: Es soll einen Zeitstempel in Nanosekunden zurückgeben (für Zeitmessung). Auf Windows und Mac klappt es ganz gut. Bei Linux ist das Ergebnis von der Dimensionierung der Struktur abhängig.
Code: Alles auswählen
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
#CLOCK_MONOTONIC_RAW = 4
Structure timespec
tv_sec.i ; die aktuelle Zeit in Sekunden
tv_nsec.i ; die aktuellen Nanosekunden der aktuell laufenden Sekunde (quasi die ganzen Nachkommastellen)
EndStructure
ImportC ""
clock_gettime.i(clock_id.i, *tp.timespec) ; aktuelle Zeit ermitteln
EndImport
CompilerCase #PB_OS_MacOS
ImportC ""
mach_absolute_time.q() ; aktuelle Zeit in Nanosekunden (seit Systemstart)
EndImport
CompilerEndSelect
Procedure.q gebe_Nanosek()
Protected qTimer_Ticks.q = 0
Protected qTimer_Frequenz.q = 0
Protected qZeitstempel_nano.q = 0
; Auswahl des Betriebssystems
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
If ((QueryPerformanceFrequency_(@qTimer_Frequenz) <> 0) And (QueryPerformanceCounter_(@qTimer_Ticks) <> 0))
qZeitstempel_nano = (qTimer_Ticks * 1e9) / qTimer_Frequenz
EndIf
CompilerCase #PB_OS_Linux
Protected Zeitstempel.timespec
If (clock_gettime(#CLOCK_MONOTONIC_RAW, @Zeitstempel) = 0) ; 0: OK, -1: Fehler
qZeitstempel_nano = (Zeitstempel\tv_sec * 1e9) + Zeitstempel\tv_nsec
EndIf
CompilerCase #PB_OS_MacOS
If (Aufloesung\numer <> 0)
qZeitstempel_nano = mach_absolute_time()
EndIf
CompilerEndSelect
ProcedureReturn qZeitstempel_nano
EndProcedure
qWert_1.q = gebe_Nanosek()
Delay(20)
qWert_2.q = gebe_Nanosek()
Debug "Wert 1: " + Str(qWert_1)
Debug "Wert 2: " + Str(qWert_2) + #CRLF$
Debug "Differenz: " + StrD((qWert_2 - qWert_1)/1e6,6) + " ms"
Edit: Code angepasst an Integer
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 17:56
von SBond
freak hat geschrieben:
Code: Alles auswählen
int main()
{
struct timespec t;
printf("SizeOf(timespec) = %d, OffsetOf(timespec\\tv_nsec) = %d\n", (int)sizeof(t), (int)((char *)&(t.tv_nsec) - (char *)&t));
return 1;
}
... oh nein

...ja warum habe ich nicht mal daran gedacht

Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 18:01
von ts-soft
Auf jedenfall freak hat recht und 2x Integer ist richtig. Habs gerade mit Deinem Code getestet.
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 18:05
von SBond
super
nochmals vielen Dank für eure Hilfe

Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 18:28
von ts-soft
@SBond
PS: Unter CentOS 6.5 läuft der Code nicht, kann so nicht importiert werden. Das wird wahrscheinlich
alle RedHeat ähnlichen Distributionen betreffen. Ansonsten läuft es anscheinend unter jeder anderen
Distribution.
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 18:49
von SBond
danke für die Info
kommt der Fehler direkt beim Kompilieren? Wenn ja..., was würde theoretisch passieren, wenn man eine kompilierte Datei ausführt? Stürzt das Programm direkt ab?
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 19:03
von ts-soft
Der Fehler kommt direkt beim Kompilieren. Ob das kompilierte Programm dann abstürzt, weiß ich nicht.
Re: Größe von 'time_t' ?
Verfasst: 31.08.2014 19:32
von SBond
ok, danke dir.
Werde mir mal CentOS herunterladen. Eventuell bekomme ich es in VirtualBox zum Laufen.
