Ich versuche, eine struct
an 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 struct
im 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 struct
und stattdessen einen neuen Vertrag definieren, um eine darzustellen Essay
?
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.
David Sag
Senju