![]() |
Die Zeit stoppen ohne Gettickcount
Moin Leute,
ich stehe wieder vor einem Problem. Wie kann ich die Zeit einer Function stoppen ohne die Function GetTickCount? Wenn ich GetTickCount aufrufe, bringt der Rechner immer die Fehlermeldung "ungültiger Zeigeroperation". |
Re: Die Zeit stoppen ohne Gettickcount
Hast du mal etwas Code, wie du GetTickCOunt aufgerufen hast?
|
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
MfG Binärbaum |
Re: Die Zeit stoppen ohne Gettickcount
Ein bisschen Quelltext:
Delphi-Quellcode:
In diesem Programm soll der Sortieralgorithmus "Insert-Sort" aufgerufen werden.
procedure TForm1.InsertButtonClick(Sender: TObject);
var a:array of integer; var voninsert, bisinsert:cardinal; begin laenge:=memo1.lines.count; setlength(a,laenge); ein(a); voninsert:=GetTickCount; insert(a); bisinsert:=GetTickCount; aus(a); summe:=bisinsert-voninsert; InsertLabel.Caption:=''; if (summe>1000) then InsertLabel.Caption:=floattostr(summe/1000)+' s' else InsertLabel.Caption:=floattostr(summe)+' ms'; 1) Zahlen einlesen mit der Funktion "ein(a)" 2) Zeit nehmen 3) Sortieren mit der Funktion "insert(a)" 4) Zeit nehmen 5) Zahlen ausgeben mit der Funktion 6) Differenz aus zweiter Zeit und erster Zeit Aber wo soll der Fehler sein? :gruebel: |
Re: Die Zeit stoppen ohne Gettickcount
Was tut denn die Funktion "ein"?
|
Re: Die Zeit stoppen ohne Gettickcount
Tritt der Fehler auch auf, wenn du anstelle von "GetTickCount" Zahlen einsetzt?
Teste das bitte mal, denn es könnte an den aufzurufenden Funktionen liegen. |
Re: Die Zeit stoppen ohne Gettickcount
@Dax: Die Zahlen aus einer MemoBox einlesen.
@Matze: der gleiche Fehler kommt auch, wenn ich Zahlen einsetze. |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Delphi-Quellcode:
function bubble (var a:array of integer):integer;
var j,w,laenge:integer; begin laenge:=form1.Memo1.Lines.Count; //setlength(a, laenge); for j:=laenge downto 1 do begin for w:=2 to j do begin if (a[w-1]>a[w]) then vertausch(a[w-1],a[w]); end;// end of w-for-schleife end; // end of j-for-schleife end; // end of function bubble
Delphi-Quellcode:
Das ist einmal die Funktion "Bubble-Sort", die Funktion "einlesen(ein)" und die Funktion "Ausgeben(aus)".
function ein (var a:array of integer):integer;
var i:integer; begin laenge:=form1.Memo1.Lines.Count; for i:=1 to laenge do begin a[i]:=strtoint(form1.memo1.lines[i-1]); end; end; // end of function ein function aus (var a:array of integer) :integer; var j:integer; begin laenge:=form1.Memo1.Lines.Count; for j:=1 to laenge do begin form1.memo2.Lines.Add(inttostr(a[j])); end; end; // end of function aus Irgendwo dort ist der Fehler! |
Re: Die Zeit stoppen ohne Gettickcount
Ich hab mir jetzt nicht alles angeschaut aber
Delphi-Quellcode:
muss zu einem Fehler führen, da Memo.Lines von 0 bis Memo.Lines.Count - 1 geht...
laenge:=form1.Memo1.Lines.Count;
//setlength(a, laenge); for j:=laenge downto 1 do Vielleicht liegts ja daran (Zugriff auf nicht reservierten Speicher). |
Re: Die Zeit stoppen ohne Gettickcount
Dynamische Arrays beginnen immer mit dem Index 0! Da dein Array laenge lang ist, knallt es natürlich am Ende von
Delphi-Quellcode:
(Btw: geniale Einrückung :mrgreen: ).
for i:=1 to laenge do
begin a[i]:=strtoint(form1.memo1.lines[i-1]); end; Also muss es
Delphi-Quellcode:
oder gleich
for i:=1 to laenge do
begin a[i-1]:=strtoint(form1.memo1.lines[i-1]); end;
Delphi-Quellcode:
heißen.
for i:=0 to laenge-1 do
begin a[i]:=strtoint(form1.memo1.lines[i]); end; [edit]Ja, in der "bubble"-Prozedur genauso |
Re: Die Zeit stoppen ohne Gettickcount
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)
|
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
Aenogym |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Ein Timer macht wohl ab 30-50ms Sinn. Da Timer die geringste Priorität überhaupt haben kannst du auch das auf einem ausgelasteten System knicken.
GetTickCount dürfte wohl die einfachste Möglichkeit sein relativ ( :!: ) genau die Zeit zu messen. ;) Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
[edit]Viel zu spät :roll: . |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
Wobei das jedoch schon wieder haarspaleterei ist. Wenn man genug durchläufe macht, sodass Abweichungen von 10-20ms zu anderen Algos entstehen, sind die 1-2ms Abweichung eigentlich egal ;) |
Re: Die Zeit stoppen ohne Gettickcount
Zu TTimer:
geringstes funktionierendes Intervall unter Win XP: 10ms unter Win 9x: 50ms Also 1ms ist purer Schwachsinn, da du das nie erreichen wirst. |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Deshalb verwendet man
![]() |
Re: Die Zeit stoppen ohne Gettickcount
@Matze
ausser mit dem DXTimer. Der packt 1ms und sogar 0. |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
Und, dass der DxTimer 0ms schafft, kann ich mir nicht vorstellen. |
Re: Die Zeit stoppen ohne Gettickcount
@Matze
ist aber so ;-) |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
Aenogym |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
|
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
0ms kann man bei TTimer auch einstellen, aber wir sind leicht neben dem Thema. |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
sorry einmal noch: Ich hab grad ma einen kleinen Test gemacht. Ich hab zwei Variablen mit einem Timer und einem DXTimer mit einem Intervall von 1ms laufen lassen. Theoretisch müsste die Variable von DXTimer höher sein, als die vom Timer, aber diese waren genau gleich. Also schafft der Timer doch 1ms? [edit] Du kannst beim Timer zwar 0ms einstellen, aber dann macht der nichts mehr. |
Re: Die Zeit stoppen ohne Gettickcount
Zitat:
Ich hab folgendes gemacht: DXTimer und TTimer aufs Form, 2 Labels. 2 Variablen hochgezählt und bei 10000 das jeweilige Label geändert. Das ist dann vorerst nur mit dem Auge sichtbar, aber der DXTimer war VIEL früher fertig. Wie du das gemacht hast, kann ich mir jedoch nciht wirklich vorstellen :roll: //edit: Wobei das eigentlich wieder ein Fall für GetTickCount wäre :zwinker: |
Re: Die Zeit stoppen ohne Gettickcount
Wie lang hast du den Test denn laufen lassen? Find doch mal raus in welchen Intervallen der TTimer schaltet. Lass dann vielleicht mal den DXTimer bis zum 2,5-Fachen dieser Zeit laufen und dann den TTimer auschalten. Wenn du dir jetzt die Zeit vom TTimer anschaust, wird die dann wahrscheinlich das 2 oder das 3 fache der Intervallzeit betragen.
|
Re: Die Zeit stoppen ohne Gettickcount
also leute :) wenn ich das gewusst hätte... das mit dem timer war nie ein ernstgemeinter vorschlag :mrgreen:
|
Re: Die Zeit stoppen ohne Gettickcount
Moin Jungs!
Ich wollte eigendlich nicht, dass ihr euch wegen mir in die Haare bekommt! Aber trotzdem danke für die vielen Antworten! :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz