¿Cómo tener una dirección dentro de una estructura de solidez?

Mi problema

Supongamos que tengo esta estructura:

struct TextThatWorks {
        bytes32 text;
        uint reads;
}

¿ Cómo puedo agregarle una addressvariable?

lo que probé

Intenté simplemente agregar address someadress;dentro de la declaración de estructura, así:

struct TextThatDoesNotWork {
        bytes32 text;
        uint reads;
        address addr;
}

He visto muchos ejemplos haciendo exactamente lo mismo. Ejemplo: Solidity Docs

Pero cuando hago esto, mis funciones se rompen.

¿Qué sucede cuando intento lo anterior?

Que funciona

Entonces, en mi contrato tengo una matriz de texto:

TextThatWorks[] public textArray;

Y tengo una función para recuperar los textos dentro de esta matriz, que devuelve matrices:

function listTexts () public view returns (bytes32[], uint[]) {

        bytes32[] memory texts = new bytes32[](textArray.length);
        uint[] memory readsArray = new uint[](textArray.length);

        for (uint i = 0; i < textArray.length; i++){
            texts[i] = textArray[i].text;
            readsArray[i] = textArray[i].reads;
        }

        return (texts, readsArray);

}

Esto devuelve una buena matriz en el formato[["some hexadecimal example"],[12]]

Qué no funciona

La segunda estructura, TextThatDoesNotWork, solo se diferencia de TextThatWorksporque tiene un addresscampo.

Cuando lo uso, mi listTexts()función deja de funcionar. Siempre devuelve matrices vacías como[[],[],[]]

Para acomodar el campo adicional, mi listTexts()función se convierte en la siguiente:

function listTexts () public view returns (bytes32[], uint[], address[]) {

        bytes32[] memory texts = new bytes32[](textArray.length);
        uint[] memory readsArray = new uint[](textArray.length);
        address[] memory addresses = new address[](textArray.length);

        for (uint i = 0; i < textArray.length; i++){
            texts[i] = textArray[i].text;
            readsArray[i] = textArray[i].reads;
            addresses[i] = textArray[i].addr;
        }

        return (texts, readsArray, addresses);

}

Cómo lleno la matriz

function put(bytes32 _text, uint _reads) public returns (uint){
    return textArray.push(TextThatDoesNotWork({
        text: _text,
        reads: _reads,
        addr: msg.sender
    }))-1;
}

Respuestas (1)

Asegúrese de llenar la matriz correctamente

TextThatDoesNotWork[] textArray;

function put(bytes32 s, uint r, address a) public {
    textArray.push(TextThatDoesNotWork({
        text: s, 
        reads: r,
        addr: a
    }));
}

ingrese la descripción de la imagen aquí

Mira mi edición. Agregué tu código. Lo probé, pero todavía no puedo hacer que funcione. Aunque hay algo pegadizo. Cada vez que ejecuto contract.put("text", 200), obtengo un hash de transacción en la consola, en lugar del índice devuelto por la función. ¿Podría ser el problema la forma en que llamo a la función put()?
Resolvamos los problemas uno por uno, porque el valor de retorno de putla función es otro problema. ¿Qué tiene después de las acciones: contrato de implementación -> llamada put(0x1221, 10)-> llamada listTexts()?
por cierto, contract.put("text", 200)no funcionará, porque el primer parámetro tiene tipo bytes32, necesita convertir la cadena a bytes32, puede usar web3.utils.fromAscii("text")la función
funciona, como se describe en el texto de la pregunta. Supongo que el contrato hace esta conversión por mí. El problema surge cuando agrego el addressatributo a la estructura. Simplemente deja de funcionar, pero antes de agregar ese atributo, ¡funciona!
Estoy usando la consola geth para probar este contrato. Sin el addressatributo en la estructura, puedo implementar el contrato, llamar contract.put("some text", 200)y ver los nuevos datos usando contract.listTexts().
Pensé que estábamos discutiendo solo la versión completa (con dirección). Aquí está la versión completa del código gist.github.com/aquiladev/75ac4f981075caa059ccfdd71125899b Asegúrese de ejecutarlo con la versión correcta de solidity. Si no funciona, lo más probable es que haya un problema en la comunicación con el contrato.
entonces, parece que tú y yo tenemos razón. No estaba usando Remix IDE para probar mi contrato, estaba compilando por mi cuenta en bash terminal y usando geth console. Entonces, tenías razón porque en Remix, no puedo simplemente pasar una cadena. Realmente tengo que pasar texto en formato hexadecimal. Pero cuando interactúo con mi contrato a través de la consola geth, esto es innecesario. Para hablar sobre mi problema, todavía no puedo usar un campo de dirección en la estructura cuando pruebo a través de la consola geth. Sin embargo, funciona a través de Remix IDE. Supongo que debo estar haciendo algo mal al compilar. ¿O podría ser un error en el compilador?
Sería bueno verificar la versión del compilador, pero no estoy seguro de que sea un caso, solo si tiene una versión realmente antigua. Intentaría compilar a través de solco trufflecon pruebas.
Veo que está tratando de devolver un valor de la función put (), pero pensé que no puede devolver valores de funciones de cambio de estado, solo ver funciones.