digitalmars.D.learn - string to char*
- shd (15/15) Sep 11 2010 Hello,
- Simen kjaeraas (12/15) Sep 11 2010 Why does the function expect a char*? If it is an external C function,
- =?UTF-8?B?TWFyaXVzeiBHbGl3acWEc2tp?= (6/13) Sep 11 2010 Yes, it's external C function and I can modify bindings (just bindings,
- Andrej Mitrovic (10/25) Sep 11 2010 I'm interfacing with Scintilla (C++), but it works in a different way.
- bearophile (23/26) Sep 11 2010 A solution, maybe correct:
- Jonathan M Davis (12/17) Sep 11 2010 Well, if you look at toStringz()'s implementation, you may notice that t...
- bearophile (7/12) Sep 12 2010 I see, thank you for the answer. Generally in the C code that uses the C...
- klickverbot (4/19) Sep 14 2010 Use std.string.toStringz to convert a D string to a C null-terminated on...
Hello, I'm having a problem in passing a value to char* expecting function in D 2.0. Already tried: to!(char*)("my string"); but it seems like there (Phobos) is no template like this. Then, tried: cast(char*)to!(char[])("my string") which looked ok, but i think it's not a proper way to do that. Most strings converted this way works properly, but once: char* string1 = cast(char*)to!(char[])("my string 1"); char* string2 = cast(char*)to!(char[])("my string 2"); resulted: string1 = "my string 1" string2 = "my string 1my string 2" I can't manage this problem, could You hint me?
Sep 11 2010
shd <alienballance gmail.com> wrote:Hello, I'm having a problem in passing a value to char* expecting function in D 2.0.Why does the function expect a char*? If it is an external C function, and it might change the passed values, you should make a duplicate mutable string, or use char[] in lieu of string. If it is an external C function that will *not* change the passed values, and you have write access to the D headers to interface to C, use const char* instead. If no write access, I would use cast(char*)myString.ptr. If it is a D function, why does it not use const? Or for that matter, why does it not use char[]? -- Simen
Sep 11 2010
On 2010-09-11 15:13, Simen kjaeraas wrote:Why does the function expect a char*? If it is an external C function, and it might change the passed values, you should make a duplicate mutable string, or use char[] in lieu of string. If it is an external C function that will *not* change the passed values, and you have write access to the D headers to interface to C, use const char* instead. If no write access, I would use cast(char*)myString.ptr.Yes, it's external C function and I can modify bindings (just bindings, not ABI). Now I'll trace back library which is interfacing to me and possibly fix bindings. You helped me already, thanks a lot. I can already go on (this language is so cool btw.).
Sep 11 2010
I'm interfacing with Scintilla (C++), but it works in a different way. It uses messages, which allows it to be linked with practically any language. But I can still pass parameters to be modified by passing the address of the variable instead (the wrapper takes care of that). Although linking with C++ is difficult, having proper C linkage is a great thing. There's a ton of libraries out there ready to be used right now in D. 2010/9/11 Mariusz Gliwi=C5=84ski <alienballance gmail.com>:On 2010-09-11 15:13, Simen kjaeraas wrote:otWhy does the function expect a char*? If it is an external C function, and it might change the passed values, you should make a duplicate mutable string, or use char[] in lieu of string. If it is an external C function that will *not* change the passed values, and you have write access to the D headers to interface to C, use const char* instead. If no write access, I would use cast(char*)myString.ptr.Yes, it's external C function and I can modify bindings (just bindings, n=ABI). Now I'll trace back library which is interfacing to me and possibly fix bindings. You helped me already, thanks a lot. I can already go on (this language i=sso cool btw.).
Sep 11 2010
shd:I'm having a problem in passing a value to char* expecting function in D 2.0. Already tried: to!(char*)("my string");A solution, maybe correct: import std.string: toStringz, indexOf; import std.c.string: strlen; import std.stdio: writeln; void main() { string s = "my string"; assert(indexOf(s, '\0') == -1); // useful char* p = cast(char*)toStringz(s); writeln(strlen(p)); } But keep in mind this string p is managed by the D GC. That cast to cast(char*) is not nice. There is no need to dup the string given to toStringz because it performs the dup internally (wasting a initialization of 'copy'), this is the cleaned up implementation of toStringz: const(char)* toStringz(string s) { char[] copy = new char[s.length + 1]; copy[0 .. s.length] = s; copy[s.length] = 0; return copy.ptr; } I don't know why it returns a const(char)* instead of a char*. Do you know why? Bye, bearophile
Sep 11 2010
On Saturday 11 September 2010 09:07:38 bearophile wrote:I don't know why it returns a const(char)* instead of a char*. Do you know why? Bye, bearophileWell, if you look at toStringz()'s implementation, you may notice that there's commented out code which would not make a copy if there's a 0 in memory one passed the end of the string. It would simply use that 0 as the end of the const char* and avoid the copy. That being the case, it avoids a copy but must be const, because the string is immutable. Now, why that code is commented out, I don't know, and if toStringz() continues to always copy the string, then char* would likely be a better choice. But it could be that whatever issue made it so that the non-copying version was commented out will be fixed at some point, and toStringz() will once again cease to make a copy if it doesn't have to, at which point it would need to return const. - Jonathan M Davis
Sep 11 2010
Jonathan M Davis:Well, if you look at toStringz()'s implementation, you may notice that there's commented out code which would not make a copy if there's a 0 in memory one passed the end of the string. It would simply use that 0 as the end of the const char* and avoid the copy. That being the case, it avoids a copy but must be const, because the string is immutable.I see, thank you for the answer. Generally in the C code that uses the C string I can't be certain that it doesn't modify the string. On the other hand often I need a char* and not a const char*. Ao I'd like toStringz() to always copy and return a char* (Often I need a const pointer to mutable chars). Another possibility is to have two functions, one that always performs the copy and returns a char*, and one that sometimes doesn't copy and returns a const char*. Or a single template function that returns a const char* if doconst is true :-) auto toStringz(bool doconst=false)(string s) { ... Bye, bearophile
Sep 12 2010
On 9/11/10 3:00 PM, shd wrote:Hello, I'm having a problem in passing a value to char* expecting function in D 2.0. Already tried: to!(char*)("my string"); but it seems like there (Phobos) is no template like this. Then, tried: cast(char*)to!(char[])("my string") which looked ok, but i think it's not a proper way to do that. Most strings converted this way works properly, but once: char* string1 = cast(char*)to!(char[])("my string 1"); char* string2 = cast(char*)to!(char[])("my string 2"); resulted: string1 = "my string 1" string2 = "my string 1my string 2" I can't manage this problem, could You hint me?Use std.string.toStringz to convert a D string to a C null-terminated one. This asymmetry (no to!(char*)(string)) has been discussed once, but I can't remember the reason why it was not implemented right now.
Sep 14 2010