Member "name" nicht gefunden oder nach argumentabhängiger Suche in Zeichenfolgespeicherreferenz nicht sichtbar

Ich habe Code wie diesen und möchte meinen Namen, Nachnamen und mein Alter in meiner Struktur festlegen, damit ich sie festlegen und mit meinen Funktionen verwenden möchte

hier ist mein Code:


pragma solidity >=0.4.0 <0.7.0;

contract NewHello{
    address owner;
    
    constructor()public{
        owner = msg.sender;
    }
    
    modifier onlyOwner (){
        require(msg.sender == owner);
        _;
    }
    
    struct user{
        string name;
        string surname;
        uint age;
    }
    
    user[] new_user;
    mapping(address => string) public users; // contains a name for every address
    
    function updateUser(address _address, string memory name,string memory surname,uint age) public onlyOwner {
        user memory new_user = user(name,surname,age);
        users[_address] = user(name,surname,age);
        
    }
    function getUser(address _address) public view returns(string memory name ,string memory surname,uint age) {
        //if(users[_address].age == 0) throw;
        return (users[_address].name,users[_address].surname,users[_address].age); 
    }
}

Ich bekomme 2 Fehler, zuerst ist einer:

TypeError: Type struct NewHello.user memory is 
not implicitly convertible to expected type string storage ref. 
users[_address] = user(name,surname,age);
                  ^--------------------^

TypeError: Member "name" not found 
or not visible after argument-dependent lookup in string storage ref.

wer kann mir bitte helfen?

Ist es nicht einfacher, eine Zuordnung wie diese zu verwenden mapping(address => user) public users:
was soll ich tun kannst du mir helfen?

Antworten (1)

Verwenden Sie eine Zuordnung wie:

mapping(address => user) public users

Jede Adresse hat einen Benutzer. Sie können dies verbessern, wenn Sie msg.sender anstelle von address (Funktionsparameter) verwenden, da Sie die Adresse nicht angeben müssen und jeder Benutzer seine Daten ändern und sehen kann ( onlyOwnerin diesem Fall müssen Sie den Modifikator entfernen). .

pragma solidity >=0.4.0 <0.7.0;

contract NewHello{ 

    address owner;

    constructor()public{
        owner = msg.sender;
    }

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

    struct user{
        string name;
        string surname;
        uint age;
    }
    mapping(address => user) public users; // contains a user for every address

    function updateUser(address _address, string memory name, string memory surname, uint age) public onlyOwner {
        users[_address] = user(name, surname, age);
    }

    function getUser(address _address) public view returns(string memory name, string memory surname, uint age) {
         //if(users[_address].age == 0) throw;
        return (users[_address].name, users[_address].surname, users[_address].age);        
    }
}