19

私は、堅牢性ではエレガントかつ効率的に解決できないように見える、非常に一般的な問題に遭遇しました。

任意の長い文字列の任意の長い配列をソリッド コントラクトに渡す必要があります。

私の考えでは、それは次のようなものでなければなりません

function setStrings(string [] row)

しかし、それはできないようです。

どうすればこの問題を解決できますか?

4

9 に答える 9

32

これは Solidity の制限です。その理由は、string基本的に任意の長さのバイト配列 (つまりbyte[]) でありstring[]、2 次元のバイト配列 (つまりbyte[][]) であるためです。Solidity リファレンスによると、パラメーターとしての 2 次元配列はまだサポートされていません。

コントラクト関数は 2 次元配列を受け入れることができますか?

これは、外部呼び出しと動的配列にはまだ実装されていません。1 つのレベルの動的配列しか使用できません。

この問題を解決する 1 つの方法は、事前にすべての文字列の最大長を知っている場合 (ほとんどの場合可能です)、次のようにすることです。

function setStrings(byte[MAX_LENGTH][] row) {...}

于 2017-03-21T16:52:44.390 に答える
1

コントラクトの先頭で使用することで実行でき pragma experimental ABIEncoderV2; ます。その後、文字列の動的配列を使用できます。元。 string[] memory myStrings;

于 2019-11-28T04:32:59.863 に答える
0

pushこれは、配列、getgetAll、およびを管理するコントラクトの例です。remove

pragma solidity ^0.8.4;

contract Array {
  string[] private fruits = ["banana", "apple", "avocado", "pineapple", "grapes"];

  function push(string memory item) public {
    fruits.push(item);
  }

  function get(uint256 index) public view returns (string memory) {
    return fruits[index];
  }

  function remove(uint256 index) public returns (bool) {
    if (index >= 0 && index < fruits.length) {
      fruits[index] = fruits[fruits.length - 1];
      fruits.pop();
      return true;
    }
    revert("index out of bounds");
  }

  function getAll() public view returns (string[] memory) {
    return fruits;
  }
}

于 2022-02-04T07:53:42.560 に答える
0

必要なすべてのソリューション:-

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

contract HelloWorld {
    string[] strings;

    // push one string to array
    function pushToStrings(string memory _data) public{
        strings.push(_data);
    }
    
    //get all the strings in array form
    function GetAllStrings() view public returns(string[] memory){
        return strings;
    }

    //get nth string of strings array
    function GetNthStrings(uint x) view public returns(string memory){
        return strings[x];
    }

    //push array of strings in strings
    function pushStringsArray(string[] memory someData) public{
        for (uint i=0; i < someData.length; i++) {
           strings.push(someData[i]);
        }
    }
    
    //change whole strings, take array of strings as input
    function changeWholeString(string[] memory someData) public{
       strings=someData;

    }
}
于 2022-01-09T07:24:45.373 に答える