Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
February 01, 2012 Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
import std.stdio; void main() { char[100] a = "old content"; a = "new content"; } The program above causes an exception to be thrown: object.Exception@src/rt/arraycat.d(31): lengths don't match for array copy I admit that a fixed-length char array is not really a string. But assuming that the new content is legal UTF-8, what is the best way of modifying that array? Thank you, Ali |
February 01, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali Çehreli:
> what is the best way of modifying that array?
In your code it's the definition too that throws an exception:
void main() {
char[100] a = "old content";
}
This works, but it's not nice:
import std.stdio;
void main() {
char[100] a;
string s1 = "old content";
a[0 .. s1.length] = s1;
writeln(a);
string s2 = "new content";
a[0 .. s2.length] = s2;
writeln(a);
a[0 .. "new content".length] = "new content";
writeln(a);
}
Bye,
bearophile
|
February 02, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 02/01/2012 03:14 PM, bearophile wrote: > Ali Çehreli: > >> what is the best way of modifying that array? > > In your code it's the definition too that throws an exception: Of course! I need sleep. :( I also failed to mention that the rest of the characters should be '\0' filled too but it's not a big deal. > void main() { > char[100] a = "old content"; > } > > > This works, but it's not nice: > > import std.stdio; > void main() { > char[100] a; > string s1 = "old content"; > a[0 .. s1.length] = s1; > writeln(a); > string s2 = "new content"; > a[0 .. s2.length] = s2; > writeln(a); > a[0 .. "new content".length] = "new content"; > writeln(a); > } > > > Bye, > bearophile The following is some of mine and the ones that did not work. import std.stdio; import std.algorithm; import std.string; import std.array; void main() { char[100] a; // explicit: foreach (i, c; "one") { a[i] = c; } a["one".length .. $] = '\0'; writeln(a); a = leftJustify("two", a.length, '\0'); writeln(a); // copy(a, "new content"); // fill(a, "new content"); // insertInPlace(a, "new content"); // // Those do not work with errors similar to this: // // Error: template std.algorithm.copy(Range1,Range2) if // (isInputRange!(Range1) && // isOutputRange!(Range2,ElementType!(Range1))) does not match any // function template declaration } Ali |
February 02, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali: > a["one".length .. $] = '\0'; Is DMD able to optimize that string literal away? (Some assembly may be required). > // copy(a, "new content"); > // fill(a, "new content"); > // insertInPlace(a, "new content"); > // > // Those do not work with errors similar to this: > // > // Error: template std.algorithm.copy(Range1,Range2) if > // (isInputRange!(Range1) && > // isOutputRange!(Range2,ElementType!(Range1))) does not match any > // function template declaration Try harder. Try to slice that a. Bye, bearophile |
February 02, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | OT: Just saw fill() by accident and something caught my eye: char[100] a; fill(a[], "bla"); // fail, ok int[100] a; fill(a[], "bla"); // works It could be a constraint issue. To bugzilla? |
February 02, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 02/01/2012 04:34 PM, bearophile wrote: > Ali: > >> a["one".length .. $] = '\0'; > > Is DMD able to optimize that string literal away? (Some assembly may be required). I sure hope so. "one".length should be a compile time constant. >> // copy(a, "new content"); >> // fill(a, "new content"); >> // insertInPlace(a, "new content"); >> // >> // Those do not work with errors similar to this: >> // >> // Error: template std.algorithm.copy(Range1,Range2) if >> // (isInputRange!(Range1)&& >> // isOutputRange!(Range2,ElementType!(Range1))) does not match any >> // function template declaration > > Try harder. Try to slice that a. > > Bye, > bearophile First of all, the parameters in my copy() call were swapped above. It should have been source then destination: copy("new content", a); But it won't work, because strings are ranges of Unicode code points (i.e. dchar ranges). Even narrow strings are exposed as dchar ranges. So the source is an InputRange in that call, and the destination is an output range, but their element types don't match. The following works because now all of the elements are dchar: dchar[100] a = '\0'; copy("new content"d, a[]); Ali |
February 02, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On 02/01/2012 04:24 PM, Andrej Mitrovic wrote: > OT: Just saw fill() by accident and something caught my eye: > > char[100] a; > fill(a[], "bla"); // fail, ok > > int[100] a; > fill(a[], "bla"); // works > > It could be a constraint issue. Although "bla" is an array of char, it is a range of dchar; and dchar automatically converts to int. > To bugzilla? I don't think so, because it's just dchar to int conversion. Ali |
February 06, 2012 Re: Assigning to char[N] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Thu, 02 Feb 2012 00:38:26 -0500, Ali Çehreli <acehreli@yahoo.com> wrote: > On 02/01/2012 04:24 PM, Andrej Mitrovic wrote: > > OT: Just saw fill() by accident and something caught my eye: > > > > char[100] a; > > fill(a[], "bla"); // fail, ok > > > > int[100] a; > > fill(a[], "bla"); // works > > > > It could be a constraint issue. > > Although "bla" is an array of char, it is a range of dchar; and dchar automatically converts to int. But this is the kind of unintuitive shit that treating char arrays not as arrays in *some* parts of D causes great confusion and silly limitations. The above should be the opposite, the first line should pass and the second should fail. > > > To bugzilla? > > I don't think so, because it's just dchar to int conversion. You are likely to get an "invalid" response due to the strict views of Andrei, but I think it's unacceptable behavior for fill to say it cannot fill a string with string data. -Steve |
Copyright © 1999-2021 by the D Language Foundation