Pushen Sie mithilfe einer Schleife in einer externen Funktion in ein dynamisches Array von Strukturen

struct testR{
    bytes32 name;
    int32 count;
}

testR[] public tests;

function createTest(bytes32[] names) external returns (bool success) {
    uint256 len = names.length;
    for (uint8 i=0;i<len;i++){
        tests.push(testR({name: names[i], count: 0}));
    }
    return true;
}

Hier ist mein Code. Wenn ich diesen Vertrag in meinem privaten Netzwerk bereitstelle, funktioniert die Funktion createTest einfach nicht. Ich übergebe ein Array von konvertierten in HEX-Zeichenfolgen. Wenn ich dann das öffentliche Array "tests" aufrufe, gibt es mir immer 0x und null zurück. Wenn ich versuche, diesen Vertrag in Remix mit JVM zu kompilieren und auszuführen, wird folgender Fehler angezeigt:

undefined errored: VM error: invalid opcode.
invalid opcode  The constructor should be payable if you send value.
The execution might have thrown.
Debug the transaction to get more information. 

Ich denke, mit meiner Schleife stimmt etwas nicht, aber es scheint so einfach zu sein.

Antworten (1)

Ich habe gerade ein paar Dinge neu geordnet und der folgende Code hat für mich funktioniert. Stellen Sie außerdem sicher, dass Sie tatsächlich ein Array eingeben, sonst erhalten Sie auch eine Fehlermeldung.

testR[] public tests;
struct testR{
    bytes32 name;
    int32 count;
}


function createTest(bytes32[] names) external returns (bool success) {
    uint256 len = names.length;
    for (uint8 i=0;i<len;i++){
        tests.push(testR(names[i],0));
    }
    return true;
}
Ich verwende web3.js, um von der lokalen Domäne aus auf meinen Vertrag zuzugreifen. Zum Beispiel definiere ich var one = web.toHex('string'); Dann rufe ich contract.createTest([one]); Es gibt mir Transaktionshash zurück. Dann starte ich den Miner, warte darauf, dass ein Block abgebaut wird, und rufe contract.tests(0,1, callback) auf und er gibt mir ["0x", e] zurück.
Ich denke, das ist nur ein Problem beim Zugriff auf das Array. Hier ist ein besserer Weg, dies zu tun: ethereum.stackexchange.com/questions/3114/…
Vielen Dank für Ihre Hilfe. Das Problem bestand darin, die Argumente von der Browserkonsole mit web3.js zu übergeben