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, BjoernOK, 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