[fpc-devel] Array assignment operator

Gennady Agranov gennadyagranov at gmail.com
Sat Nov 3 21:43:36 CET 2018


Hi,

Leaving aside the reason why the MiSchi's solution doesn't work the main 
question is still not answered :)

If you have integer dynamic array "MyArray" is there a way for the 
following statement to compile and work correctly:

MyArray := 5;

Thanks,
Gennady


On 11/3/2018 4:14 PM, Ben Grasset wrote:
> On Sat, Nov 3, 2018 at 8:01 AM Schindler Karl-Michael 
> <karl-michael.schindler at web.de <mailto:karl-michael.schindler at web.de>> 
> wrote:
>
>     Hi
>
>     I would like to use a simple assignment operator for arrays, with
>     which all elements of an array are assigned to the same value,
>     similar to an extended initialize, not to zero but to a value of
>     choice. A simple example for an integer array would be:
>
>       myArray := 5;
>
>     With arrays with defined bounds, it works, but i was not able to
>     do it with a dynamic array. My test case is this:
>
>     program arrayAssign;
>
>     type
>       TmyArray = array of integer;
>
>     var
>       myArray: TmyArray;
>       index: integer;
>
>     operator := (const number: integer) theResult: TmyArray;
>       var
>         i: integer;
>       begin
>         for i := low(theResult) to high(theResult) do
>           theResult[i] := number;
>       end;
>
>     begin
>       setlength(myArray, 10);
>       writeln ('myArray: ', low(myArray), ', ', high(myArray));
>
>       myArray := 5;
>
>       writeln ('myArray: ', low(myArray), ', ', high(myArray));
>       for index := low(myArray) to high(myArray) do
>         writeln (index, ': ', myArray[index]);
>     end.
>
>     The output is:
>
>     myArray: 0, 9
>     myArray: 0, -1
>
>     The problem is that in the declaration of the operator, the
>     functions low and high seem to return the values of the type
>     TmyArray, i.e. 0 and -1 and not the values of the variable of the
>     assignment statement, i.e. myArray and the assignment nullifies
>     the previous setlength. Is there any way around this and obtain
>     the actual values of myArray?
>
>     Michael, aka MiSchi.
>     _______________________________________________
>     fpc-devel maillist  - fpc-devel at lists.freepascal.org
>     <mailto:fpc-devel at lists.freepascal.org>
>     http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>
>
> There's two issues:
> 1) The result of the operator is always a new, unique array (as in 
> it's unrelated to the myArray variable)
> 2) Your operator doesn't initialize the result with a length, so it's 
> just iterating over nothing.
>
> Here's an example of the correct way to write the operator and use it:
>
> program ArrayOverloads;
>
> {$mode ObjFPC}
>
> type TIntArray = array of Integer;
>
>   operator := (const I: Integer): TIntArray; inline;
>   var V: Integer;
>   begin
>     SetLength(Result, I);
>     for V := 0 to Pred(I) do Result[V] := V;
>   end;
>
> var
>   I: Integer;
>   IA: TIntArray;
>
> begin
>   IA := 25;
>   for I in IA do Write(I, ' ');
>   WriteLn;
>   for I := High(IA) downto 0 do Write(I, ' ');
>   WriteLn;
>   for I := Low(IA) to High(IA) do Write(I, ' ');
>   WriteLn;
>   I := 0;
>   while I < Pred(High(IA)) do begin
>     Inc(I, 2);
>     Write(I, ' ');
>   end;
> end.
>
> Output:
>
> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> 2 4 6 8 10 12 14 16 18 20 22 24
>
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20181103/b02e94dc/attachment.html>


More information about the fpc-devel mailing list