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.
Ihr Vertrag funktioniert wie er ist, Warnungen und alles. Das sieht man im Remix.
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 response
und, 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.
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 function
bei der Erklärung nicht schreiben constructor
)
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 getit
Funktion aufrufen, um einen Wert aus dem Array abzurufen. Hier funktioniert es zumindest.
Ramesh Parek
DiscoTaube