¿Cómo agrego a una matriz anidada dentro de una estructura?

No puedo agregar elementos a una matriz dentro de struct struct D { string name; clave de dirección; } struct Aone { cadena de ayuda; B[] blíster; D[] dlista; } estructura B{ cadena bdesc; estado booleano; C[] lista; }

struct C{
    uint createTime;
    string cdesc;
    bool rstatus;
    string ctype;   
}

mapeo(cadena => Auno) A;

Necesito agregar elementos a la estructura c en función de la función de ayuda proporcionada rptC (string _aid, string _c) public { B[] storage bhist = A[_aid].blist;

        if(bhist.length > 0 && bhist[bhist.length-1].bstatus==false) {
            bhist[bhist.length-1].clist.push(C(now,_c,false,""));
        } else if(bhist[bhist.length-1].bstatus==true) {
            bhist[bhist.length].clist.push(C(now,_c,false,""));
        } else {
            bhist[0].clist.push(C(now,_c,false,""));
        }
}

Sigo recibiendo un error json rpc no válido. Soy nuevo en Solidity y necesito ayuda

Gracias

Respuestas (3)

clist.push(c(now,_problem,false,"")

Estás presionando una estructura ac (¿no debería ser una C?) con 4 campos, pero la estructura tiene solo 3 campos.

Lo siento . Cuando escribí la pregunta, me perdí el cuarto campo en struct c struct C{ uint createTime; cadena cdesc; bool rstatus, cadena ctype; } . También debería ser C mayúscula... lo escribió incorrectamente como c minúscula en la pregunta

Esto es difícil de responder con esta breve parte de su código fuente, pero ¿está seguro de que la bhistestructura ya existe antes de agregar el clist?

Creo que encontré el problema:

B[] storage bhist = A[_aid].blist

Estás usando A tiene un mapeo, no tiene una estructura.

Hice algunos cambios y ahora el siguiente código funciona en la remezcla:

pragma solidity ^0.4.23;

contract Test {

    mapping ( string => B[] ) A;

    struct B {
        string bdesc;
        bool bstatus;
        C[] clist;
    }

    struct C {
        uint createTime;
        string cdesc;
        bool rstatus;
        string ctype;   
    }

    function rptC(string _aid, string _c) public {
        B[] storage bhist = A[_aid];
        if(bhist.length > 0 && bhist[bhist.length-1].bstatus==false) {
            bhist[bhist.length-1].clist.push(C(now,_c,false,""));
        } else if(bhist[bhist.length-1].bstatus==true) {
            bhist[bhist.length].clist.push(C(now,_c,false,""));
        } else {
            bhist[0].clist.push(C(now,_c,false,""));
        }
    }
}

¿Esto ayuda?

Gracias por su respuesta. Sin embargo, todavía no estoy seguro de cómo actualizar lo siguiente según sus instrucciones. No puedo agregar elementos a una matriz dentro de la estructura.