Könnte der Schlüssel von mehr als einem Mapping auf denselben Speicherplatz zeigen?

Da Speicher bereits auf ( array[0] = value;) zugewiesen ist, möchte ich nur den Wert des Zeigeschlüssels ändern. So array[1]kann ich valuejetzt zugreifen.

Ist es möglich, den Schlüssel eines bereits zugeordneten Speichers zu ändern?

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.

Wenn ich also eine Änderung an array[1]ihr vornehme, sollte sie auch eine Änderung an der array[0].

Vielen Dank für Ihre wertvolle Zeit und Hilfe.

Antworten (1)

Habe gerade gemerkt, dass ich die falsche Frage beantwortet habe.

Was Sie vorschlagen, sollte funktionieren. Die einzige wirkliche Sorge ist, dass Sie die Semantik dessen, wie einiges davon funktioniert, möglicherweise nicht verstehen.

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;


Ich bin mir nicht sicher, ob dies genau das ist, was Sie wollen, aber Sie können rückwärts arbeiten, um mit diesem Beispiel genau das zu bekommen, was Sie brauchen.

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

Grundsätzlich besteht meine Problemumgehung darin, nur Zuordnungen zu haben, die aufeinander zeigen, anstatt dieselben Daten zweimal zu speichern. Solange Sie immer in den Basis-Mapping-Wert umrechnen können, macht es für Solidity keinen Unterschied und Sie müssen nicht die doppelten Kosten für die Speicherung zahlen.

Danke Kumpel, tut mir leid, aber ich habe nicht verstanden, was Sie vorschlagen. Ja, es funktioniert, weist aber auch array[1] = array[0]zusätzlichen Speicherplatz zu, array[1]den ich nicht möchte. @cryptihkal