Hinzufügen eines Arrays in der Zuordnung

Der Hauptzweck dieses Codes besteht darin, ein Array von Benutzern zur Zuordnung hinzuzufügen. Es gibt bestimmte Benutzer, die ein Videospiel spielen und sich auf einer bestimmten Ebene befinden. Die Ebene wird nun als Zuordnungsindex betrachtet, und auf dieser Ebene wird es eine Reihe von Benutzern geben. Der Hauptzweck der Verwendung eines Arrays von Benutzern besteht nun darin, dass sich mehrere Benutzer auf derselben Ebene befinden können. Ich habe gerade angefangen, Solidität zu lernen, also könnte es einige logische Fehler im Code geben. Kann mir jemand helfen und mir diesen Code erklären?

pragma solidity ^0.4.24; 

 contract game
 {

     struct users
     {
         string name;
         uint level;
         uint score;
     }

     mapping(uint => users[]) mulusers;

     function addusers (string _name, uint _level, uint _score) public {

         users memory use= users(_name,_level,_score); 
     }

     function getusers (uint _level) public view returns (string)
     {
        uint index= mulusers[_level].length;
         for(uint i=0; i<index; i++)
         {       
           return mulusers[_level].users[i].name;    //remix is showing an error   
         }   
     }   
 }

Antworten (2)

Also habe ich Ihren Code so geändert, wie Sie ihn brauchen, denke ich. Verwenden Sie auch PascalCase für Structund eventNamen und camelCase für function, modifierund Variablennamen. Oh, und wenn Sie Structnur ein einzelnes Objekt definieren (ein Spieler, ein Gegenstand, ein Buch usw.), verwenden Sie darin keinen Pluralnamen :)
PS - stringToBytes32Funktion ist nicht meine. Ich habe es irgendwo gefunden und verwende es seit einiger Zeit in meinem Code, nicht sicher, ob es das effizienteste zum Konvertieren ist.

pragma solidity ^0.4.24;

contract game {

    struct User
    {
        string name;
        // If your array to level, 
        // i don't think you really need 
        // it to be stored here since
        // you will already know the level
        // when you call mapping, so save some gas
        uint level;
        uint score;
    }

    mapping(uint => User[]) mulUsers;

    function addUsers (string _name, uint _level, uint _score) public {
        User memory user = User(_name,_level,_score); 
        mulUsers[_level].push(user);
    }

    // Return array of bytes32 as solidity doesn't support returning string arrays yet
    function getUsers (uint _level) public view returns (bytes32[] users)
    {
        uint length = mulUsers[_level].length;
        users = new bytes32[](length);

        for(uint i = 0; i < length; i++)
        {
            users[i] = stringToBytes32(mulUsers[_level][i].name);
        }   
    }

    // Make sure that string is not longer than 32 bytes or result will be cut
    function stringToBytes32(string memory source) private pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
            result := mload(add(source, 32))
        }
    }
}

Ich habe gerade Ihren Vertragscode mit wenigen Änderungen umgestaltet. Bevor Sie Daten erhalten, müssen Sie die Zustandsvariable hinzufügen. Hier haben Sie beim Mapping ein dynamisches Array verwendet, daher müssten Sie Benutzerstrukturdaten auf einen bestimmten Index übertragen.

contract game {

 struct users{
     string name;
     uint level;
     uint score;
 }

 mapping(uint => users[]) mulusers;

 function addusers (uint id, string _name, uint _level, uint _score) public {
     users memory user= users(_name,_level,_score); 
     mulusers[id].push(user);
 }

 function getusers (uint _id) public view returns (string){

    uint index= mulusers[_id].length;

     for(uint i=0; i<index; i++){       
       return mulusers[_id][i].name; 
     }   
  }   
}

Dieser Vertrag sollte funktionieren!

Warum würden Sie die Rückkehr in den forZyklus setzen? Es wird sowieso nur der erste Index zurückgegeben. Bearbeiten: nvm, ich habe gesehen, dass es auch im Originalcode ist.
Wo soll ich also meine Return-Anweisung platzieren, da in der Schleife nur ein Spielername zurückgegeben wird?