Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
January 01, 2009 expected array behaviour | ||||
---|---|---|---|---|
| ||||
I have a function that uses 2 array strings defined similar to this... const char[] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] array2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; If I make a change to a char in array1 it also changes the same in array2. But if I define the arrays as follows... const char[26] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[26] array2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; It doesn't occur. Is this expected behaviour? Regards, -=mike=- |
January 01, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike James | Hello Mike,
> I have a function that uses 2 array strings defined similar to this...
>
> const char[] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] array2 =
> "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
>
> If I make a change to a char in array1 it also changes the same in
> array2. But if I define the arrays as follows...
>
> const char[26] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[26] array2
> = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
>
> It doesn't occur. Is this expected behaviour?
>
> Regards,
> -=mike=-
Wha?! If that's true, that looks like a nasty bug!
Is that dmd v2 or v1? Linux or Windows?
-JJR
|
January 01, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike James | On Thu, Jan 1, 2009 at 5:55 PM, Mike James <foo@bar.com> wrote:
> I have a function that uses 2 array strings defined similar to this...
>
> const char[] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
> char[] array2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
>
> If I make a change to a char in array1 it also changes the same in array2. But if I define the arrays as follows...
You'd get a runtime error if you were using Linux. For some reason string literals are not read-only, or Windows doesn't respect it, or something like that. Modifying either array1 or array2 is technically illegal. So, uh, don't do it.
|
January 01, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Reimer | Hi John, I am using D1.038, dsss and Tango. I've written a quick example but this one is even stranger... ======================================== module main; import tango.io.Stdout; int main() { func1(); func2(); return 0; } void func1() { char[] array1 = "ABCD"; char[] array2 = "ABCD"; Stdout(array1).newline; Stdout(array2).newline; Stdout.newline; array2[0] = 'Z'; Stdout(array1).newline; Stdout(array2).newline; Stdout.newline; } void func2() { char[4] array1 = "ABCD"; char[4] array2 = "ABCD"; Stdout(array1).newline; Stdout(array2).newline; Stdout.newline; array2[1] = 'Q'; Stdout(array1).newline; Stdout(array2).newline; Stdout.newline; } ======================================== Regards, -=mike=- |
January 01, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike James | Forgot to mention - Windows XP. Regards, -=mike=- |
January 02, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike James | On Thu, Jan 1, 2009 at 6:56 PM, Mike James <foo@bar.com> wrote:
> Hi John,
>
> I am using D1.038, dsss and Tango.
>
> I've written a quick example but this one is even stranger...
>
> ========================================
>
> module main;
>
> import tango.io.Stdout;
>
> int main() {
> func1();
> func2();
>
> return 0;
> }
>
> void func1() {
> char[] array1 = "ABCD";
> char[] array2 = "ABCD";
>
> Stdout(array1).newline;
> Stdout(array2).newline;
> Stdout.newline;
>
> array2[0] = 'Z';
>
> Stdout(array1).newline;
> Stdout(array2).newline;
> Stdout.newline;
> }
>
> void func2() {
> char[4] array1 = "ABCD";
> char[4] array2 = "ABCD";
>
> Stdout(array1).newline;
> Stdout(array2).newline;
> Stdout.newline;
>
> array2[1] = 'Q';
>
> Stdout(array1).newline;
> Stdout(array2).newline;
> Stdout.newline;
> }
>
> ========================================
>
> Regards,
>
> -=mike=-
>
If you want to modify the contents of string literals, like you're doing here, put a .dup on them.
char[] array1 = "ABCD".dup;
Again, modifying the contents of string literals is illegal and the results are undefined.
|
January 02, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Hello Jarrett,
> If you want to modify the contents of string literals, like you're
> doing here, put a .dup on them.
>
> char[] array1 = "ABCD".dup;
>
> Again, modifying the contents of string literals is illegal and the
> results are undefined.
>
Oh, right. I missed that.
-JJR
|
January 02, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Hello Jarrett,
> On Thu, Jan 1, 2009 at 5:55 PM, Mike James <foo@bar.com> wrote:
>
>> I have a function that uses 2 array strings defined similar to
>> this...
>>
>> const char[] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] array2 =
>> "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
>>
>> If I make a change to a char in array1 it also changes the same in
>> array2. But if I define the arrays as follows...
>>
> You'd get a runtime error if you were using Linux. For some reason
> string literals are not read-only, or Windows doesn't respect it, or
> something like that. Modifying either array1 or array2 is technically
> illegal. So, uh, don't do it.
>
Yes, that's one advantage to Linux. String literals aren't read-only on Win32. This is unfortunate because it means that these sort of bugs are significantly harder to diagnose on Windows than on Linux. I remember that this was a bug in a early DUI version (now GtkD). It's was pretty easy to spot on Linux because of the runtime error.
-JJR
|
January 02, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Reimer | John Reimer wrote:
>> You'd get a runtime error if you were using Linux. For some reason
>> string literals are not read-only, or Windows doesn't respect it, or
>> something like that. Modifying either array1 or array2 is technically
>> illegal. So, uh, don't do it.
>
> Yes, that's one advantage to Linux. String literals aren't read-only on Win32. This is unfortunate because it means that these sort of bugs are significantly harder to diagnose on Windows than on Linux. I remember that this was a bug in a early DUI version (now GtkD). It's was pretty easy to spot on Linux because of the runtime error.
The string literals are read-only on GDC for Win32 too, if that helps...
--anders
|
January 02, 2009 Re: expected array behaviour | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike James | Mike James wrote:
<snip>
> const char[26] array1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
> char[26] array2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
>
> It doesn't occur. Is this expected behaviour?
Yes. Static arrays have value semantics, unlike dynamic arrays, which have reference semantics.
Stewart.
|
Copyright © 1999-2021 by the D Language Foundation