sscanf() compile errors (changed since dmd v0.118)?

AEon aeon2001 at lycos.de
Thu Sep 18 11:55:35 PDT 2008


Jarrett Billingsley wrote:
> On Thu, Sep 18, 2008 at 8:26 AM, AEon <aeon2001 at lycos.de> wrote:
>> Continuing to compile my 3.5 year old D code, the compiler yields this
>> error:
>>
>>
>> dmd -c -w -version=db_log -I. aepar_p_q3a.d
>> aepar_p_q3a.d(189): function std.c.stdio.sscanf (char*,char*,...)
>>                    does not match parameter types (char[],char[],int*,int*)
>> aepar_p_q3a.d(189): Error: cannot implicitly convert expression (line)
>>                    of type char[] to char*
>> aepar_p_q3a.d(189): Error: cannot implicitly convert expression (ttempl)
>>                    of type char[] to char*
>>
>>
>> aepar_p_q3a.d:
>> ---snip---
>> int rip_Time_in_Seconds( char[] line )
>> {
>>    char[] ttempl = "%d:%d";    // Time Template
>>    int min, sec;
>>
>>    int ret = sscanf( line, ttempl, &min, &sec );       // Line 189
>>    int uptime = min * 60 + sec;
>>
>>    return uptime;
>> }
>> ---snip---
>>
>>
>> I want to keep using "char[] line" from my main function, so
>> what would be the clean way to avoid the compiler error?
>>
>> Would casting be "good"? :
>>
>>    int ret = sscanf( cast(char*)line, cast(char*)ttempl, &min, &sec );
>>
>> Works, no compiler error, but am I hacking something I should not?
> 
> Implicit conversion from T[] to T* was removed for exactly this kind
> of case -- accidentally passing a D-style string to a function that
> expects a C-style string.  ttempl.ptr should work since the D compiler
> implicitly zero-terminates string literals, but line.ptr will probably
> not work since line could come from anywhere and may or may not have a
> terminating NUL character.  The proper way to do it is to
> toStringz(line).

I had forgotten all about toStringz(). Using it now, code seems to work.

AEon






More information about the Digitalmars-d-learn mailing list