www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - string and char[] conflict

reply qadasd <asd asd.vi> writes:
I use a foreach to iterate thourgh the lines of a text file:

foreach(ulong lnumber, char[] line; input)

and I use std.string:strip() to take out unnecessary spaces:

line=strip(line);

Which gives out the following error:
test.d(142): function std.string.strip (invariant(char)[]) does not 
match parameter types (char[])
test.d(142): Error: cannot implicitly convert expression (line) of type 
char[] to invariant(char)[]
test.d(142): Error: cannot implicitly convert expression 
(strip(cast(invariant(char)[])line)) of type invariant(char)[] to char[]

changing the line will correct the problem:

line=strip(line.idup).dup;

Is there a cleaner way to do this?

I tried using

foreach(ulong lnumber, string line; input)

but it wont compile:

test.d(136): function std.stream.InputStream.opApply (int delegate(ref 
char[] line)) does not match parameter
  types (int delegate(ref ulong __applyArg0, ref invariant(char)[] 
__applyArg1))
test.d(136): Error: cannot implicitly convert expression 
(__foreachbody15) of type int delegate(ref ulong __a
pplyArg0, ref invariant(char)[] __applyArg1) to int delegate(ref ulong 
n, ref wchar[] line)

As you might have assumed, im using lastest DMD2.
Mar 09 2008
parent Johan Granberg <lijat.meREM OVEgmail.com> writes:
qadasd wrote:

 I use a foreach to iterate thourgh the lines of a text file:
 
 foreach(ulong lnumber, char[] line; input)
 
 and I use std.string:strip() to take out unnecessary spaces:
 
 line=strip(line);
 
 Which gives out the following error:
 test.d(142): function std.string.strip (invariant(char)[]) does not
 match parameter types (char[])
 test.d(142): Error: cannot implicitly convert expression (line) of type
 char[] to invariant(char)[]
 test.d(142): Error: cannot implicitly convert expression
 (strip(cast(invariant(char)[])line)) of type invariant(char)[] to char[]
 
 changing the line will correct the problem:
 
 line=strip(line.idup).dup;
 
 Is there a cleaner way to do this?
 
 I tried using
 
 foreach(ulong lnumber, string line; input)
 
 but it wont compile:
 
 test.d(136): function std.stream.InputStream.opApply (int delegate(ref
 char[] line)) does not match parameter
   types (int delegate(ref ulong __applyArg0, ref invariant(char)[]
 __applyArg1))
 test.d(136): Error: cannot implicitly convert expression
 (__foreachbody15) of type int delegate(ref ulong __a
 pplyArg0, ref invariant(char)[] __applyArg1) to int delegate(ref ulong
 n, ref wchar[] line)
 
 As you might have assumed, im using lastest DMD2.

foreach(u,l;args) strip(cast(string)l); this works (if this is the only reference to the data) but it requiers an ugly cast and
Mar 09 2008