Zvoni hat geschrieben: Di 22. Sep 2026, 13:13
kupferstecher hat geschrieben: Di 22. Sep 2026, 12:19
Warum wird vom Compiler nicht am Anfang der Funktion das Result automatisch initialisiert? Aus Performance-Gründen?
Weil am Ende des Tages die Variable für ein dynamisches Array bzw. eine (Result-) Variable für einen String unter der Haube eben doch ein Zeiger ist?
Wenn ein Result-String ja noch unbekannt ist, mit was soll es denn initialisiert werden?
Ich seh es gerade andersrum: Weil es ein Zeiger ist, den der Code innerhalb der Funktion benutzen kann, kann darin kein beliebiger Wert stehen. Entweder es ist ein leerer Zeiger, also nil, oder er zeigt auf eine Instanz, die auch tatsächlich vorhanden sein muss. in diesem Sinne kann die Result-Variable also nicht uninitialisiert sein. Aber es kann natürlich der "falsche" Wert drin stehen.
Im Hinblick auf Fehlertoleranz, denke ich, wäre es sinnvoll, den Wert auf null/nil zu initialisieren. In den meisten Fällen, wo der Programmierer explizit per Code initialisiert, kann das dann sowieso wegoptimiert werden. Das soll nicht heißen, dass es dann keine Warnung bräuchte.
Warf hat geschrieben: Di 22. Sep 2026, 14:04
Für managed records wird bei jedem Funktionsaufruf unter der haube ein neues temporäres Objekt erzeugt und frisch initialisiert. Innerhalb der funktion ist es zwar immernoch nur ein var parameter aber eben auf das temporäre Objekt nicht auf das tatsächliche Ziel.
So sollte es auch sein, denke ich. So kann man auch als Parameter und als Result die gleiche Variable übergeben, ohne dass es kracht (Ich kann mich hier aber täuschen).
Warf hat geschrieben: Di 22. Sep 2026, 14:04
Das sind aber undokumentierte Compiler Internas und sollte man sich nicht drauf verlassen.
Ja, einerseits muss man die Internas kennen, siehe Zeile davor, andererseits kann man dann Dinge auch leicht missverstehen, die sonst klarer wären. Manchmal ist mir Freepascal in der Hinsicht zu kompliziert, es gibt so viele Spezialfälle wie den hier diskutierten, welche Parameter werden als Wert übergeben (kopiert) und welche per Referenz übergeben. Da sollte man den Mechanismus der Result-Übergabe eines Record wieder kennen.