Поскольку память уже выделена на ( 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]
.
Спасибо за ваше драгоценное время и помощь.
Только что понял, что ответил не на тот вопрос.
То, что вы предлагаете, должно работать. Единственная реальная проблема заключается в том, что вы можете не понимать семантику того, как это работает.
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