Al tratar de trabajar con una lista enlazada, me encontré con este comportamiento extraño. Aquí el código
contract Test{
struct Node{
uint x;
uint linked; //index to next
bool nil;
}
Node [] public nodes;
function Test(){
nodes.push(Node(59,1,false));
nodes.push(Node(100,2,false));
nodes.push(Node(0,0,true));
}
function remove(uint nodeIdx){
Node node = nodes[nodeIdx];
Node linked = nodes[node.linked];
}
}
Si llamo a remove(1) debería esperar ver un nodo igual a {100,2,false}, pero en el depurador obtuve lo siguiente
O, en otras palabras, node.x se valora con la longitud de la matriz de nodos. me pregunto porque
Además,
Node storage node=nodes[nodeIdx]
da el mismo resultadoProbé tu código.
Si hubiera ido más lejos en la depuración de la transacción, habría visto que se establecen los valores correctos para node
y linked
.
declarar el almacenamiento local de var Node node=nodes[nodeIdx] da el mismo resultado
Usar storage
significa que desea modificar el estado del contrato. No lo hace, por lo que debe usar memory
el que es más barato también.
david c
supakaidad
nodes[i].linked = newIndex
.david c
supakaidad