read Hexadecimal value from string
BCS
ao at pathlink.com
Tue Jul 17 15:44:20 PDT 2007
Reply to Frits,
> BCS wrote:
>
>> Reply to David,
>>
>>> Yep, Tango has some very kool functions. But I do want to point out
>>> that Phobos does have a radix parameter in the toString functions
>>> for converting a number to a string...sadly not the other way
>>> around.
>>>
>> OK, brute force it is ;-b
>> |T fromString(T)(char[] str, uint r)
>> |{
>> | T v = T.min;
>> | goto start;
>> | do
>> | {
>> | v++;
>> | start:
>> | if(toString(v,r) == str) return v;
>> | }while(v != T.max);
>> |}
> :P
>
>> (bonus points if you can find more than three things to object to.)
>>
> Without actually compiling that, I'll list some objections:
> 1) Let's get this one out of the way first: it's brute force. I mean,
> come on!
i++
> 2) Since toString outputs uppercase characters (for digits > 9), this
> doesn't work for strings containing lowercase characters as digits.
i++
> 3) It generates a lot of heap activity for anything that doesn't
> happen
> to be close to T.min (one string per iteration). Probably especially
> problematic for applications with small signed numbers or big numbers.
> This will probably mean lots of GC cycles.
> Arguably a symptom of (1).
i += 0
> 4) It doesn't allow a redundant '+' at the start :P.
i++
> 5) It appears from the Phobos source that toString(long value, uint
> radix) doesn't properly handle negative numbers when radix != 10.
> Though
> I guess that's a Phobos issue, not an issue in your code this cause
> the return value (if any[1]) answer given to be negative for T == long.
> After compiling (and verifying all above issues):
i+=0
> 6) Doesn't compile for T other than long or ulong due to overload
> resolution issues (those are the only two types toString(T, uint
> radix)
> is defined for).
> 7) Very bad error checking. Out-of-range or plain invalid input (and
> input triggering (2), (4) and/or (5)) results in a failed assertion at
> the end of the function due to no return statement being executed. And
> if compiled in release mode it segfaults (executing a 'hlt'
> instruction
> put there by the implicit assert(0) at the end of the function).
i += ulong.max
i>3 => bonus points <g>
> Did I miss anything?
>
goto!!!
> [1]: Due to some of the other issues, control may reach the end of the
> function without returning anything.
>
More information about the Digitalmars-d-learn
mailing list