www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3938] New: semantics of casting arrays need to be reworked

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3938

           Summary: semantics of casting arrays need to be reworked
           Product: D
           Version: 2.000
          Platform: All
               URL: http://www.digitalmars.com/d/arrays.html
        OS/Version: All
            Status: NEW
          Keywords: rejects-valid, spec
          Severity: major
          Priority: P2
         Component: www.digitalmars.com
        AssignedTo: nobody puremagic.com
        ReportedBy: mrmocool gmx.de
            Blocks: 2494



It needs to be clarified when a reinterpret_cast is done and when the elements
are converted to the new type depending on whether it is an array literal,
another array expression, an array of structs, classes or interfaces AND
whether it is a constant array or not.
A sane and consistent solution is required.


The only information at all is hidden deep inside the huge expressions
documentation:
http://www.digitalmars.com/d/2.0/expression.html#ArrayLiteral

What is the rationale for this inconsistency?

(Also, is this information correct? For example I thought array literals are
dynamic arrays now ("The AssignExpressions form the elements of a static
array")?
Additionally: "The type of the first element is taken to be the type of all the
elements" ->
http://www.digitalmars.com/d/archives/digitalmars/D/casting_array_literals_doesn_t_work_as_stated_in_the_docs_104333.html#N104334)


We already had several discussions about it here:
http://www.digitalmars.com/d/archives/digitalmars/D/learn/converting_a_byte_array_to_a_struct_array_18526.html
followed by
http://www.digitalmars.com/d/archives/digitalmars/D/casting_array_literals_doesn_t_work_as_stated_in_the_docs_104333.html


For example, I want a byte array to be saved in the executable file which is
reinterpreted in the code as RGB structs:

RGB[256] PALETTE = cast(RGB[256]) [
    0x00, 0x00, 0x00, 0xE3, 0x53, 0x00,
    0xCF, 0x4B, 0x07, 0xBF, 0x43, 0x0F, ...

doesn't work cause of "non-constant expression"

RGB[256] PALETTE = (cast(RGB[]) [
    0x00, 0x00, 0x00, 0xE3, 0x53, 0x00,
    0xCF, 0x4B, 0x07, 0xBF, 0x43, 0x0F, ...
]) (0 .. 256);

compiles, but yields empty structs (cause it tries to cast each element to a
struct instance if I'm not mistaken)

RGB[] PALETTE = (cast(RGB*) cast(ubyte[]) [...])[0..256];

makes it work, but of course it's a bit hacky.


Also see:
http://codepad.org/OGjXADdu
and my answer:
http://codepad.org/bvk63OPw

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 12 2010
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3938


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla digitalmars.com
         Resolution|                            |WORKSFORME



15:46:01 PST ---
Already done,

dlang.org/expression.html#CastExpression

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