Динамические массивы в структурах солидности

У меня есть вопрос о создании 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 ); 
     } 
 } 
пробовал явное преобразование? uint256[]([1,5])
Да, я пытался: но Explicit type conversion not allowed from "uint256[2] memory" to "uint256[] memory"

Ответы (1)

Из 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 ,   ...); 
Привет спасибо Это сработало. Я знал об этом, из солидности и не мог обойти это. Эффективен ли этот подход с точки зрения стоимости газа?
Я не знаю, прости.