Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarse
Eventos Actuales
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte
 

 [Snipet] Dimensional-Array

Ver el tema anterior Ver el tema siguiente Ir abajo 
Ir a la página : 1, 2  Siguiente
AutorMensaje
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Dom Abr 12, 2015 8:33 pm

Dimensional-Array

Guarda valores en multiples dimensiones (hasta 4 como maximo):
[jass]
local Array data = Array.create()

set data[0].handle = GetTriggerUnit()
set data[0][0].integer = 8191
set data[0][0][0].real = 0.03
set data[0][0][0][0].string = "test"

call data.destroy()
[/jass]

[jass]library DimensionalArray/*
****************************************************************************************
*
* DimensionalArray
* ________________
* v2.0.1.1
* by Thelordmarshall
*
* ________
* /_/_/_/_/|
* /_/_/_/_/|/|
* /_/_/_/_/|/|/|
* /_/_/_/_/|/|/|/|
* |_|_|_|_|/|/|/|/
* |_|_|_|_|/|/|/
* |_|_|_|_|/|/
* |_|_|_|_|/
*
*
* Dimensional-Array is a tool that maximizes the use of the hashtable allowing
* the user to feel comfortable with their easy and complete interface.
*
* Why use Dimensional-Array?
* __________________________
*
* This resource was created for the purpose of having a multi-dimensional
* environment; in this case 4D. It should be noted that initially figured that use
* more than 4 dimensions were necessary, but in warcraft III is not.
*
* API:
* ___
*
* struct Array extends ArrayCore
* - static method create takes nothing returns Array
* - method destroy takes nothing returns nothing
* - method flush takes nothing returns nothing
* - method operator [] takes integer id returns ArrayDimensional
* - method operator $TYPE$= takes $TYPE$ value returns nothing
* - save handle, real, integer, boolean or string.
* - method operator $TYPE$ takes nothing returns $TYPE$
* - unit, player, integer, string, etc...
* - method has$TYPE$ takes nothing returns boolean
* - method remove$TYPE$ takes nothing returns nothing
*
* Credits:
* ________
* - looking_for_help: for their suggestions.
*
****************************************************************************************/

globals
private hashtable h=InitHashtable()
private integer key=0
private integer size=0
private integer keySize=0
private string array keyId
endglobals

private struct ArrayCore

private method operator hash takes nothing returns hashtable
if(0 set key=StringHash(keyId[keySize])
set keyId[keySize]=""
if(0 set keySize=keySize-1
endif
return h
endif
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"[Dimensional-Array] error: attempted to save/get value from invalid Array instance: ("+I2S(this)+" )")
return null
endmethod

//! textmacro ARRAY_OPERATOR takes OPERATOR,ARGUMENT,FUNC1,FUNC2
method operator $OPERATOR$= takes $ARGUMENT$ value returns nothing
call Save$FUNC1$(.hash,this,key,value)
endmethod

method has$FUNC2$ takes nothing returns boolean
return HaveSaved$FUNC2$(.hash,this,key)
endmethod

method remove$FUNC2$ takes nothing returns nothing
call RemoveSaved$FUNC2$(.hash,this,key)
endmethod
//! endtextmacro

//! runtextmacro ARRAY_OPERATOR("boolean","boolean","Boolean","Boolean")
//! runtextmacro ARRAY_OPERATOR("handle","agent","AgentHandle","Handle")
//! runtextmacro ARRAY_OPERATOR("integer","integer","Integer","Integer")
//! runtextmacro ARRAY_OPERATOR("real","real","Real","Real")
//! runtextmacro ARRAY_OPERATOR("string","string","Str","String")

//! textmacro ARRAY_TYPE takes TYPEA,TYPEB
method operator $TYPEA$ takes nothing returns $TYPEA$
return Load$TYPEB$(.hash,this,key)
endmethod
//! endtextmacro

// type list:
//=========================| Type | FuncType |================
//! runtextmacro ARRAY_TYPE( "boolean", "Boolean" )
//! runtextmacro ARRAY_TYPE( "boolexpr", "BooleanExprHandle" )
//! runtextmacro ARRAY_TYPE( "button", "ButtonHandle" )
//! runtextmacro ARRAY_TYPE( "defeatcondition", "DefeatConditionHandle" )
//! runtextmacro ARRAY_TYPE( "destructable", "DestructableHandle" )
//! runtextmacro ARRAY_TYPE( "dialog", "DialogHandle" )
//! runtextmacro ARRAY_TYPE( "effect", "EffectHandle" )
//! runtextmacro ARRAY_TYPE( "fogmodifier", "FogModifierHandle" )
//! runtextmacro ARRAY_TYPE( "fogstate", "FogStateHandle" )
//! runtextmacro ARRAY_TYPE( "force", "ForceHandle" )
//! runtextmacro ARRAY_TYPE( "group", "GroupHandle" )
//! runtextmacro ARRAY_TYPE( "hashtable", "HashtableHandle" )
//! runtextmacro ARRAY_TYPE( "image", "ImageHandle" )
//! runtextmacro ARRAY_TYPE( "integer", "Integer" )
//! runtextmacro ARRAY_TYPE( "item", "ItemHandle" )
//! runtextmacro ARRAY_TYPE( "itempool", "ItemPoolHandle" )
//! runtextmacro ARRAY_TYPE( "leaderboard", "LeaderboardHandle" )
//! runtextmacro ARRAY_TYPE( "lightning", "LightningHandle" )
//! runtextmacro ARRAY_TYPE( "location", "LocationHandle" )
//! runtextmacro ARRAY_TYPE( "multiboard", "MultiboardHandle" )
//! runtextmacro ARRAY_TYPE( "multiboarditem", "MultiboardItemHandle" )
//! runtextmacro ARRAY_TYPE( "player", "PlayerHandle" )
//! runtextmacro ARRAY_TYPE( "quest", "QuestHandle" )
//! runtextmacro ARRAY_TYPE( "questitem", "QuestItemHandle" )
//! runtextmacro ARRAY_TYPE( "real", "Real" )
//! runtextmacro ARRAY_TYPE( "rect", "RectHandle" )
//! runtextmacro ARRAY_TYPE( "region", "RegionHandle" )
//! runtextmacro ARRAY_TYPE( "sound", "SoundHandle" )
//! runtextmacro ARRAY_TYPE( "string", "Str" )
//! runtextmacro ARRAY_TYPE( "texttag", "TextTagHandle" )
//! runtextmacro ARRAY_TYPE( "timerdialog", "TimerDialogHandle" )
//! runtextmacro ARRAY_TYPE( "timer", "TimerHandle" )
//! runtextmacro ARRAY_TYPE( "trackable", "TrackableHandle" )
//! runtextmacro ARRAY_TYPE( "triggeraction", "TriggerActionHandle" )
//! runtextmacro ARRAY_TYPE( "triggercondition","TriggerConditionHandle" )
//! runtextmacro ARRAY_TYPE( "event", "TriggerEventHandle" )
//! runtextmacro ARRAY_TYPE( "trigger", "TriggerHandle" )
//! runtextmacro ARRAY_TYPE( "ubersplat", "UbersplatHandle" )
//! runtextmacro ARRAY_TYPE( "unit", "UnitHandle" )
//! runtextmacro ARRAY_TYPE( "unitpool", "UnitPoolHandle" )
//! runtextmacro ARRAY_TYPE( "widget", "WidgetHandle" )
endstruct

//! textmacro ARRAY_DIMENSIONAL takes NAME,RETURNS,EXTENDS
private struct $NAME$ extends $EXTENDS$
method operator [] takes integer id returns $RETURNS$
set keyId[keySize]=keyId[keySize]+","+I2S(id)
return this
endmethod
endstruct
//! endtextmacro

//! runtextmacro ARRAY_DIMENSIONAL("Array4D","ArrayCore","array")
//! runtextmacro ARRAY_DIMENSIONAL("Array3D","Array4D","ArrayCore")
//! runtextmacro ARRAY_DIMENSIONAL("Array2D","Array3D","ArrayCore")

struct Array extends ArrayCore
method operator [] takes integer id returns Array2D
set keySize=keySize+1
set keyId[keySize]=I2S(id)
return this
endmethod

method flush takes nothing returns nothing
call FlushChildHashtable(h,this)
endmethod

static method create takes nothing returns Array
local thistype this=LoadInteger(h,0,0)
if(0==this)then
set this=size+1
set size=this
else
call SaveInteger(h,0,0,LoadInteger(h,0,this))
endif
return this
endmethod

method destroy takes nothing returns nothing
call .flush()
call SaveInteger(h,0,this,LoadInteger(h,0,0))
call SaveInteger(h,0,0,this)
endmethod
endstruct
endlibrary[/jass]


[Snipet] Dimensional-Array Wc3scr10


Última edición por Thelordmarshall el Miér Abr 20, 2016 5:44 pm, editado 12 veces (Razón : Nueva actualizacion)
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Lun Abr 13, 2015 2:40 pm

Pueden opinar lo que quieran, no tengo prisa Razz


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Lun Abr 13, 2015 10:52 pm

¿No sería mejor usar la instancia como parent key? (para evitar loop en destroy)
¿Por qué el uso de hexadecimales?

Creo, CREO que haciendo uso de pow podrías tener la cantidad de columnas/filas que quieras ([ljass]a[23][43][56][12][...][/ljass]). Y seria algo como:

[jass]integer lastIndex = Pow(lastIndex, newIndex)[/jass]

Habría que ver cómo responder a índices que sean cero.

Escribano @muzk verifique por favor.
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Lun Abr 13, 2015 11:13 pm

Por qué no guardas todos los handle con SaveAgentHandle(hashtable,parentKey,childKey,value) ?

Ahorraría código
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Miér Abr 15, 2015 1:37 am

@Ruke escribió:
¿No sería mejor usar la instancia como parent key? (para evitar loop en destroy)

Al principio creí que no era necesario usarla solo para la instancia por el uso del método operador []... Aunque creo que ya lo tengo parcialmente solucionado Wink

@Ruke escribió:

Creo, CREO que haciendo uso de pow podrías tener la cantidad de columnas/filas que quieras ([ljass]a[23][43][56][12][...][/ljass]).

scratch te refieres al paren/child key? [ljass]miTabla[parent][child][/ljass]

@Marcos_M escribió:
Por qué no guardas todos los handle con SaveAgentHandle(hashtable,parentKey,childKey,value) ?

Ahorraría código

Que raro, nunca vi esta función en la API de hashtables de mi editor de detos; me puse a revisar el common.j y resulta ser que si aparece xdxdxdxd

Es extraño que esta función aparezca en letras negras y no moradas, ustedes tienen este problema?

Pd: Te agregue en los créditos e.e , y pues sí, ahorra bastante código.

Nueva actualización e.e


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Miér Abr 15, 2015 2:56 am

Algo como:

[jass]private integer index

method operator [] takes integer newIndex returns thistype
set this.index = Pow(this.index, newIndex)
return this
endmethod

method get/set takes nothing returns ...
type value = Load/Save...(thistype.hashtable, this, this.index)
set this.index = 1 // reset
return value
endmethod[/jass]
Volver arriba Ir abajo
muzk
Peón
muzk


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Miér Abr 15, 2015 3:21 pm

Mis observaciones:

- No hardcodees valores mágicos, como por ejemplo el hexadecimal que tienes por ahí.

- Me parece que tu [jass]this*0x200 + this.parent[/jass] tiene colisiones. Piensa en este caso:
[jass]
// Instancia 0
parent = 0x200
this = 0
// Instancia 1
parent = 0
this = 1
// Instancia 0: this*0x200 + this.parent = 0 * 0x200 + 0x200 = 0x200
// Instancia 1: this*0x200 + this.parent = 1 * 0x200 + 0 = 0x200
// Colision Smile
[/jass]

- ¿Qué se gana utilizando tu librería?

Por ejemplo, la vieja "FAUX" (que funciona en base a funciones) funciona con una sola Hashtable. Parte te ahorras los GetHandleId, y además tus childkeys están basadas en strings, por lo que al leer el código sabes inmediatamente lo que estás guardando: [jass]call SetHandleHandle(t, "caster", caster)[/jass]. Un problema (de rata, como diría @Ruke) es que usando strings el código te queda más grande, osea, ocupa un poco más de espacio XD, y otro, también de rata, es que no es tan eficiente como usar directamente integers.

Por otro lado, recuerdo que con Table de vexorian podía hacer cosas como [jass]table['A0XA'] = valor // mapeando algun rawcode de abilidad a un valor[/jass], lo cual podía ahorrarte bastante código y hacer que fuese más entendible.

En fin, no creo que se pueda utilizar el enfoque que estás usando debido a las colisiones, tendrías que meter algo como LinkedList entre medio para que funcione sin colisiones.
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Miér Abr 15, 2015 3:26 pm

@muzk escribió:
En fin, no creo que se pueda utilizar el enfoque que estás usando debido a las colisiones, tendrías que meter algo como LinkedList entre medio para que funcione sin colisiones.
(te dije que iba a pasar)

¿Con pow como mencioné no es viable?


Última edición por Ruke el Miér Abr 15, 2015 11:06 pm, editado 1 vez
Volver arriba Ir abajo
muzk
Peón
muzk


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Miér Abr 15, 2015 4:47 pm

Con pow también pueden haber colisiones, además tu solución está reiniciando el index al hacer load por lo que hacer 2 veces load no te da el mismo resultado.
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 12:43 am

@muzk escribió:

- No hardcodees valores mágicos, como por ejemplo el hexadecimal que tienes por ahí.

- Me parece que tu [jass]this*0x200 + this.parent[/jass] tiene colisiones. Piensa en este caso:
[jass]
// Instancia 0
parent = 0x200
this = 0
// Instancia 1
parent = 0
this = 1
// Instancia 0: this*0x200 + this.parent = 0 * 0x200 + 0x200 = 0x200
// Instancia 1: this*0x200 + this.parent = 1 * 0x200 + 0        = 0x200
// Colision Smile
[/jass]

- Recuerda que al alocar NUNCA abra un indice con valor "0", en todo caso el [ljass]method debug[/ljass] se encargara de lanzar el siguiente error: "[HashTable] error: Invalid HashTable instance [0]."

[jass]
//Supongamos que mi parent tiene valor 0 y mi instancia this tiene
//un valor de 1

// Instancia 1: this(1)*0x200(512)+.parent(0) = 512 (1*512+0)
// No colisión ^^

// Instancia "0": this(0)*0x200(512)+.parent(0) = 0 (0*512+0)
[/jass]

@muzk escribió:

- ¿Qué se gana utilizando tu librería?

- Digamos que es una conversión de toda la API de hashtables a una forma mas fácil y entendible de usar (con solo una tabla hash también)

En GUI (API Tradicional):

[gui]
Tabla hash - Save Handle Of(miHandle) as 0 of 1 in (miTabla)
[/gui]

En Jass (API Tradicional):

[jass]
call SaveUnitHandle(miTabla,0,1,miUnidad)
[/jass]

En vJass ("HashTable"):

[jass]
set miTabla[0][1].handle = miHandle
//Creo, creo que esto es entendible  geek
[/jass]

@muzk escribió:

Por ejemplo, la vieja "FAUX" (que funciona en base a funciones) funciona con una sola Hashtable. Parte te ahorras los GetHandleId, y además tus childkeys están basadas en strings, por lo que al leer el código sabes inmediatamente lo que estás guardando: [ljass]call SetHandleHandle(t, "caster", caster)[/ljass]. Un problema (de rata, como diría @Ruke) es que usando strings el código te queda más grande, osea, ocupa un poco más de espacio XD, y otro, también de rata, es que no es tan eficiente como usar directamente integers.

Por otro lado, recuerdo que con Table de vexorian podía hacer cosas como [jass]table['A0XA'] = valor // mapeando algun rawcode de abilidad a un valor[/jass], lo cual podía ahorrarte bastante código y hacer que fuese más entendible.

En fin, no creo que se pueda utilizar el enfoque que estás usando debido a las colisiones, tendrías que meter algo como LinkedList entre medio para que funcione sin colisiones.

- Tu FAUX ofrece otra manera de usar la hashtable, es cuestion de gustos e.e

- Viendo la Table de vexorian creo que solo ofrece guradar valores para integers, strings y handles; no se no me convence e.e

@Ruke: Según leí por allí en hive (tampoco es que todo lo que se consiga allí sea verdad xd) el pow es una función que usa mucha memoria.

Por otro lado; que hace el pow? Pow(0,1) = a que? scratch


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 12:57 am

@thelordmarshall na olvidate, como @muzk menciona con [ljass]Pow[/ljass] habrá colisiones (4^5 == 2^10).
Con el tema de optimización, no le des pelota. Los de Hiveworkshop en este aspecto son muy noobs.
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 1:08 am

@Ruke escribió:

Con el tema de optimización, no le des pelota. Los de Hiveworkshop en este aspecto son muy noobs.

@Ruke se son muy "delicados" What a Face


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
muzk
Peón
muzk


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:07 am

Era un ejemplo para la colisión :'( aquí va corregido:

[jass]
// Instancia 1
parent = 0x200
this = 1
// Instancia 2
parent = 0
this = 2
// Instancia 1: this*0x200 + this.parent = 1 * 0x200 + 0x200 = 2 * 0x200
// Instancia 2: this*0x200 + this.parent = 2 * 0x200 + 0        = 0x200
// Colision Smile
[/jass]

Y FauxTable??? xD (no sé si compila, no lo probé)

[jass]
struct FauxTable

static hashtable ht = InitHashtable()

private integer hash
private integer key

static method create takes handle h returns FauxTable
local thistype this = allocate()
this.hash = GetHandleId(h)
return this
endmethod

method operator [] takes string key returns thistype
this.key = StringHash(key)
return this
endmethod

//! textmacro HASHTABLE_SAVED takes OPERATOR,ARGUMENT,FUNC1,FUNC2
method operator $OPERATOR$= takes $ARGUMENT$ value returns nothing
call Save$FUNC1$(h, this.hash, this.key, value)
endmethod
method has$FUNC2$ takes nothing returns boolean
return HaveSaved$FUNC2$(h, this.hash, this.key)
endmethod
method remove$FUNC2$ takes nothing returns nothing
call RemoveSaved$FUNC2$(h, this.hash, this.key)
endmethod
//! endtextmacro

//! runtextmacro HASHTABLE_SAVED("boolean","boolean","Boolean","Boolean")
//! runtextmacro HASHTABLE_SAVED("handle","agent","AgentHandle","Handle")
//! runtextmacro HASHTABLE_SAVED("integer","integer","Integer","Integer")
//! runtextmacro HASHTABLE_SAVED("real","real","Real","Real")
//! runtextmacro HASHTABLE_SAVED("string","string","Str","String")

method flush takes nothing returns nothing
call FlushChildHashtable(ht, this.hash)
endmethod

method destroy takes nothing returns nothing
call this.flush()
endmethod

//! textmacro HASHTABLE_TYPE takes TYPEA,TYPEB
method operator $TYPEA$ takes nothing returns $TYPEA$
return Load$TYPEB$(h, this.hash, this.key)
endmethod
//! endtextmacro

//! runtextmacro HASHTABLE_TYPE("boolean","Boolean")
//! runtextmacro HASHTABLE_TYPE("boolexpr","BooleanExprHandle")
//! runtextmacro HASHTABLE_TYPE("button","ButtonHandle")
//! runtextmacro HASHTABLE_TYPE("defeatcondition","DefeatConditionHandle")
//! runtextmacro HASHTABLE_TYPE("destructable","DestructableHandle")
//! runtextmacro HASHTABLE_TYPE("dialog","DialogHandle")
//! runtextmacro HASHTABLE_TYPE("effect","EffectHandle")
//! runtextmacro HASHTABLE_TYPE("fogmodifier","FogModifierHandle")
//! runtextmacro HASHTABLE_TYPE("fogstate","FogStateHandle")
//! runtextmacro HASHTABLE_TYPE("force","ForceHandle")
//! runtextmacro HASHTABLE_TYPE("group","GroupHandle")
//! runtextmacro HASHTABLE_TYPE("image","ImageHandle")
//! runtextmacro HASHTABLE_TYPE("integer","Integer")
//! runtextmacro HASHTABLE_TYPE("item","ItemHandle")
//! runtextmacro HASHTABLE_TYPE("itempool","ItemPoolHandle")
//! runtextmacro HASHTABLE_TYPE("leaderboard","LeaderboardHandle")
//! runtextmacro HASHTABLE_TYPE("lightning","LightningHandle")
//! runtextmacro HASHTABLE_TYPE("location","LocationHandle")
//! runtextmacro HASHTABLE_TYPE("multiboard","MultiboardHandle")
//! runtextmacro HASHTABLE_TYPE("multiboarditem","MultiboardItemHandle")
//! runtextmacro HASHTABLE_TYPE("player","PlayerHandle")
//! runtextmacro HASHTABLE_TYPE("quest","QuestHandle")
//! runtextmacro HASHTABLE_TYPE("questitem","QuestItemHandle")
//! runtextmacro HASHTABLE_TYPE("real","Real")
//! runtextmacro HASHTABLE_TYPE("rect","RectHandle")
//! runtextmacro HASHTABLE_TYPE("region","RegionHandle")
//! runtextmacro HASHTABLE_TYPE("sound","SoundHandle")
//! runtextmacro HASHTABLE_TYPE("string","Str")
//! runtextmacro HASHTABLE_TYPE("texttag","TextTagHandle")
//! runtextmacro HASHTABLE_TYPE("timerdialog","TimerDialogHandle")
//! runtextmacro HASHTABLE_TYPE("timer","TimerHandle")
//! runtextmacro HASHTABLE_TYPE("trackable","TrackableHandle")
//! runtextmacro HASHTABLE_TYPE("triggeraction","TriggerActionHandle")
//! runtextmacro HASHTABLE_TYPE("triggercondition","TriggerConditionHandle")
//! runtextmacro HASHTABLE_TYPE("event","TriggerEventHandle")
//! runtextmacro HASHTABLE_TYPE("trigger","TriggerHandle")
//! runtextmacro HASHTABLE_TYPE("ubersplat","UbersplatHandle")
//! runtextmacro HASHTABLE_TYPE("unit","UnitHandle")
//! runtextmacro HASHTABLE_TYPE("unitpool","UnitPoolHandle")
//! runtextmacro HASHTABLE_TYPE("widget","WidgetHandle")

endstruct
[/jass]

[jass]
// onSpell
local timer t = CreateTimer()
local FauxTable ht = FauxTable.create(t)
ht["caster"].unit = GetTriggerUnit()
ht["caster"].player = GetTriggerPlayer()
ht["level"].integer = GetUnitAbilityLevel(ht["caster"].unit, 'A000')
call TimerStart(t, ..., doCallback)
// doCallback
local timer t = GetExpiredTimer()
local FauxTable ht = FauxTable.create(t)
local unit caster = ht["caster"].unit
// etc
call ht.destroy()
[/jass]

Claro que FauxTable.create(t) debería devolver la misma instancia para cada "t", así que faltaría agregarle eso... (opción más simple con una segunda hashtable XD)
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:36 am

@muzk escribió:

[jass]
// Instancia 1
parent = 0x200
this = 1
// Instancia 2
parent = 0
this = 2
// Instancia 1: this*0x200 + this.parent = 1 * 0x200 + 0x200 = 2 * 0x200
// Instancia 2: this*0x200 + this.parent = 2 * 0x200 + 0        = 0x200
// Colision Smile
[/jass]

Okay: 1 + 1 = 2 right? nah mentira xD

Ya lo vi todo... bueno tendré que acomodarlo  Twisted Evil

@muzk escribió:

Y FauxTable??? xD (no sé si compila, no lo probé)

[jass]
struct FauxTable

static hashtable ht = InitHashtable()

private integer hash
private integer key

static method create takes handle h returns FauxTable
local thistype this = allocate()
this.hash = GetHandleId(h)
return this
endmethod

  method operator [] takes string key returns thistype
  this.key = StringHash(key)
       return this
   endmethod

//! textmacro HASHTABLE_SAVED takes OPERATOR,ARGUMENT,FUNC1,FUNC2
   method operator $OPERATOR$= takes $ARGUMENT$ value returns nothing
    call Save$FUNC1$(h, this.hash, this.key, value)
   endmethod
   method has$FUNC2$ takes nothing returns boolean
       return HaveSaved$FUNC2$(h, this.hash, this.key)
   endmethod
   method remove$FUNC2$ takes nothing returns nothing
      call RemoveSaved$FUNC2$(h, this.hash, this.key)
   endmethod
   //! endtextmacro

  //! runtextmacro HASHTABLE_SAVED("boolean","boolean","Boolean","Boolean")
   //! runtextmacro HASHTABLE_SAVED("handle","agent","AgentHandle","Handle")
   //! runtextmacro HASHTABLE_SAVED("integer","integer","Integer","Integer")
   //! runtextmacro HASHTABLE_SAVED("real","real","Real","Real")
   //! runtextmacro HASHTABLE_SAVED("string","string","Str","String")

method flush takes nothing returns nothing
    call FlushChildHashtable(ht, this.hash)
   endmethod

method destroy takes nothing returns nothing
call this.flush()
   endmethod

   //! textmacro HASHTABLE_TYPE takes TYPEA,TYPEB
   method operator $TYPEA$ takes nothing returns $TYPEA$
       return Load$TYPEB$(h, this.hash, this.key)
   endmethod
   //! endtextmacro

//! runtextmacro HASHTABLE_TYPE("boolean","Boolean")
   //! runtextmacro HASHTABLE_TYPE("boolexpr","BooleanExprHandle")
   //! runtextmacro HASHTABLE_TYPE("button","ButtonHandle")
   //! runtextmacro HASHTABLE_TYPE("defeatcondition","DefeatConditionHandle")
   //! runtextmacro HASHTABLE_TYPE("destructable","DestructableHandle")
   //! runtextmacro HASHTABLE_TYPE("dialog","DialogHandle")
   //! runtextmacro HASHTABLE_TYPE("effect","EffectHandle")
   //! runtextmacro HASHTABLE_TYPE("fogmodifier","FogModifierHandle")
   //! runtextmacro HASHTABLE_TYPE("fogstate","FogStateHandle")
   //! runtextmacro HASHTABLE_TYPE("force","ForceHandle")
   //! runtextmacro HASHTABLE_TYPE("group","GroupHandle")
   //! runtextmacro HASHTABLE_TYPE("image","ImageHandle")
   //! runtextmacro HASHTABLE_TYPE("integer","Integer")
   //! runtextmacro HASHTABLE_TYPE("item","ItemHandle")
   //! runtextmacro HASHTABLE_TYPE("itempool","ItemPoolHandle")
   //! runtextmacro HASHTABLE_TYPE("leaderboard","LeaderboardHandle")
   //! runtextmacro HASHTABLE_TYPE("lightning","LightningHandle")
   //! runtextmacro HASHTABLE_TYPE("location","LocationHandle")
   //! runtextmacro HASHTABLE_TYPE("multiboard","MultiboardHandle")
   //! runtextmacro HASHTABLE_TYPE("multiboarditem","MultiboardItemHandle")
   //! runtextmacro HASHTABLE_TYPE("player","PlayerHandle")
   //! runtextmacro HASHTABLE_TYPE("quest","QuestHandle")
   //! runtextmacro HASHTABLE_TYPE("questitem","QuestItemHandle")
   //! runtextmacro HASHTABLE_TYPE("real","Real")
   //! runtextmacro HASHTABLE_TYPE("rect","RectHandle")
   //! runtextmacro HASHTABLE_TYPE("region","RegionHandle")
   //! runtextmacro HASHTABLE_TYPE("sound","SoundHandle")
   //! runtextmacro HASHTABLE_TYPE("string","Str")
   //! runtextmacro HASHTABLE_TYPE("texttag","TextTagHandle")
   //! runtextmacro HASHTABLE_TYPE("timerdialog","TimerDialogHandle")
   //! runtextmacro HASHTABLE_TYPE("timer","TimerHandle")
   //! runtextmacro HASHTABLE_TYPE("trackable","TrackableHandle")
   //! runtextmacro HASHTABLE_TYPE("triggeraction","TriggerActionHandle")
   //! runtextmacro HASHTABLE_TYPE("triggercondition","TriggerConditionHandle")
   //! runtextmacro HASHTABLE_TYPE("event","TriggerEventHandle")
   //! runtextmacro HASHTABLE_TYPE("trigger","TriggerHandle")
   //! runtextmacro HASHTABLE_TYPE("ubersplat","UbersplatHandle")
   //! runtextmacro HASHTABLE_TYPE("unit","UnitHandle")
   //! runtextmacro HASHTABLE_TYPE("unitpool","UnitPoolHandle")
   //! runtextmacro HASHTABLE_TYPE("widget","WidgetHandle")

endstruct
[/jass]

[jass]
// onSpell
local timer t = CreateTimer()
local FauxTable ht = FauxTable.create(t)
ht["caster"].unit = GetTriggerUnit()
ht["caster"].player = GetTriggerPlayer()
ht["level"].integer = GetUnitAbilityLevel(ht["caster"].unit, 'A000')
call TimerStart(t, ..., doCallback)
// doCallback
local timer t = GetExpiredTimer()
local FauxTable ht = FauxTable.create(t)
local unit caster = ht["caster"].unit
// etc
call ht.destroy()
[/jass]

Claro que FauxTable.create(t) debería devolver la misma instancia para cada "t", así que faltaría agregarle eso... (opción más simple con una segunda hashtable XD)

Why why why why? que hiciste con mi tabla tabla xD


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
muzk
Peón
muzk


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:44 am

Tssst se ve re cool FauxTable xD.


Recuerda que te pueden dar cualquier número como parent
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:44 am

@muzk @thelordmarshall quiere hacer un TableArray con espacio dinámico.
Volver arriba Ir abajo
muzk
Peón
muzk


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:48 am

Yeah, por eso no le sirve Pow ni particionar cmo lo estaba haciendo. Tiene que meter de alguna forma linkedlists Wink

EDIT:

Sin cambiar mucho el código:

Nueva struct
[jass]
struct Parent
integer parent
static method parent takes integer parent returns thistype
local thistype this = allocate()
this.parent = parent
return this
endmethod
endstruct
[/jass]

Modificar el []
[jass]
method operator [] takes integer i returns thistype
set .times=.times+1
debug set .s=.s+"["+I2S(i)+"]"
if(.times<=2 and switch==0)then
set .parent=Parent.create(i) // <----------------
set switch=1
elseif(.times<=2 and switch==1)then
set .child=i
set switch=0
endif
return this
endmethod
[/jass]

Etc....

De esa forma, lo que haces es tomar un integer cualquiera y "mapearlo" a un integer entre 1 y 8190 (por el allocate).

Sin embargo para hacerlo funcionar bien tienes que meter harto código más que el struct.


Última edición por muzk el Jue Abr 16, 2015 3:01 am, editado 1 vez
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 2:55 am

@Ruke escribió:
@muzk @thelordmarshall quiere hacer un TableArray con espacio dinámico.
@muzk escribió:
Yeah, por eso no le sirve Pow ni particionar cmo lo estaba haciendo. Tiene que meter de alguna forma linkedlists Wink

I'm working in it right now guys Sleep :risa:

Edit: sera mañana cuando despierte lol .3


[Snipet] Dimensional-Array Wc3scr10
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 11:32 am

[jass]method operator [] takes integer index returns thistype
    local thistype instance = thistype.create()
    set this.integer[index] = instance
    return instance
endmethod

local Table t = Table.create()

//tantos [] como quieras, porque tu lo vales

//set
set t[3][2][4].integer[1] = 4

//get
t[3][2][4].integer[1] // -> 4[/jass]

No lo probé, pero debería funcionar. Eso si, tendrías que almacenar las instancias creadas para que al momento de hacer flush puedas reciclar los ids. También podrías usar un alloc custom que utilice hashtable (en lugar de array) y de esta forma no seria tan necesario el reciclado.
Volver arriba Ir abajo
Avahor
Peón
Avahor


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 37
Reputación Reputación : 5
Monedas de oro : 197
Monedas de Platino : 0 [Snipet] Dimensional-Array Empty

Inventario :
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10
[Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10 [Snipet] Dimensional-Array Empysl10

[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10Jue Abr 16, 2015 9:26 pm

Wooooooo...
se ve hermoso. Yo he sufrido ya algunos problemas por usar multiples hashtables, básicamente datos inubicables. Mi consulta es ¿cual es la ventaja concreta de usar una sola hashtable?, es mas rapido el acceso a la memoria, es una cuestion de orden?
saludos.
Volver arriba Ir abajo
Contenido patrocinado




[Snipet] Dimensional-Array Empty
Mensaje(#) Tema: Re: [Snipet] Dimensional-Array [Snipet] Dimensional-Array Clock10

Volver arriba Ir abajo
 

[Snipet] Dimensional-Array

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 2.Ir a la página : 1, 2  Siguiente

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Aportes :: Librerías-