¿Podría más de una clave de mapeo apuntar al mismo espacio de memoria?

Dado que la memoria ya está asignada en ( array[0] = value;), solo quiero cambiar su valor de clave señaladora. Tal como array[1]me permitirá acceder valueahora.

¿Es posible cambiar la clave de la memoria ya mapeada?

mapping(uint => uint) array;
uint value   = 10;

array[0] = value;              //memory is allocated, pointed by [0]. 

array[1] = array[0]'s_address; //I do want [1] to point same memory location as [0] without creating new memory space. 
//or
uint value_addr;
assembly { value_addr := value }
array[1] -> value_addr; //if possible, at this stage array[1] should also point to the value's memory space.

array[0] -> NULL; //`array[0]` should point empty memory space.

Como resultado, cuando hago un cambio en array[1]él, también debería hacer un cambio en el archivo array[0].

Gracias por su valioso tiempo y ayuda.

Respuestas (1)

Acabo de darme cuenta de que respondí la pregunta equivocada.

Lo que sugieres debería funcionar. La única preocupación real es que es posible que no entiendas la semántica de cómo funciona algo de esto.

uint value = 10; mapping(uint => uint) public array;

array[0] = value; // Either of the following will result in what you want because // ultimately you aren't pointing to a memory location, but assigning // a value. array[1] = array[0]; array[1] = value; // In order to "unassign" the mapping value at the previous // index, simply change the value of the mapping to its unassigned value array[0] = 0;


No estoy seguro de si esto es exactamente lo que desea, pero puede trabajar hacia atrás para obtener específicamente lo que necesita con este ejemplo.

struct Meta { string data; uint64 timestamp; } public uint256 meta_count; mapping (bytes32 => Meta) meta; mapping (uint256 => bytes32) history; function create(bytes32 id, string data) { meta[id] = Meta( { data: data, timestamp: uint64(now) }); history[meta_count] = id; meta_count += 1; } function get_data_by_id(bytes32 id) constant returns(string data) { return meta[id].data; } function get_data_by_index(uint256 index) constant returns(string data) { return meta[history[index]].data; }

Básicamente, mi solución es tener asignaciones que apunten entre sí en lugar de almacenar los mismos datos dos veces. Siempre que pueda convertirlo al valor de mapeo base, Solidity no tendrá ninguna diferencia y no tendrá que pagar el doble del costo del almacenamiento.

Gracias compañero, lo siento, pero no entendí lo que sugieres. Sí, funciona, pero array[1] = array[0]también asigna espacio de memoria adicional array[1]que no quiero. @cryptihkal