Cómo obtener múltiples valores de un contrato de función a otro

Tengo dos contratos y en el primer contrato contiene una función que se encarga de devolver dos valores, uno de cadena y otro de entero.

function getUserData(address userAddress)
    public    constant    returns(string, uint)
  {
    string Firstname = "Hello";
    uint number=123;
   return( Firstname,number);
  }

Al compilar esto da el error "Type literal_string "Hello" no se puede convertir implícitamente en el puntero de almacenamiento de cadena de tipo esperado. string Firstname = "Hello"; " En el segundo contrato, hago objeto del primer contrato e intenté obtener la función

function FetchDetail(address userAddress) public constant returns(string,uint )
  {
    string memory  data1;
    uint  data2;
    UserRegistration ud=new UserRegistration();
   (data1,data2)= ud.getUserData(userAddress);
    return(data1,data2);
  }

Pero no puedo obtener valores. Por favor sugiérame.

El error de compilación se puede resolver con string memory Firstname = "Hello";.

Respuestas (1)

Dado que Firstnamees un literal de cadena definido en el alcance de la función, falta definir explícitamente la ubicación de los datos storagepor defecto (donde se conservan las variables de estado) [1]. Esa operación de asignación luego busca los datos en la ubicación proporcionada, que en el ejemplo no es una storagereferencia válida. Para resolver el error de compilación en el ejemplo provisto, es necesario establecer la memorypalabra clave, como lo señaló el usuario smarx : string memory Firstname = "Hello";.

El segundo fragmento es válido, a partir de la versión de Solidity0.4.25 .

Teniendo en cuenta los fragmentos de código proporcionados, el siguiente sería el código agregado, para servir como referencia ( SecondContract.sol):

pragma solidity ^0.4.25;

contract UserRegistration {
    function getUserData(address userAddress) public constant returns(string, uint) {
        string memory Firstname = "Hello";
        uint number=123;
        return( Firstname,number);
    }
}

contract SecondContract {
    function FetchDetail(address userAddress) public constant returns(string,uint ) {
        string memory  data1;
        uint  data2;
        UserRegistration ud=new UserRegistration();
        (data1,data2)= ud.getUserData(userAddress);
        return(data1,data2);
    }
}

Desplegar SecondContracty llamar FetchDetaila la función con 0x0000000000000000000000000000000000000000como argumento devuelve:

string Hello uint256 123

[1] https://solidity.readthedocs.io/en/v0.4.25/types.html#ubicación-de-datos

¡Quédate súper!

/Javi