Actualmente estoy jugando con Solidity y arreglos dinámicos. Tengo el siguiente código:
contract Test{
int256[] public test;
function setTest(int256 b) public{
test.push(b);
}
function setTest2(uint256 a, int256 b) public {
test[a] = b;
}
}
Ejecuté el código en remix. Cuando llamo a setTest(1) y llamo a getter test(0), el resultado es 1. Si hago lo mismo con setTest2(0, 1) y luego llamo a getter, el valor no parece guardarse. no entiendo porque ¿Alguien podría explicar qué está pasando aquí?
Gracias de antemano.
Me di cuenta de que mi pregunta no es muy clara y haré la pregunta aquí y esta vez más clara. Gracias por las otras respuestas ya.
Llamo a la función setTest2(0, 1)
y luego llamo al captador, remix me muestra que el valor en la posición 0 es 0 y no 1. Cuando llamo a la setTest(2)
función y luego llamo al captador, el valor 2 está en la posición 0 de la matriz y no en la posición 1. Esto significa que no se ha guardado el valor de la primera llamada. ¿Por qué?
Al usar matrices dinámicas, no puede usar DynamicArray[a] = b, si la posición a aún no está ocupada por la función de inserción. Si fuera una matriz estática, entonces funcionaría.
Cuando llama setTest(1)
, su matriz contiene 1
en la posición 0
. Después de eso, llama a setTest2(0,1)
, que establece en la posición 0
el valor 1
.
El valor es el mismo, por lo que no notarás ninguna diferencia. Si llamas setTest2(0,5)
, verás que será diferente.
En cuanto a su edición.
Acabo de verificar y parece que llamar setTest()
a una posición de la matriz, que no se ha inicializado previamente, no funciona. En otras palabras, puede usar eso para cambiar un valor, pero no agregar uno nuevo.
Por eso setTest()
siempre empiezas por el principio. Primero debe empujar un nuevo elemento a una posición para que setTest2()
tenga algún efecto.
Eliseo Drión
setTest2(0,1)
a una matriz de una longitud de 0, no funcionará.Rosquilla
Eliseo Drión