Array as an argument, ambiguous behaviour.

Steven Schveighoffer schveiguy at yahoo.com
Thu Jan 30 08:18:33 PST 2014


On Thu, 30 Jan 2014 11:04:44 -0500, Cooler <kulkin at hotbox.ru> wrote:

> On Thursday, 30 January 2014 at 16:01:32 UTC, Cooler wrote:
>> On Thursday, 30 January 2014 at 15:59:48 UTC, Cooler wrote:
>>> On Thursday, 30 January 2014 at 15:51:44 UTC, Tobias Pankrath wrote:
>>>> On Thursday, 30 January 2014 at 15:49:35 UTC, Cooler wrote:
>>>>>>> I agree. I just want that the case can be expressed in language  
>>>>>>> syntax more obvious - something like "fun(int[] const x){}" to  
>>>>>>> emphasize that I understand that fun() can change content of  
>>>>>>> array, and cannot change the {pointer,size} pair.
>>>>>>
>>>>>> That's what fun(int[] x) does :)
>>>>>>
>>>>>> -Steve
>>>>>
>>>>> Again...
>>>>> void fun(int[] x){ x ~= 5; }
>>>>> auto a = new int[10];
>>>>> fun(a); // Can you predict the content of 'a'?
>>>>
>>>>
>>>> It's [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].
>>>
>>> No!!! It depends how runtime allocates memory for the array. Read  
>>> http://dlang.org/d-array-article.html.
>>> If 'a' has internal space enough to place '5' the caller will see
>>> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5].
>>
>> Sorry!!! My mistake. The caller will see [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  
>> :)
>
> But that is the proof. The intention of fun() implementer will not be  
> achieved. And such misunderstanding will appear only at runtime.

void foo(int x)
{
    x = 5;
}

"hey, why doesn't that work! Setting a parameter to another value should  
be illegal!"

-Steve


More information about the Digitalmars-d-learn mailing list