Autor |
Beitrag |
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 17:00
Mathematiker hat folgendes geschrieben : |
Da Du offensichtlich meine Beiträge ignorierst, klinke ich mich hier aus.
Beste Grüße
Mathematiker |
du versucht mich "umzuprogrammieren" nicht die Frage zu beantworten !
Ich möchte den Quelltext nicht ändern, sondern wissen warum die Rundung nicht stimmt... sonst müsste
Copy(T, 0, Pos(',', T)-1) bei T='3,161' eigentlich 3 ergeben und nicht 300 !
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 17:11
Hallo,
also ich habe noch einmal
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Timer1Timer(Sender: TObject); var T: String; begin T := FloatToStr( ((Now-NL)*24*60*60) ); memo1.lines.add(T); T := 'FpS: '+ FloatToStr( 1/((Now-NL)*24*60*60) ); memo1.lines.add(T); T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) )); memo1.lines.add(T); NL := Now; timer1.enabled:=false; end; |
mit einem Timerinterval = 1 und dem Start mit einem Buttonclick getestet. Ich erhalte auf meiner alten Mühle
Quelltext 1: 2: 3:
| 0,0160002149641514 FpS: 62,4991603075651 FpS: 62 |
und immer wieder ähnliche Werte, d.h., es wird vollkommen richtig gerundet. Hast Du nach der Anzeige den Timer deaktiviert?
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Di 09.04.13 17:14, insgesamt 1-mal bearbeitet
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 09.04.13 17:13
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 17:35
Um zu zeigen, dass nicht die ProgrammierART sondern Delphi einen Felder macht folgendes:
T := 'FpS: '+ FloatToStr( ( 1 / ((Now-NL)*24*60*60) )); //= 9.1
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )); //= 91
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/1);//= 91
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/10); //=0.9
wenn round funktionieren würde, dann müsste wenn X/1 =91 x/10 =9.1 sein und nicht 0.9 !
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 17:37
Wie sollen wir das nachvollziehen, wenn Du immer wieder auf now und nl zureifst, deren Werte wir nicht kennen?
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 18:11
ich habe jetzt jede zeile für zeile "rausgenomen" (mit {}) und getestet, wann ein richtiges Ergebnis kam, und wann nicht..
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure DoIt; begin T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) )); NL := Now; end; |
Wunder:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if FesteFpS then begin if TryStrToFloat(FpSRate.Text, C) then if ( (Now-NL)*24*60*60*C > 1 ) then DoIt; end else begin DoIt; end; |
Hier kam 91 raus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if FesteFpS then begin if TryStrToFloat(FpSRate.Text, C) then if ( (Now-NL)*24*60*60*C > 1 ) then DoIt; end else begin end; |
Hier kam 9 raus (richtige)
Das Ergebnis war immer falsch, wenn festeFpS True war und DoIt bei if not FresteFpS then ausgeführt wurde... bei False kam ein richtiges Ergebnis raus bzw. wenn vor dem 2ten DoIt ein //stand gab es keinen Fehler... wisst ihr warum?
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 18:16
Hallo,
IhopeonlyReader hat folgendes geschrieben : | wenn round funktionieren würde, dann müsste wenn X/1 =91 x/10 =9.1 sein und nicht 0.9 ! |
Also. Ich habe Deine Anweisungen im Timer(!) getestet. Ergebnis
Quelltext 1: 2: 3: 4:
| T := 'FpS: '+ FloatToStr( ( 1 / ((Now-NL)*24*60*60) )); //= FpS: 62,4991603075651 T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )); //= 62 T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/1);//= 62 T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/10); //=6,2 |
D.h., es wird richtig gerundet.
Irgendwie habe ich den Eindruck, dass Dein Delphi "eine Meise" hat.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 18:19
Mathematiker hat folgendes geschrieben : |
Irgendwie habe ich den Eindruck, dass Dein Delphi "eine Meise" hat.
|
jap
wenn ich es so schreibe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if FesteFpS then begin if TryStrToFloat(FpSRate.Text, C) then if ( (Now-NL)*24*60*60*C > 1 ) then DoIt; end else begin DoIt; end; |
und mit F9 kompiliere, zeigt er 91 an
ABER !!!!!!!!!!
kompiliere ich mit F8 und drücke dann zur Laufzeit F9, so zeigt er 9 (richtig!) an....
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 09.04.13 18:34
An dieser Stelle schlage ich vor, du zeigst mal komplette Quelltexte, sonst wird das hier nichts mehr. Am besten minimalisiert auf den Fehler.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 18:35
Das klingt nach irgend einem Seiteneffekt. Genaueres dazu kann man aber mangels Source nicht sagen.
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 18:51
Boldar hat folgendes geschrieben : | An dieser Stelle schlage ich vor, du zeigst mal komplette Quelltexte, sonst wird das hier nichts mehr. Am besten minimalisiert auf den Fehler. |
Der Quelltext 3 Posts vor deinem ist alles.. alle andere hatte ich in {}... außer du willst noch sowas wie
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Timer1Timer(Sender: TObject); begin end; |
dann sähe das so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; FesteFpS: TCheckBox; FpSRate: TEdit; procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; NL: TDateTime;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); var T: String; C: Extended; procedure DoIt; begin T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) )); NL := Now; end; begin if FesteFpS.Checked then begin if TryStrToFloat(FpSRate.Text, C) then if ( (Now-NL)*24*60*60*C > 1 ) then DoIt; end else begin DoIt; end; Canvas.TextOut(10, ClientHeight-Canvas.TextHeight(T), T); end;
end. |
Form besteht aus:
Timer1: TTimer; //Interval ist 1, er ist von anfang an Enabled := True
FesteFpS: TCheckBox;// Halt an und ausmachbar (von anfang an aus)
FpSRate: TEdit; //steht von anfang an 1 drin
Hierbei ensteht ein der Fehler... starte ich mit F8 und danach F9 funktioniert alles.. aber direkt F9 ist ein Fehler...
Wenn ich mit F8 zuerst gestartet habe, es dann klappt, dann Die Zahl im Edit größer als 70 wird, ist die angezeigte Zahl 66.. gehe ich nun wieder auf eine kleinere zahl z.B. 1, so wird die zahl 17 angezeigt.... (anstatt 1)
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 19:15
Dann versuch doch erst einmal das, was ich vorher schon vorgeschlagen hatte (NOW ändert sich schließlich ständig):
Zitat: | Speicher doch zunächst Now() einmal in einer Variablen zwischen und benutz dann die zur Berechnung. Dann schreibe Dir eine Funktion für die Ermittlung der Sekunden und benutze diese. Deren Ergebnis wird dann gerundet. |
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 09.04.13 19:47
Ich habe nun - bis auf die Prozedur TryStrToFloat, die ich durch einen Try .. except .. end-Konstrukt ersetzt habe, die Timerroutine geprüft. Es kommen bei mir keine Fehler beim Runden. 100,1 ergibt 100 und 50,56 ergibt 51.
Selbst wenn ich statt NL := now; schreibe: NL := now - 0.12/24/60/60, was ja bei der Differenz dann immer dazu führt, dass scheinbar eine Differenz von 0.12 Sekunden mindestens auftreten, wird korrekt gerundet (entwerder ist das Ergebnis 7 oder 8.
P.S. ich habe die Differenz NOW - NL und den ungerundeten Wert 1/((Now-NL)*86400) in T ausgegeben, und die gerundeten Werte stimmen immer!!!!
Ich weiß ehrlich nicht, wo der Fehler noch stecken soll.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 09.04.13 20:20
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 09.04.13 20:26
Warum nicht gettickcount?
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 09.04.13 20:28
Boldar hat folgendes geschrieben : | Warum nicht gettickcount? |
TimeGetTime hat eine höhere Auflösung.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 09.04.13 20:35
Dann halt Queryperformancecounter. Btw. hat Timegettime nicht unbedingt eine höhere Präzision, und Auflösung ist sowieso das falsche Wort.
Zudem die Frage ob der TE das hier braucht, und nicht lieber einfach mehrere Frames messen möchte. Scheinbar hat der TE mit seinem Timer aber eh ein generelles Konzeptproblem.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 09.04.13 20:44
Boldar hat folgendes geschrieben : | Auflösung ist sowieso das falsche Wort. |
Zitat: | The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds. |
Quelle: msdn.microsoft.com/e...724408(v=vs.85).aspx
Ich übersetze Resolution mit Auflösung. Aber das ist Erbsenzählerei.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 21:43
Boldar hat folgendes geschrieben : | Zudem die Frage ob der TE das hier braucht, und nicht lieber einfach mehrere Frames messen möchte. Scheinbar hat der TE mit seinem Timer aber eh ein generelles Konzeptproblem. |
Das sag ich doch die ganze Zeit.
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 23:09
Hallo,
Boldar hat folgendes geschrieben : | Dann halt Queryperformancecounter. |
Genau. Und deshalb wiederhole ich noch einmal meinen Vorschlag:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var Time1, Time2, Freq: Int64; wert : extended; begin QueryPerformanceFrequency(Freq); QueryPerformanceCounter(Time1);
QueryPerformanceCounter(Time2); wert:=1000*(Time2-Time1)/freq; label1.caption:=floattostrf(wert,ffgeneral,4,3)+' ms'; label2.caption:=floattostrf(1000/wert,ffgeneral,4,3)+' Bilder je s'; end; |
Das funktioniert garantiert. Und wenn es nicht in die Zeichenroutine eingebaut werden soll, dann macht zwei Prozeduren, eine zum Start und eine zur Auswertung. Damit gibt's auch keinen Timer mehr, der offensichtlich nicht so will, wie er soll.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|