digitalmars.D - printf() access violation
- tocy ize.co.jp (11/11) Apr 18 2005 Hi, all.
- Derek Parnell (27/39) Apr 18 2005 This is because printf expects zero-terminated C-style strings, and in D...
- jicman (16/27) Apr 18 2005 I stopped using printf. It's for c,c++ folks. ;-) Try using writefln o...
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (11/14) Apr 18 2005 You really *need* to "import std.c.stdio;" to get the printf function...
- jicman (4/18) Apr 19 2005 Yeah, I haven't had much time to look at the libraries at all. Too litt...
Hi, all.
int main()
{
char[] testString = "test";
printf("%s\n",testString);
return 0;
}
Error: Access Violation
It seems does not work.
dmd ver 0.121
WinXP
 Apr 18 2005
On Mon, 18 Apr 2005 09:12:01 +0000 (UTC), tocy ize.co.jp wrote:
 Hi, all.
 
 int main()
 {
 char[] testString = "test";
 printf("%s\n",testString);
 return 0;
 }
 
 Error: Access Violation
 
 It seems does not work.
This is because printf expects zero-terminated C-style strings, and in D a
char[] is not the same as a C-styled string. In D, all dynamic arrays look
like a struct containing two fields; a length and a pointer to the data.
Thus when you pass 'testString' to printf, what gets put on the stack for
printf is the struct. Thus printf gets two values - a length and a pointer.
So its as if you had coded ...
   printf("%s\n", testString.length, testString.ptr);
So it crashes because printf tries to use the length value as if it was a
pointer to a C-string.
The correct way to use D-strings with printf is  ...
   printf("%.*s\n",testString);
The '.*' causes printf to use the next parameter as a length and the
subsequent one as the data pointer - which is what you actually passed it.
However, a much better alternative is to use the writef routine instead
because that understands D-strings.
 import std.stdio; // required to get writef.
 int main()
 {
 char[] testString = "test";
 writef("%s\n",testString);
 return 0;
 }
-- 
Derek
Melbourne, Australia
18/04/2005 7:25:26 PM
 Apr 18 2005
I stopped using printf.  It's for c,c++ folks. ;-)  Try using writefln or
writef.
And this brings a point that I was trying to make for a while, but time is not
on my side, as of late: why do I have to do,
import std.stdio;
to get writef, etc., to work?  If these are d's environment "printers", if I may
call them that, should they be loaded (or part of) the normal libraries?  For
example, I don't need to load printf at all.  It's already part of the system.
Which I find interesting, since writef* is the right d utility to show console
output.
Any ideas?
I would love to have the day when I have to import printf and not writef*.
Just a thought... BTW, I should say that I am going home sick and maybe
delirious... Ñ'=
josé
tocy ize.co.jp says...
Hi, all.
int main()
{
char[] testString = "test";
printf("%s\n",testString);
return 0;
}
Error: Access Violation
It seems does not work.
dmd ver 0.121
WinXP
 Apr 18 2005
jicman wrote:For example, I don't need to load printf at all. It's already part of the system. Which I find interesting, since writef* is the right d utility to show console output.You really *need* to "import std.c.stdio;" to get the printf function... IMHO, Walter has just hacked printf into object.d for his own debugging. Please start importing it now, and less things breaks when it's fixed ? (assuming no major changes to D, like more modules implicitly imported) Or import std.stdio and use writef, which might be a better solution. (as suggested in your original posting, writef is more suited to D) --anders PS. You can see where it was commented out from, in std/c/stdio.d : //int printf(char *,...); //int wprintf(wchar_t *, ...);
 Apr 18 2005
Yeah, I haven't had much time to look at the libraries at all. Too little time. Thanks for the insight. jic =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= says...jicman wrote:For example, I don't need to load printf at all. It's already part of the system. Which I find interesting, since writef* is the right d utility to show console output.You really *need* to "import std.c.stdio;" to get the printf function... IMHO, Walter has just hacked printf into object.d for his own debugging. Please start importing it now, and less things breaks when it's fixed ? (assuming no major changes to D, like more modules implicitly imported) Or import std.stdio and use writef, which might be a better solution. (as suggested in your original posting, writef is more suited to D) --anders PS. You can see where it was commented out from, in std/c/stdio.d : //int printf(char *,...); //int wprintf(wchar_t *, ...);
 Apr 19 2005








 
  
  
 
 Derek Parnell <derek psych.ward>
 Derek Parnell <derek psych.ward> 