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.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: Größe von 'time_t' ?

Beitrag 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? :wink:

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:

Code: Alles auswählen

Structure timespec
  tv_sec.i
  tv_nsec.i
EndStructure
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.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Größe von 'time_t' ?

Beitrag von Sicro »

Gute Idee, ts-soft, da bin ich noch nicht draufgekommen :oops: :allright:

dummy wurde davor jeweils auf "33" gesetzt.

Linux 32-Bit:

Code: Alles auswählen

tv_sec:  1409499859
tv_usec: 48972344
dummy:   33
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 :coderselixir:
Wie nun schon von freak bekanntgegeben, ist für beide Variablen Integer richtig.
Zuletzt geändert von Sicro am 31.08.2014 19:03, insgesamt 3-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
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: 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
Zuletzt geändert von SBond am 31.08.2014 17:57, insgesamt 1-mal geändert.
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
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 »

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 :mrgreen: ...ja warum habe ich nicht mal daran gedacht :oops:
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 »

Auf jedenfall freak hat recht und 2x Integer ist richtig. Habs gerade mit Deinem Code getestet.
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 »

super :lol:

nochmals vielen Dank für eure Hilfe <)
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

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.
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 »

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?
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 »

Der Fehler kommt direkt beim Kompilieren. Ob das kompilierte Programm dann abstürzt, weiß ich nicht.
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 »

ok, danke dir.

Werde mir mal CentOS herunterladen. Eventuell bekomme ich es in VirtualBox zum Laufen. :roll:
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
Antworten