У меня есть вопрос о создании Struct, где размер массива, передаваемого в эту структуру, может иметь разную длину. Как и в приведенном ниже коде, я мог бы перейти к этому рецепту 2 ингредиента, 3 ингредиента или любое другое количество, если ингредиенты я хотел бы с соответствующим набором количеств.
К сожалению, я получаю ошибку:
TypeError : Invalid type for argument in function call . Invalid implicit conversion from uint8 [ 2 ] memory to uint256 [] memory requested .
Я знаю, что это происходит из-за того, что я передаю фиксированный размер массива полюсу динамического массива в Struct, что может быть решением для этого, если я хочу иметь возможность передавать массивы разных размеров?
pragma solidity ^ 0.4 . 2 ; contract Game { address public owner ;
// RECIPES mapping ( uint256 => Recipe ) private recipeInfo ;
struct Recipe { uint256 recipeId ; uint256 [] ingredientId ; uint256 [] ingredientAmount ; uint256 ethCost ;
}
// constructor of game;
function Game () public { owner = msg . sender ; recipeInfo [ 1 ] = Recipe ( 1 , [ 1 , 5 ], [ 100 , 100 ], 50000000 ); recipeInfo [ 2 ] = Recipe ( 2 , [ 2 , 3 , 4 ], [ 100 , 200 , 300 ], 100000000 );
}
}
Из https://solidity.readthedocs.io/en/v0.4.21/types.html#array-literals-inline-arrays :
Обратите внимание, что в настоящее время массивы памяти фиксированного размера не могут быть назначены массивам памяти динамического размера, то есть следующее невозможно:
// This will not compile. pragma solidity ^ 0.4 . 0 ; contract C { function f () public { // The next line creates a type error because uint[3] memory // cannot be converted to uint[] memory. uint [] x = [ uint ( 1 ), 3 , 4 ]; } }
Планируется снять это ограничение в будущем, но в настоящее время создает некоторые сложности из-за того, как массивы передаются в ABI.
На данный момент, я полагаю, вам нужно сделать что-то вроде этого:
uint256 [] memory foo = new uint256 []( 2 ); foo [ 0 ] = 1 ; foo [ 1 ] = 5 ; recipeInfo [ 1 ] = Recipe ( 1 , foo , ...);
Каки Мастер Времени
uint256[]([1,5])
Pacxiu
Explicit type conversion not allowed from "uint256[2] memory" to "uint256[] memory"