<pre>
procedure Test(const A: array of Integer; B: Integer = 0); overload;
begin
WriteLn( Length(A) );
end;
Test([1, 2, 3]);
</pre>
So wie oben immer ein offenes Array gefolgt vom einem Default Parameter in einer als overload deklarierten procedure.<br>
Der Compiler vergisst intern den Default Parameter zu übergeben. Damit wird z.B. im obigen Beispiel 1 als Ausgabe anstatt 3 zu sehen sein.
Viel wichtiger ist aber das der Aufrufstack der procedure also nicht korrekt erzeugt wird und somit durch eine solche procedure der komplette programstack zerstört wird und es garantiert zu hässlichen Schutzverletzungen kommen muß.<br>
Lösungen:
<li>auf overloading verzichten
<li>auf default parameter verzichten und zwei overloaded procedures Test() erzeugen, also
<pre>
procedure Test(const A: array of Integer); overload;
procedure Test(const A: array of Integer; B: Integer); overload;
</pre>
getestet unter D4/D5.
gruß hagen
procedure Test(const A: array of Integer; B: Integer = 0); overload;
begin
WriteLn( Length(A) );
end;
Test([1, 2, 3]);
</pre>
So wie oben immer ein offenes Array gefolgt vom einem Default Parameter in einer als overload deklarierten procedure.<br>
Der Compiler vergisst intern den Default Parameter zu übergeben. Damit wird z.B. im obigen Beispiel 1 als Ausgabe anstatt 3 zu sehen sein.
Viel wichtiger ist aber das der Aufrufstack der procedure also nicht korrekt erzeugt wird und somit durch eine solche procedure der komplette programstack zerstört wird und es garantiert zu hässlichen Schutzverletzungen kommen muß.<br>
Lösungen:
<li>auf overloading verzichten
<li>auf default parameter verzichten und zwei overloaded procedures Test() erzeugen, also
<pre>
procedure Test(const A: array of Integer); overload;
procedure Test(const A: array of Integer; B: Integer); overload;
</pre>
getestet unter D4/D5.
gruß hagen