Kann ich auf diese Weise eine neue Adresse erstellen?

Ich bin mit einem Projekt beschäftigt. Ich habe also ein Array einer Struktur innerhalb einer anderen Struktur. In diesem Fall zum Beispiel ein Array von CattleHealth in Cattle. In meiner RecordHealth-Funktion nehme ich die Adresse der Cattle-Struktur und füge die aktuelle Länge ihrer aktuellen Liste hinzu, um eine eindeutige Adresse zu erstellen. Ist dies ein korrekter Weg, es zu tun?

  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]);
        }
}

Bearbeiten: Mein Buddy hat diese Methode unten verwendet, ohne ein Mapping zu verwenden. Ich verstehe nicht, wie das funktioniert. Wofür ist die -1? Wie ist es einzigartig für das Vieh?

   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.lengthKompiliert überhaupt ? Sie versuchen hinzuzufügen address + uint. Sieht so aus, als müssten Sie es zumindest durch ersetzen address(uint(rfid)+cattle[rfid].HealthRecord.length).
Übrigens, Sie werden es schwer haben, die neuen Adressen zu verfolgen, die Sie der healthZuordnung hinzugefügt haben.
Und letzte Anmerkung: Es sieht so aus, als hätten Sie viel mehr gepostet, als tatsächlich benötigt wird, um Ihre Frage zu beantworten, was das Durchlesen sehr schwierig (und nervig) macht. Ich empfehle Ihnen, alles außer dem absolut Notwendigen zu entfernen und nach Erhalt einer Antwort einen Weg zu finden, sie in Ihren ursprünglichen Code einzubetten.
Zur Kenntnis genommen, ich habe es bearbeitet und auch einen Ausschnitt von dem hinzugefügt, was jemand anderes getan hat, den ich nicht verstehe. Sorry neu in diesem Spiel.

Antworten (1)

Negativ. Während in C oder ähnlichen Sprachen die Zeigerarithmetik die normale Regel ist, ist in Solidity nicht garantiert, dass sie funktioniert, sowohl für eventuelles Packen als auch für eventuelle zyklische Fehlausrichtungen. Es wird daher dringend davon abgeraten.