https://forum.dlang.org/post/17nwtnp4are5q$.1ddtvmj4e23iy....@40tude.net
On Tuesday, 10 May 2005 at 01:06:14 UTC, Derek Parnell wrote:
On Tue, 10 May 2005 00:30:57 +0000 (UTC), Oliver wrote:
Hello D-ers
The documentation is very short on the keywords in, out and
inout.
Is is inout sth like a reference ? But then, what is in and
what is out?
in:
The argument is preserved, such that when control returns to
the caller,
the argument as passed by the caller is unchanged. This means
that the
called function can do anything it likes to the argument but
those changes
are never returned back to the caller. There is a bit of
confusion here
when it comes to passing class objects and dynamic arrays. In
both these
cases, a reference to the data is passed. Which means that for
'in'
references, the called function is free to modify the reference
data (which
is what is actually passed) in the full knowledge that any
changes will
*not* be returned to the caller. However, if you make any
changes to the
data being referenced, that modified data is 'returned'. Which
means that,
for example, if you pass a char[] variable, the reference will
be preserved
but the data in the string can be changed.
out:
The argument is always initialized automatically by the called
function
before its code is executed. Any changes to the argument by the
called
function are returned to the caller. The called function never
gets to see
the value of the argument as it was before the called function
gets
control. The argument must a RAM item and not a literal or
temporary value.
inout:
The argument is passed to the called function without before
its code is
executed. Any changes to the argument by the called function
are returned
to the caller. In other words, the called function can see what
value was
passed to it before changing it. The argument must a RAM item
and not a
literal or temporary value.
Examples:
char[] a;
int b;
void func_one(in char[] X, in int Y)
{
X[0] = 'a'; // Modifies the string contents.
X = "zxcvb"; // Modifies the string reference but is not
returned.
Y = 3; // Modifies the data but is not returned.
}
a = "qwerty";
b = 1;
func_one(a,b);
writefln("%s %d", a,b); // --> awerty 1
void func_two(out char[] X, out int Y)
{
X[0] = 'a'; // Modifies the string contents.
X = "zxcvb"; // Modifies the string reference.
if (b == 1)
Y = 3; // never executed because Y is always zero on
entry.
else
Y = 4; // Modifies the data.
}
a = "qwerty";
b = 1;
func_two(a,b);
writefln("%s %d", a,b); // --> zxcvb 4
void func_three(inout char[] X, inout int Y)
{
X[0] = 'a'; // Modifies the string contents.
X = "zxcvb"; // Modifies the string reference.
if (b == 1)
Y = 3; // Modifies the data.
else
Y = 4; // Modifies the data.
}
a = "qwerty";
b = 1;
func_two(a,b);
writefln("%s %d", a,b); // --> zxcvb 3
Thanks a lot for your explanation.
I started to learn D language recently and I have trouble with
understanding some part of language.
I do your example on Linux and it works very well, especially
func_rthee().
when I try to repeat code on Windows 10, I get errors:
Error: cannot modify `inout` expression `X[0]`
Error: cannot modify `inout` expression `X`
Error: cannot modify `inout` expression `Y`
Error: cannot modify `inout` expression `Y`
Very strange situation for me.
I expect next behavior of the parameters X and Y could get value
and could change it on Windows but now I am not sure what is goin
on.
PS. I am using DMD64 D Compiler v2.098.1-dirty on Debian 10 Linux
and Windows 10.