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.
Dado que Firstname
es un literal de cadena definido en el alcance de la función, falta definir explícitamente la ubicación de los datos storage
por 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 storage
referencia válida. Para resolver el error de compilación en el ejemplo provisto, es necesario establecer la memory
palabra 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 SecondContract
y llamar FetchDetail
a la función con 0x0000000000000000000000000000000000000000
como 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
usuario19510
string memory Firstname = "Hello";
.