digitalmars.D.learn - char* vs char[]
- jicman <jicman mail.com> Dec 16 2006
- "Jarrett Billingsley" <kb3ctd2 yahoo.com> Dec 16 2006
- jicman <jicman mail.com> Dec 16 2006
- novice2 <sorry noem.ail> Dec 18 2006
- Stewart Gordon <smjg_1998 yahoo.com> Dec 20 2006
- novice2 <sorry noem.ail> Dec 21 2006
Feliz Navidad.
I have not being reading the newsgroups, because of a few projects
that I have going on. I am trying to get D into my company. It's
not going to be easy, but I am positive. :-)
So I have this module that gets some environment variables from the
system. Here is some code:
//-------------------------------------------------------
extern (C)
{
char* getenv (char *);
int putenv (char *);
}
char[] GetEnv(char[] pSymbol)
{
return std.string.toString(getenv(pSymbol));
}
int PutEnv(char[] eVar, char[] eVal)
{
int i = putenv(eVar ~ "=" ~ eVal);
return i;
}
char[] GetServerName()
{
// returns the Hostname on the local computer
char[] sn = GetEnv("COMPUTERNAME");
return sn;
}
//-------------------------------------------------------
I copied it from the group a few years ago. So, now, with this
new .177 release I get this new error:
..\jic\libs\MyOSEnv.d(32): function jic.libs.MyOSEnv.getenv (char*)
does not match parameter types (char[])
..\jic\libs\MyOSEnv.d(32): Error: cannot implicitly convert
expression (pSymbol) of type char[] to char*
..\jic\libs\MyOSEnv.d(37): function jic.libs.MyOSEnv.putenv (char*)
does not match parameter types (char[])
..\jic\libs\MyOSEnv.d(37): Error: cannot implicitly convert
expression ((eVar) ~ "=" ~ (eVal)) of type char[] to char*
How can I fix this? Will someone be willing to point me on the
right direction?
Thanks,
josé
Dec 16 2006
"jicman" <jicman mail.com> wrote in message news:em2fih$1ks5$1 digitaldaemon.com...How can I fix this? Will someone be willing to point me on the right direction?
The implicit conversion from D array to pointer has been removed in 0.177. All you need to do is add ".ptr" to convert from arrays to pointers now. Though since you have no way of knowing whether or not the passed-in strings are zero-terminated, you should use toStringz whenever passing D strings to C functions. return toString(getenv(toStringz(pSymbol)));
Dec 16 2006
== Quote from Jarrett Billingsley (kb3ctd2 yahoo.com)'s article"jicman" <jicman mail.com> wrote in message news:em2fih$1ks5$1 digitaldaemon.com...How can I fix this? Will someone be willing to point me on the right direction?
All you need to do is add ".ptr" to convert from arrays to
Though since you have no way of knowing whether or not the passed-
are zero-terminated, you should use toStringz whenever passing D
C functions. return toString(getenv(toStringz(pSymbol)));
thanks.
Dec 16 2006
== Quote from jicman (jicman mail.com)'s articleare zero-terminated, you should use toStringz whenever passing D
C functions. return toString(getenv(toStringz(pSymbol)));
in non-english Windows, for my big sorrow, imho, you need use std.windows.charset.toMBSz() to pass char[] from D to C function, and std.windows.charset.fromMBSz() to pass char[] from C function to D, in general case in _every char* in every call_ :( how i bored with utf8 while program small windows console utilitis : ( "invalid UTF8 sequence" on every time then i forget about fromMBSz() it is very tiresome!
Dec 18 2006
novice2 wrote: <snip>in non-english Windows, for my big sorrow,
The language of your version of Windows has no effect whatsoever on what follows.imho, you need use std.windows.charset.toMBSz() to pass char[] from D to C function, and std.windows.charset.fromMBSz() to pass char[] from C function to D,
Not quite. C functions can, as they please, work in any character encoding or not care at all about encoding. But if you're interfacing the OS, as is the case here, then you will need to make sure the data you're transmitting is in the right encoding.in general case in _every char* in every call_ :( how i bored with utf8 while program small windows console utilitis : (
Check out smjg.libs.util.console in my utility library: http://pr.stewartsplace.org.uk/d/sutil/ Stewart.
Dec 20 2006
== Quote from Stewart Gordon (smjg_1998 yahoo.com)'s articleNot quite. C functions can, as they please, work in any character encoding or not care at all about encoding.
You are right. But.. i was not saw C libraries, working with utf8. I just wanted to warn this topic author, that if we have C function prototype, using char* params, it is very very low probability, that this char* means utf8 string. In Windows at least. And i never saw utf8 functions in Windows API. He will have "invalid utf8 sequence" if will not convert to utf8 strings, that returned from C function. And i wanted to complain, that in D it is bored to interface with Windows :)Check out smjg.libs.util.console in my utility library: http://pr.stewartsplace.org.uk/d/sutil/
Thank you!
Dec 21 2006








novice2 <sorry noem.ail>