[Issue 4629] BufferedFile.printf() wants char[] as first argument

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Aug 29 18:43:11 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4629


Andrej Mitrovic <andrej.mitrovich at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich at gmail.com


--- Comment #1 from Andrej Mitrovic <andrej.mitrovich at gmail.com> 2010-08-29 18:42:59 PDT ---
Casting a string literal to a char[] is esentially undefined behavior. If you
need a char[] out of a string literal, use .dup:

import std.stream: BufferedFile, FileMode;

void main() 
{
    auto f = new BufferedFile("testfile.t", FileMode.Out);

    f.printf("%d\n".dup, 10);
    f.close();
}

I'm guessing printf takes a char[] due to it's C heritage? So far I've seen a
lot of D1 code that uses char[] and when porting it to D2 one needs to either
change all declarations/arguments to use a string, or at the very least use
.dup when passing string literals to functions taking char[].


(In reply to comment #0)
> Using dmd 2.048 on this code:
> 
> 
> import std.stream: BufferedFile, FileMode;
> void main() {
>     auto f = new BufferedFile("testfile.t", FileMode.Out);
>     f.printf("%d\n", 10);
>     f.close();
> }
> 
> 
> It shows the errors:
> test.d(4): Error: function std.stream.Stream.printf (char[] format,...) is not
> callable using argument types (string,int)
> test.d(4): Error: cannot implicitly convert expression ("%d\x0a") of type
> string to char[]
> 
> 
> This gives no errors:
> f.printf(cast(char[])"%d\n", 10);

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list