私は非常によくある問題に遭遇しました。それはエレガントで効率的にしっかりと解決することができないようです。
私は任意の長い文字列の任意の長い配列を堅牢性コントラクトに渡さなければなりません。
私の心の中でそれは次のようなものでなければなりません
function setStrings(string [] row)
しかし、それはできないようです。
この問題を解決するにはどうすればよいですか?
これはSolidityの制限であり、その理由は、string
は基本的に任意長のバイト配列(つまり、_byte[]
_)であるため、_string[]
_は2次元のバイト配列(すなわち_byte[][]
_)。 Solidity references によると、パラメータとしての2次元配列はまだサポートされていません。
コントラクト関数は2次元配列を受け入れることができますか?
これは、外部呼び出しと動的配列にはまだ実装されていません。動的配列は1レベルしか使用できません。
この問題を解決する方法の1つは、すべての文字列の最大長が事前にわかっている場合(ほとんどの場合は可能です)、次のようにすることです。
function setStrings(byte[MAX_LENGTH][] row) {...}
文字列は基本的に文字の配列であるため、文字配列はSolidityでは使用できません。ネストされた動的配列は実装されていません。
配列要素をバイト文字列に変換し、そのバイト文字列を関数内の配列に逆シリアル化できます。これは非常に高価であることが証明できますが、選択肢がない場合は試すことができます。 this の短い記事に従って、データ型を確実にシリアライズ/デシリアライズできます。
パラメータとしての文字列配列はまだサポートされていません。
堅牢な配列には、静的配列と動的配列の2つのタイプがあります。
配列の宣言
静的配列:これらは固定サイズです。
int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];
インデックス番号を使用して値にアクセスします
動的配列:これらの配列のサイズは動的に増減します。
int[] list_of_students;
list_of_students.Push("Faisal");
list_of_students.Push("Asad");
list_of_students.Push("Smith");
インデックス番号を使用して値にアクセスできます。 Push
およびpop
関数は、値を挿入および削除するために使用されます。 length関数は、配列の長さを測定するために使用されます。