Pregunta sobre arreglos dinámicos

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é?

Si llama setTest2(0,1)a una matriz de una longitud de 0, no funcionará.
Su longitud es 0? ¿Cómo? ¿Está en algún lugar de los documentos? no puedo encontrarlo...
Si no presionó nada antes, sí, su matriz está vacía, e intentar establecer algún valor en cualquier posición fallará

Respuestas (3)

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 1en la posición 0. Después de eso, llama a setTest2(0,1), que establece en la posición 0el 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.

Gracias y tiene sentido. Me di cuenta de que mi pregunta no cubría la pregunta inicial. Lo edité.

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.

Sí, tienes razón y tiene sentido. Me di cuenta de que mi pregunta no cubría la pregunta inicial. Lo edité.