¿Puedo crear una nueva dirección de esta manera?

Estoy ocupado con un proyecto. Entonces tengo una matriz de una estructura dentro de otra estructura. En este caso, por ejemplo, matriz de CattleHealth en Cattle. En mi función RecordHealth, tomo la dirección de la estructura Cattle y agrego la longitud actual de su lista actual para crear una dirección única. ¿Es esta una forma correcta de hacerlo?

  contract WagyuRecordContract
    {
        address owner;

        struct Cattle
        {
            address RFID;
            string Name;
            uint256 Weight;
            string Gender;
            string Colour;
            string Breed;
            uint Age; 
            uint DOB;
            string Location;
            bool Parent;
            string SireName;
            string DamName;
            bool Active;
            bool ForSale;
            CattleHealth[] HealthRecord;
            CattleGrowth[] GrowthRecord;
            CattleMovements[] MovementsRecord;
            Facility SlaughterDetails;
            Meat[] DistributionDetails
        }


        struct CattleGrowth
        {
            uint DateRecorded;
            uint256 FoodIntake;
            uint256 Growth;
        }


        mapping (address => Cattle) public cattle;
        mapping (address=> CattleGrowth) public growth;           

        modifier Owner() 
        {
            require(msg.sender == owner);
            _;
        }


        function RecordHealth(address rfid, string _bodyCond, string _healthStat, uint256, string _med) Owner public
        {
            health[rfid+cattle[rfid].HealthRecord.length].DateRecorded = now;
            health[rfid+cattle[rfid].HealthRecord.length].BodyCondition = _bodyCond;
            health[rfid+cattle[rfid].HealthRecord.length].HealthStatus = _healthStat;
            health[rfid+cattle[rfid].HealthRecord.length].Medication = _med;
            cattle[rfid].HealthRecord.push(health[rfid+cattle[rfid].HealthRecord.length]);
        }
}

Editar: My Buddy usó este método a continuación sin usar un mapeo. No entiendo cómo funciona esto. ¿Para qué sirve el -1? ¿Cómo es exclusivo del ganado?

   function RecordHealth(address rfid, string _bodyCond, string _healthStat, string _med) Owner public
    {
       cattle[rfid].HealthRecord.push(now, _bodyCond, _healthStat, _med)-1;
    }
¿ rfid+cattle[rfid].HealthRecord.lengthIncluso compila? Estás tratando de agregar address + uint. Parece que por lo menos necesita reemplazarlo con address(uint(rfid)+cattle[rfid].HealthRecord.length).
Por cierto, tendrá dificultades para rastrear esas nuevas direcciones que ha agregado al healthmapeo.
Y última nota: parece que ha publicado mucho más de lo que realmente se necesita para responder a su pregunta, lo que hace que sea muy difícil (y molesto) de leer. Te recomiendo que te deshagas de todo excepto lo que sea absolutamente necesario, y después de recibir una respuesta, encuentres una manera de incrustarlo en tu código original.
Tomé nota, lo edité y también agregué un fragmento de lo que hizo otra persona que no entiendo. Lo siento, nuevo en este juego.

Respuestas (1)

Negativo. Mientras que en C o lenguajes similares la aritmética de punteros es la regla normal, en Solidity no se garantiza que funcione, tanto para el empaquetado eventual como para la desalineación cíclica eventual. Por lo tanto, se recomienda encarecidamente no hacerlo.