¿Hay algún motivo en particular por el que Solidity le impida devolver estructuras, listas y otras estructuras de datos? Entiendo que debe ser seguro y permitir el acceso a la matriz/lista puede alterar los datos, pero ¿por qué ni siquiera las estructuras? Estoy tratando de hacer un contrato que devuelva una lista de accidentes que ocurrieron en una placa particular (que es uno de los campos en una estructura) de una cadena de bloques de registros de accidentes, pero solo logré llegar a devuelve un registro, eso también por sus campos individuales. Me parece muy ineficiente..
Tenga en cuenta que primero intenté devolver string[] pero tuve que cambiarlo a bytes[] ya que Solidity tampoco lo permite.
/*
To get a list of incidents from a startID
*/
function listIncidents(uint _startID, uint _count) constant returns(uint[10] _incIDs, bytes[10] _names, bytes[10] _descriptions, bytes[10] _places, bytes[10] _times, bytes[10] _dates) {
uint maxIters = _count;
if((_startID + _count) > getIncidentCount()) {
maxIters = getIncidentCount() - _startID;
}
_incIDs = new uint[](maxIters);
_names = new bytes[](maxIters);
_descriptions = new bytes[](maxIters);
_places = new bytes[](maxIters);
_times = new bytes[](maxIters);
_dates = new bytes[](maxIters);
for(uint i=0;i<maxIters;i++) {
uint _incidentID = _startID + i;
PoliceRecord memory r = incidents[_incidentID];
_incIDs[i] = _incidentID;
_names[i] = bytes(r.incName);
_descriptions[i] = bytes(r.incDescription);
_places[i] = bytes(r.incPlace);
_times[i] = bytes(r.incTime);
_dates[i] = bytes(r.incDate);
}
}
Puede devolver matrices. Lo que no puede hacer es devolver matrices de matrices , incluido string[]
o bytes[]
(porque string
o bytes
ya es una matriz).
La razón es solo una limitación de la ABI (interfaz binaria de aplicación). Cuando intente hacerlo, debería ver una advertencia del compilador que dice:
Este tipo solo se admite en el nuevo codificador ABI experimental. Utilice "pragma experimental ABIEncoderV2;" para habilitar la función.
Si puede salirse con la suya limitando sus cadenas a una longitud de 32, podría usarlas en su bytes32
lugar. Este código funciona bien:
solidez de pragma ^0.4.24;
contract Test {
function test() public pure returns (bytes32[]) {
bytes32[] memory foo = new bytes32[](2);
foo[0] = "hello";
foo[1] = "goodbye";
return foo;
}
}
snazzyslytherin
usuario19510
MShakeG