Solidity

將結構傳遞給函式會產生 TypeError: Internal or recursive type not allowed

  • June 1, 2019

我正在嘗試將 a 傳遞struct給契約的建構子,但出現錯誤

TypeError: Internal or recursive type is not allowed for public or external functions

契約是

pragma solidity ^0.4.0;

contract Writer {

 struct Paragraph {
   string[] lines;
 }

 struct Essay {
   Paragraph[] paragraphs;
 }

 Essay[] private essays;

 function Writer(Essay initialEssay) {
   essays.push(initialEssay);
 }

}

我做了一些探勘,似乎問題實際上與struct契約中定義的內容無關(畢竟它會在哪裡定義)而是與嵌套數組有關,所以我將其更改為

contract Writer {

 struct Paragraph {
   string sentances;
 }

 struct Essay {
   string title;
   Paragraph[] paragraphs;
 }

 Essay[] private essays;

 function Writer(Essay essay) {
   essays.push(essay);
 }

}

但現在我明白了

InternalCompilerError: Static memory load of more than 32 bytes requested.

於是我嘗試了這種方式,手動建構struct.

contract Writer {

 struct Paragraph {
   string sentances;
 }

 struct Essay {
   string title;
   Paragraph[] paragraphs;
 }

 Essay[] private essays;

 function Writer(string title, string[] _paras) {
   Paragraph[] storage paras;
   for (uint256 i = 0; i < _paras.length; i++) {
       Paragraph memory para = Paragraph(_paras[i]);
       paras.push(para);
   }
   Essay memory initialEssay = Essay(title, paras);
   essays.push(initialEssay);
 }
}

這使

UnimplementedFeatureError: Nested arrays not yet implemented.

我是否應該放棄使用 astruct而是定義一個新契約來代表 a Essay

如果該函式是外部的,則不能將嵌套數組作為函式參數傳遞。當您嘗試傳遞 _paras 時,它將失敗,因為字元串

$$ $$是一個嵌套數組。 對於您的問題,最簡單的解決方案是,如果不是很多參數,只需將它們作為單獨的參數傳遞,在函式內部構造結構並將其推送到數組中。

這就像您嘗試的最後一個實現,而是 pos 傳遞字元串

$$ $$參數,您將傳遞字元串 param1、字元串 param2、字元串 param3 等。

引用自:https://ethereum.stackexchange.com/questions/29217