digitalmars.D.learn - internal structure of char[]
- Bjoern (23/23) Jan 18 2008 Hi,
- Jarrett Billingsley (20/43) Jan 18 2008 OK, so your function is doing probably a lot of unnecessary copying. Yo...
- Bjoern (5/5) Jan 18 2008 Thanks, as allways usefull information !
Hi,
Does somebody know the internal structure of char[] ?
Not only that I have to do a lot of converting on the DLL (D) side, I
also have to convert the strings on the parrent side (4GL)
I hope I can use this info to simplyfy for example code like this :
alias extern(Windows) void function(char* token, size_t siz = 0)
DisplayCallBack;
export extern(Windows)
bool TextDelimit(DisplayCallBack cb, char* source, char* delim)
{
char[] _source = source[0 .. strlen(source)].dup;
char[] _delim = delim[0 .. strlen(delim)].dup;
// split into an array
char[][] elements = Text.delimit (_source, _delim);
foreach (char[] element; elements)
{
char* s = element.ptr;
cb(s, strlen(s));
}
return true;
}
Well it works fine, but I want it smarter (if possible)
Thanks in advance, Bjoern
Jan 18 2008
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message
news:fmq5d6$2p8$1 digitalmars.com...
Hi,
Does somebody know the internal structure of char[] ?
Not only that I have to do a lot of converting on the DLL (D) side, I also
have to convert the strings on the parrent side (4GL)
I hope I can use this info to simplyfy for example code like this :
alias extern(Windows) void function(char* token, size_t siz = 0)
DisplayCallBack;
export extern(Windows)
bool TextDelimit(DisplayCallBack cb, char* source, char* delim)
{
char[] _source = source[0 .. strlen(source)].dup;
char[] _delim = delim[0 .. strlen(delim)].dup;
// split into an array
char[][] elements = Text.delimit (_source, _delim);
foreach (char[] element; elements)
{
char* s = element.ptr;
cb(s, strlen(s));
}
return true;
}
Well it works fine, but I want it smarter (if possible)
Thanks in advance, Bjoern
OK, so your function is doing probably a lot of unnecessary copying. You
shouldn't have to .dup those strings, just slice source[0 .. strlen(source)]
and now that string points to the same place the source string is. AFAIK
Text.delimit does not modify the inputs, it just gives you an array of
slices into it (aren't slices great?). Lastly, doing strlen(s) in that loop
shouldn't work (I'm surprised it does?!), since all the items of elements
are slices, not zero-terminated strings.
Finally you shouldn't need to know anything about the internal structure of
char[] to do this.
export extern(Windows)
bool TextDelimit(DisplayCallBack cb, char* source, char* delim)
{
char[] _source = source[0 .. strlen(source)];
char[] _delim = delim[0 .. strlen(delim)];
foreach(element; Text.delimit(_source, _delim))
cb(element.ptr, element.length);
return true;
}
Jan 18 2008
Thanks, as allways usefull information ! cb(element.ptr, element.length); //Well at least this I found out by myself; so there is still hope :) Just in another Thread regarding char* to char[] I read : slice and dup. Using .dup in this case however, produces wrong results.
Jan 18 2008








Bjoern <nanali nospam-wanadoo.fr>