//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.24; contract StructDefiner { struct MyStruct { uint256 someField; address someAddress; uint128 someOtherField; uint128 oneMoreField; } } contract Storage { StructDefiner.MyStruct[] internal structs; //array at slot-0 and contains sizeOf(structs) //The values in the array are stored consecutively starting at the hash of the slot. function getStructByIdx(uint256 idx) external view returns (bytes) { //declare and initialize buffer bytes dataAsBytes = new bytes(84); StructDefiner.MyStruct memory structElement; assembly { // The length is loaded (first 32 bytes) let len := mload(structs) let dataArray := add(structs, 0x20) //identify location of the element in array (from index) let arrayLocation := uint256(keccak256(0)) + (idx * elementSize); structElement := mload(add(dataArray,arrayLocation)) //sizeOf each structElement let elementSize := 84; let someField := structElement.someField; let someAddress := structElement.someAddress; let someOtherField := structElement.someOtherField; let oneMoreField := structElement.oneMoreField; mstore(add(dataAsBytes, 0), someField); mstore(add(dataAsBytes, 32), someAddress); mstore(add(dataAsBytes, 52), someOtherField); mstore(add(dataAsBytes, 68), oneMoreField); } return dataAsBytes; } } contract Controller { Storage internal storage; constructor(addrerss _storage) { storage = Storage(_storage); } getStruct(uint256 idx) public returns (StructDefiner.MyStruct myStruct) { bytes memory _myStruct = storage.getStructByIdx(idx); StructDefiner.MyStruct memory newEntity; uint256 someField; address someAddress; uint128 someOtherField; uint128 oneMoreField; assembly { someField := mload(add(_myStruct, 32)); someAddress := mload(add(_myStruct, 52)); someOtherField := mload(add(_myStruct, 64)); oneMoreField := mload(add(_myStruct, 86)); } newEntity.someField = someField; newEntity.someAddress = someAddress; newEntity.someOtherField = someOtherField; newEntity.oneMoreField = oneMoreField; return newEntity; } }
0.4.18