Das Übergeben einer Struktur an eine Funktion gibt TypeError: Interner oder rekursiver Typ nicht zulässig

Ich versuche, eine structan den Konstrukteur eines Vertrags zu übergeben, bekomme aber den Fehler

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

Der Vertrag ist

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);
  }

}

Ich habe etwas gegraben und es scheint, dass das Problem nicht wirklich damit zu tun hat, dass es structim Vertrag definiert ist (wo sonst würde es schließlich definiert werden), sondern mit dem verschachtelten Array, also habe ich es in geändert

contract Writer {

  struct Paragraph {
    string sentances;
  }

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

  Essay[] private essays;

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

}

aber jetzt bekomme ich

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

Dann habe ich es auf diese Weise versucht und die 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);
  }
}

was gibt

UnimplementedFeatureError: Nested arrays not yet implemented.

Sollte ich vielleicht auf die Verwendung von a verzichten structund stattdessen einen neuen Vertrag definieren, um eine darzustellen Essay?

Antworten (1)

Sie können ein verschachteltes Array nicht als Funktionsparameter übergeben, wenn diese Funktion extern ist. Wenn Sie versuchen, _paras zu übergeben, schlägt dies fehl, da string[] ein verschachteltes Array ist.

Die einfachste Lösung für Ihr Problem, wenn es nicht viele Parameter sind, besteht darin, sie einfach jeweils als separaten Parameter zu übergeben, die Struktur innerhalb der Funktion zu erstellen und sie in das Array zu verschieben.

Es wäre wie die letzte Implementierung, die Sie versucht haben, aber anstatt string[] params zu übergeben, würden Sie string param1, string param2, string param3 usw. übergeben.

Okay danke. So etwas hatte ich befürchtet. Leider ist die ankommende Datenstruktur (wie derzeit vorgeschlagen) ziemlich komplex. Zurück zum Reißbrett, denke ich.
Gilt das noch? Es ist nicht möglich zB einen String[] als Parameter zu übergeben?