字符串数组稳固

时间:2017-03-10 11:05:09

标签: ethereum solidity eris

我遇到了一个相当普遍的问题,似乎我无法优雅而有效地解决问题。

我要将一个任意长的任意长字符串数组传递给一个可靠的契约。

在我看来,它应该像

function setStrings(string [] row)

但似乎无法完成。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:24)

这是Solidity的限制,原因是string基本上是一个任意长度的字节数组(即byte[]),因此string[]是一个二维字节数组(即byte[][])。根据{{​​3}},尚不支持二维数组作为参数。

  

合约函数可以接受二维数组吗?

     

外部调用和动态数组尚未实现 - 您只能使用一级动态数组。

解决这个问题的一种方法是,如果你知道所有字符串的最大长度(在大多数情况下是可能的),那么你可以这样做:

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

答案 1 :(得分:2)

作为参数的字符串数组尚不稳定。

答案 2 :(得分:1)

您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内的数组。虽然这可能证明是相当昂贵的,但如果您没有选择,可以试试。您可以按照this短文来序列化/反序列化任何数据类型。

答案 3 :(得分:1)

字符串数组在Solidity中不可用 因为字符串基本上是字符数组  嵌套动态数组未实现

答案 4 :(得分:0)

实体数组有两种类型:静态数组和动态数组。

数组声明

静态数组:它们具有固定大小。

  [maString
   enumerateAttribute:NSFontAttributeName
   inRange:<-- desired range -->
   options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
   usingBlock:^(id  _Nullable value, NSRange range, BOOL *_Nonnull stop) {
     if (![value isKindOfClass:[UIFont class]]) {
       return;
     }
     UIFontDescriptor *fontDescriptor = ((UIFont *)value).fontDescriptor;
     NSMutableDictionary *traits = [[fontDescriptor.fontAttributes objectForKey:UIFontDescriptorTraitsAttribute] mutableCopy] ?: [NSMutableDictionary new];
     traits[UIFontWeightTrait] = @(UIFontWeightSemibold);
     fontDescriptor = [fontDescriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorTraitsAttribute : traits}];
     UIFont *semiboldFont = [UIFont fontWithDescriptor:fontDescriptor size:fontDescriptor.pointSize];
     if (semiboldFont) {
       [maString addAttribute:NSFontAttributeName value:semiboldFont range:range];
     }
   }];

我们使用索引号访问值

动态数组:这些数组的大小会动态增大或减小。

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函数用于插入和删除值。 length函数用于测量数组的长度。

答案 5 :(得分:0)

可以通过使用     pragma experimental ABIEncoderV2; 然后,您可以在合同的顶部使用动态字符串数组。例如     string[] memory myStrings;