Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
August 27, 2010 Exact effects of returning Structs | ||||
---|---|---|---|---|
| ||||
I have some experimental code I'm writing, and it seems when i return a structure it is either corrupted, or should be disallowed all together. A postblit is suggested this(this), but since I'm returning a structure that isn't tied to anything else it doesn't need to duplicate it. Example: struct A{ int b; char c[]; } void fun1() { A a; a = fun2(); //array a.c corrupted, causes range exception //int a.b corrupted?!? } A fun2(){ A t; t.c.length = 100; /*do something*/ return t; //valid before returning. } |
August 27, 2010 Re: Exact effects of returning Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Era Scarecrow | Era Scarecrow:
> I have some experimental code I'm writing, and it seems when i return a structure it is either corrupted, or should be disallowed all together. A postblit is suggested this(this), but since I'm returning a structure that isn't tied to anything else it doesn't need to duplicate it.
If possible please show a complete minimal program that contains a main() that shows your problem. I have written this, but I don't see the problem:
import std.stdio: writeln, write;
enum int N = 100;
struct Foo {
int x;
char[] arr;
}
Foo fun2() {
Foo f1;
f1.arr.length = N;
f1.arr[] = 'x';
f1.x = 25;
writeln(f1.arr.length);
write(">");
foreach(i; 0 .. N)
write(f1.arr[i]);
writeln("<");
return f1;
}
void main() {
Foo f2;
f2 = fun2();
writeln(f2.x);
writeln(f2.arr.length);
write(">");
foreach(i; 0 .. N)
write(f2.arr[i]);
writeln("<");
}
Bye,
bearophile
|
August 27, 2010 Re: Exact effects of returning Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | == Quote from bearophile (bearophileHUGS@lycos.com)'s article > Era Scarecrow: > > I have some experimental code I'm writing, and it seems when i return a structure it is either corrupted, or should be disallowed all together. A postblit is suggested this(this), but since I'm returning a structure that isn't tied to anything else it doesn't need to duplicate it. > If possible please show a complete minimal program that contains a main() that shows your problem. I know i've been going a different route with the code since so i am not sure where exactly it was, and can't duplicate the problem now. However single-lining through it brings up a question of assumption. Aren't array's (dynamic and otherwise) filled with 0's by default? Str_BigNum add(in Str_BigNum rhs) { Str_BigNum tmp; char res[]; res.length = _result.length + 1; res[1 .. $] = _result[]; //res[0] should be null, right?? _addsub!("+")(res, rhs._result); tmp._result = res; return tmp; } |
August 27, 2010 Re: Exact effects of returning Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Era Scarecrow | On Fri, 27 Aug 2010 16:04:50 -0400, Era Scarecrow <rtcvb32@yahoo.com> wrote:
> == Quote from bearophile (bearophileHUGS@lycos.com)'s article
>> Era Scarecrow:
>> > I have some experimental code I'm writing, and it seems when i
>> return a
> structure it is either corrupted, or should be disallowed all together. A postblit
> is suggested this(this), but since I'm returning a structure that isn't tied to
> anything else it doesn't need to duplicate it.
>> If possible please show a complete minimal program that contains a main() that
> shows your problem.
>
> I know i've been going a different route with the code since so i am not sure
> where exactly it was, and can't duplicate the problem now.
>
> However single-lining through it brings up a question of assumption. Aren't
> array's (dynamic and otherwise) filled with 0's by default?
No, arrays are filled with the .init value. For char, that's 0xff.
-Steve
|
August 27, 2010 Re: Exact effects of returning Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | == Quote from Steven Schveighoffer (schveiguy@yahoo.com)'s article
> > array's (dynamic and otherwise) filled with 0's by default?
> No, arrays are filled with the .init value. For char, that's 0xff. -Steve
Ahh that's right. It's 0xFF which is a illegal character for UTF-8 encoding. That
does help explain why my asserts involving 0 to 9 kept failing, since my checks
were for 0x0, and 0x20.
If i happen to duplicate the original problem i'll post back again.
|
Copyright © 1999-2021 by the D Language Foundation