在以太坊Solidity中,当改变数组长度时,我得到“Value必须是一个左值”。为什么?

时间:2015-11-21 02:41:51

标签: ethereum

在Solidity中,您可以使用 array.length ++ 增加数组的大小,以便为新成员腾出空间。但是我收到了一个错误:

Value must be an lvalue

2 个答案:

答案 0 :(得分:8)

您可以使用“arrayname.length =;”调整存储中的动态数组(即在合同级别声明的数组),但如果您收到“左值”错误,则可能是两个错误之一。 您可能正在尝试在内存中调整数组的大小,或者 您可能正在尝试调整非动态数组的大小。

int8[] memory somearray;     // CASE 1
somearray.length++;          // illegal 

int8[5] somearray;           // CASE 2
somearray.length++;          // illegal 

重要说明:在Solidity中,数组是从您可能用于声明它们的方式向后声明的。如果你有一个带有动态和一些非动态组件的> = 2D数组,你可能会违反#2而不理解为什么。另请注意,数组是以“正常”方式访问的。以下是这个"落后"的一些例子。宣言范式在行动:

int8[][5] somearray;  // This is 5 dyn arrays, NOT a dyn array-of-arrays w/len=5
// so...
somearray[4];         // the last dynamic array
somearray[1][12];     // the 13th element of the second dynamic array
// thus...
somearray.length++;   // illegal. This array has length 5. Always.
somearray[0].length++;// legal

答案 1 :(得分:0)

遇到同样的问题以及我不得不使用storage关键字,因为我试图修改全局存储阵列。

bytes32[] storage someArray = someGlobalStorageArray;