• Check out the results of the Techtree Contest #19!
  • Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • Create a void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 22nd Icon Contest: Creep Abilities is now concluded, time to vote for your favourite set of icons! Click here to vote!

Array-extending Structs with non-static arrays

Status
Not open for further replies.
Level 7
Joined
Jan 30, 2011
Messages
267
JASS:
struct XY extends array
    integer array xy[10]
endstruct
this makes the compiler piss
is there a way to create a custom allocator for the arrays in order to be able to use them in array structs?

EDIT:
would solve it like this, but is there a way to use [] syntax without creating another struct?
JASS:
struct XY extends array
    private static integer array xy_p

    method get_xy takes integer i returns integer //method operator xy[] sadly cant be declared
        return thistype.xy_p[i + 10*this]
    endmethod

    method set_xy takes integer i, integer x returns nothing
        set thistype.xy_p[i + 10*this] = x
    endmethod
endstruct
 
I don't see any way to do so with Vexorian's jasshelper. You can suggest it here, though.

Personally, I had the same problem and I simply didn't use "extends array" and added this kind of line in my custom allocator :

JASS:
set s__XY_xy[this]=this*ARRAYSIZE

That's dirty and it creates the unneeded allocators but it works. You use the array with "this.xy" normally after that. It compiles into "s___XY_xy[s__XY_xy[this]+i]".
 
if you didnt use "extends array" why did you do that custom lane at all? when ur not extending array then you can create non-static arrays and they work properly
 
They work properly only if you use the structure's allocator (.allocate()).
The point of using "extends array" is to create your own allocator/deallocator, it has no other purpose.

My allocator is more complicated, but it could have ressemble to that :
JASS:
struct MyStruct
    real array x[10]

    static integer AllocIndex = 1

    static method create takes nothing returns MyStruct
        local MyStruct this = MyStruct.AllocIndex
        set MyStruct.AllocIndex = MyStruct.AllocIndex+1
        set s__MyStruct_x[this] = this*10
        return this
    endmethod

endstruct
There, if I didn't add the line, the array wouldn't work because I never ever call MyStruct.allocate().
Btw, if you don't declare a static method "create", the .create() and .allocate() are precompiled into exactly the same call.
 
Status
Not open for further replies.
Back
Top