Das Schreiben eines Arrays mit einer for-Schleife funktioniert nicht

Ich versuche, ein Array von Karten in einem Deck mit Werten von 0 bis 51 mithilfe eines Arrays zu füllen. Es scheint nicht zu funktionieren und ich habe immer ein leeres Array. Ist das ein Problem mit Gas, obwohl ich mit ziemlich großen Werten für die Gasgrenze experimentiert habe? Hier ist mein Code:

contract Blackjack {

   uint[52] public deck;

   function Blackjack() public {

       for (uint i = 0; i < 52; i++) {
            deck[i] = i;
       }
    }
}

Bearbeiten: Ich habe gerade festgestellt, dass Sie einen Parameter angeben müssen, wenn Sie den kostenlosen Getter für Deck im Remix aufrufen. Ich hatte erwartet, dass es das gesamte Array zurückgeben würde, also ist dies nicht wirklich ein Problem. Vielen Dank an alle, die mitgeholfen haben und es tut mir leid, Ihre Zeit verschwendet zu haben.

Was ist der Fehler?
Kein Fehler, nur keine Werte, wenn ich versuche, auf das Array zuzugreifen.

Antworten (3)

Ihr Vertrag funktioniert wie er ist, Warnungen und alles. Das sieht man im Remix.

Geben Sie hier die Bildbeschreibung ein

Falls es auf der Client-Seite hilft, würden Sie die "kostenlose" Getter-Funktion aufrufen, die Sie von erhalten public. Es sieht ähnlich aus wie Lauris Idee:

function getit(uint row) public view returns (uint) {
    return deck[row];
}

Wenn Sie die Werte nicht (einzeln) erhalten, konzentrieren Sie sich auf den Kunden.

Außerdem werden Sie möglicherweise überrascht sein, ein seltsames Array von Web3 zu erhalten (vielleicht ist dies "es"). Es wird im BigNumber-Format vorliegen. https://github.com/ethereum/wiki/wiki/JavaScript-API#a-note-on-big-numbers-in-web3js

BigNumbers sieht aus wie wackelige Arrays. Nehmen Sie Ihr responseund, response.toString(10)um eine menschenlesbare Zahl zu lesen.

Außerdem ist es asynchron.

Wenn Sie Trüffel verwenden

instance.deck().then(function(response) { // console.log(response.toString(10)); });

Wenn nicht Trüffel, glaube ich

instance.deck(function(error, response) { // console.log(response.toString(10)); });

Ich bin ein wenig lückenhaft in Bezug auf Vertragszugriffsmethoden, wenn ich keinen Trüffel verwende, also wird sich vielleicht eine freundliche Seele melden, um offensichtliche Fehler zu korrigieren.

Ich hoffe es hilft.

Es stellte sich heraus, dass ich den kostenlosen Getter nicht richtig angerufen hatte. Ich hatte erwartet, dass es das gesamte Array zurückgibt, und stattdessen einen Index für den Wert des Arrays erwartet, damit es sortiert ist, danke!

Welche Solidity- und Compiler-Versionen verwenden Sie?

Wenn Sie pragma solidity ^0.4.22;oben in Ihrer Datei haben, versuchen Sie, den Konstruktor in das neue Format zu ändern:

function Blackjack() public {

soll werden

constructor() public {

(Hinweis: Sie müssen functionbei der Erklärung nicht schreiben constructor)

Ich verwende 0.4.2, aber das Problem war, dass ich nicht verstand, wie Array-Getter funktionieren. Ich möchte nicht vom Thema abschweifen, aber gibt es einige große Vorteile bei der Verwendung von 0.4.22, da die Tutorials, die ich mir angesehen habe, 0.4.2 verwendeten und ich einfach dabei geblieben bin?
Ja, Solidity ist sehr neu und entwickelt sich schnell. Solidity 0.4.2 ist ungefähr anderthalb Jahre alt - ich kann mir nur vorstellen, welche Verbesserungen seitdem passiert sind. Wenn die von Ihnen verwendeten Tutorials etwas früher als 0.4.16 verwenden, würde ich mich nicht einmal darum kümmern. Sie sollten jedoch Qualitätsmaterial von mindestens 0.4.18 finden. Der Grund, warum ich die Versionssache erwähnt habe, war, dass ich nicht dachte, dass Ihr Konstruktor aufgerufen wurde, aber ich denke nicht, dass Sie trotzdem 0.4.2 lernen sollten

Es ist wahrscheinlich kein Gasproblem, es sei denn, Sie erhalten beim Bereitstellen explizit Gasfehler. Wie überprüfen Sie die tatsächlichen Werte im Array? Du hast keine Funktion dafür.

Versuchen Sie Folgendes (z. B. in Remix):

pragma solidity ^0.4.22;

contract Blackjack {

   uint[52] public deck;

   constructor() public {

       for (uint i = 0; i < 52; i++) {
            deck[i] = i;
       }
    }

    function getit() public view returns (uint) {
        return deck[5];
    }
}

Jetzt können Sie den Vertrag erstellen und danach die getitFunktion aufrufen, um einen Wert aus dem Array abzurufen. Hier funktioniert es zumindest.

Ich verwende Remix und habe gerade den kostenlosen Getter angerufen, den ich "Deck" bekomme. Es würde immer ein leeres Array zurückgeben
Ich habe herausgefunden, was das Problem ist, habe die Frage bearbeitet. Ich war nur dumm. Danke aber für die Anregungen!