Может ли более одного ключа сопоставления указывать на одно и то же пространство памяти?

Поскольку память уже выделена на ( array[0] = value;), я просто хочу изменить значение ключа указателя. Например array[1], позволит мне получить доступ valueсейчас.

Можно ли изменить ключ уже отображённой памяти?

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.

В результате, когда я вношу изменения в array[1]него, также должны вноситься изменения в файл array[0].

Спасибо за ваше драгоценное время и помощь.

Ответы (1)

Только что понял, что ответил не на тот вопрос.

То, что вы предлагаете, должно работать. Единственная реальная проблема заключается в том, что вы можете не понимать семантику того, как это работает.

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;


Я не уверен, что это именно то, что вам нужно, но вы можете работать в обратном направлении, чтобы получить именно то, что вам нужно, в этом примере.

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; }

В основном мой обходной путь состоит в том, чтобы просто иметь сопоставления, которые указывают друг на друга, вместо того, чтобы дважды сохранять одни и те же данные. Пока вы всегда можете конвертировать в базовое значение сопоставления, это не имеет значения для Solidity, и вам не нужно платить вдвое больше за хранение.

Спасибо, приятель, извини, но я не понял, что ты предлагаешь. Да, это работает, но array[1] = array[0]выделяет дополнительное пространство памяти array[1], чего я не хочу. @cryptihkal