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? :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.

Re: Größe von 'time_t' ?

Verfasst: 31.08.2014 17:44
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.

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

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

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. :roll: