es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TypeError: El miembro “push” no está disponible en la estructura SmartRegistryData.CDMD en la memoria[] fuera del almacenamiento.

**// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract SmartRegistryData{
struct TP {
uint id;
}
struct OP {
uint id;
}
struct BP{
uint id;
}
//ContractDescriptionMetaData
struct CDMD {
uint ID;
address providerAdress;
TP TechnicalPerspective;
OP OperationalPerspective;
BP BusnissPerspective;
}
mapping(uint => CDMD) public CDMDS;
mapping(address => CDMD) public CDMDSA;

struct PROVIDER{
    uint8 id;
    string name;
    address publicAddress;
    string entrepriseName;
    string entreprisedomain;
    string entreprisedescription;
}
// Almacenar proveedores 
mapping( address  => PROVIDER) public _listproviders;


function retreiveCDMDbyProvider(address _publicAddress, address publicAddress) public {
    CDMD [] memory CDMDarray = new CDMD[](100);
    CDMD storage cdmd = CDMDSA[_publicAddress];
    if(CDMDSA[_publicAddress].providerAdress == publicAddress) {
        CDMD memory cdma = CDMDSA[_publicAddress];
        // balance.push(cdma);
    }
}

}**

cuando escribo — truffle compile, obtengo este error
¿Cómo puedo agregar una estructura a un arreglo dinámico?
¿Hay otra solución para recuperar un conjunto de estructuras según un atributo específico, como una dirección?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar una estructura a un arreglo dinámico, puedes definir una nueva instancia de la estructura y utilizar el método push del arreglo para añadirla al final del mismo. Por ejemplo, para agregar un nuevo CDMD al arreglo CDMDarray en la función retreiveCDMDbyProvider, puedes hacer lo siguiente:

    function retreiveCDMDbyProvider(address _publicAddress, address publicAddress) public {
        CDMD[] memory CDMDarray = new CDMD[](100);
        CDMD storage cdmd = CDMDSA[_publicAddress];
        if (cdmd.providerAdress == publicAddress) {
            CDMD memory cdma = CDMDSA[_publicAddress];
            CDMDarray.push(cdma);
        }
    }
    

    Para obtener un conjunto de estructuras según un atributo especificado, como una dirección, puedes utilizar un mapping para mapear el atributo a un arreglo de estructuras. Por ejemplo, si deseas obtener un conjunto de CDMDs para una determinada providerAdress, puedes agregar un mapeo que asocie address a un arreglo de estructuras CDMD:

    mapping(address => CDMD[]) public CDMDsByProvider;
    
    function addCDMD(CDMD memory newCDMD) public {
        address providerAdress = newCDMD.providerAdress;
        CDMDsByProvider[providerAdress].push(newCDMD);
    }
    
    function retrieveCDMDsByProvider(address providerAdress) public view returns (CDMD[] memory) {
        return CDMDsByProvider[providerAdress];
    }
    

    En este ejemplo, la función addCDMD agrega un nuevo CDMD al arreglo para una determinada dirección de proveedor. La función retrieveCDMDsByProvider recupera el arreglo de CDMDs para una determinada dirección de proveedor.

Comments are closed.