-
Forum: Programmieren allgemein
Delphi
by himitsu,
22. Apr 2018
Uhrzeit (GetSystemTime und Andere) - maximal Millisekunden
GetTickCount - meistens 15-16 Millisekunden
QueryPerformanceCounter - schnell, x Nanosekunden
RDTSC (Read Time-Stamp Counter) - schneller, es waren mal CPU-Ticks
TThread.GetTickCount - bestimmt GetTickCount :stupid:
TStopwatch - QueryPerformanceCounter im Windows
(TPlatformServices.Current as IFMXTimerService).GetTick -...
-
Forum: Programmieren allgemein
Delphi
by himitsu,
19. Apr 2018
ist einer von vielen Standardattributen, abgesehn davon, dass es hier als "Ausnahme" direkt an den Compiler gerichtet ist.
und wind auch ganz nett.
http://docwiki.embarcadero.com/RADStudio/Tokyo/de/Compiler-Attribute
Ansonsten kann man fast Allem auch eigene Attribute zuweisen und per RTTI zur Laufzeit auslesen.
z.B. gern genommen für's Test-Management, wo man direkt an Methoden seine...
-
Forum: Programmieren allgemein
Delphi
by himitsu,
18. Apr 2018
Jupp, war der Stack. (hatte grade schonwieder "Jupp, waren Register" geschrieben :oops:)
Aber so steht es bestimmt schon immer da oben drin. :angle2:
-
Forum: Programmieren allgemein
Delphi
by himitsu,
17. Apr 2018
Es gibt Aufrufkonventionen, da landet alles auf dem Stack und nichts in Registern (außer dem Result, der praktisch überall in EAX ist ... abgesehn davon, wo hier der Result zu einem VAR-Parameter gemacht wurde)
Praktisch landen im "Pascal" die ersten 3 Parameter in Registern (EAX, EDX und ECX, wenn möglich) und der Rest immer auf dem Stack.
In Methoden gibt es einen "unsichtbaren"...
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
ShortString bzw. String .... der alte/erste "String" als Record
LongString > AnsiString, RawByteString, UTF8String, UnicodeString und alle anderen Ableitungen von AnsiString
AnsiString und AnsiString(CP) ... ein aufgemotztes dynamisches Array mit Referenzzählung und ANSI-Codepage
UnicodeString ... ein aufgemotztes dynamisches Array mit Referenzzählung und WideChar
UCS4String ... ein echt...
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
Bei WideString stimmt das, da ohne Referenzzählung, aber die LongStrings im Delphi haben eine Referenzzählung.
Referenz wird direkt übergeben (die auf den String und nicht auf die Variable) und verwendet, aber mit RefCount+1 ... beim Schreibzugriff kommt dann ein CopyOnWrite da kein UniqueString.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
In LLVM ist es wohl nur nicht möglich für diese "speziellen" VAR-Parameter (Result) den "Variable wurde initialisiert"-Status auf nein zu setzen, zu beginn einer jeden Funktion, welche hier im LLVM ja schon eine Prozedur ist.
Klang jedenfalls so, als ich schonmal sowas vorgeschlagen hatte.
Ohne LLVM im eigenen Code wäre sowas bestimmt problemloser machbar gewesen.
Ob dann nun irgendwann...
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
Das Problem ist ja, dass hier nun oft kein eigtändiger Compiler mehr zum Einsatz kommt und (bald) alles über LLVM geschleift wird.
Im Prinzip müsste "nur" für diese Vaiable der "würde initialisiert"-Status zurückgesetzt werden und schon käme diese Meldung.
Und nebenbei wird das Kompilieren merklich langsamer, als früher das Eigene.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
Was aber eventuell nichts mit diesem Problem zu tun hat,
denn wenn dort dieser Result-Record auch als VAR-Parameter in eine neue leere Variable geht, dann wäre es praktisch das Gleiche.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
Bitte meine Beiträge dazu genau lesen.
Ja, es wird initialisiert, aber eben nicht dort, wo man vermuten könnte (zu Beginn der Funktion),
also ist aus Sicht der Funktion dieses Result eben nicht "wirklich" initialisiert, zumindestens nicht unbeding mit 0 (einem Leerstring).
-
Forum: Programmieren allgemein
Delphi
by himitsu,
16. Apr 2018
Das liegt aber nur sekundär an diesem Code.
Dein altes Delphi 7 und dass zuviele böse Programme in Delphi geschrieben wurden und weil viele Virensignaturen einfach nur Schrott sind.
https://www.virustotal.com/de/ zur Gegenprobe
Und die eigene Software kann man als False-Positive melden, dann wird die Signatur meist recht schnell angepasst....
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
Man darf, vor allem nachdem man schon etwas zugewiesen hat.
Vor der ersten Zuweisung ist der Wert einfach "undefiniert", so wie bei lokalen Variablen (Integer und so).
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
VAR und OUT ist praktisch das Gleiche, außer dass bei OUT per Definition kein Eingabewert existiert, also die Variable initialisiert werden müsste, aber für Typen ala String/Array/Interface bricht der Compiler dieses, da sonst die ordnungsgemäße Speicherverwaltung nicht mehr garantiert werden kann.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
Prozedur für Füllen von Objekten ala Listen, wo es als Result oft ungünstig ist.
Und Prozedur hat eher Nachteile, denn du brauchst da immer eine "selbstdefinierte" Variable und man kann es nicht direkt weitergeben, z.B. als Parameter an eine andere Prozedur/Funktion oder für's Zusammenrechnen mehrerer Werte ohne Zwischenvariablen.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
function Test: Integer;
begin
Result := Result + 1;
end;
function Test: string; // procedure Test(var Result: string);
begin
Result := Result + 'a';
end;
Genau das sagte ich doch.
Bei Ersten kommt die Fehlermeldung, da der Integer wirklich als lokale Variable existiert, als Result in EAX zurückgeliefert und anschließend der äußeren Variable zugewiesen wird.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
Lesen?
https://www.delphipraxis.net/1399299-post7.html
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
Wie gesagt, der Compiler macht aus solchen Funktionen eben eine Prozedur mit VAR-Parameter
procedure Test(var Result: string); //function Test: string;
begin
Result := Result + 'a';
end;
for i := 1 to 5 do
Test(S); //S := Test;
ShowMessage(S); // 'aaaaa'
Grundsätzlich ist das für den Entwickler egal.
-
Forum: Programmieren allgemein
Delphi
by himitsu,
15. Apr 2018
Gerade da ist es total wurscht,
denn bei gemanagten Typen ala String, Variant, Interface und dynamischen Arrays macht der Delphi-Compiler aus function Beispiel(...): string; eben auch einprocedure Beispiel(...; var Result: string); und kopiert nichts um.
Leider ist das auch das Problem/die Urache, dass bei Funktionen für das Result keine "wurde nicht initialisiert"-Meldung vom Compiler kommt,...