Ethereumj
無法辨識結構屬性
我一直在學習 Solidity,但遇到了結構的範圍問題。我認為預設情況下,結構的所有屬性都被放入儲存中。當我嘗試將戰鬥變數添加為參數時,EVM 編譯器無法辨識它。為什麼是這樣?謝謝。
struct TargetCoreBase { uint hp; uint levels; uint AlienCount; uint TargetAliens; uint LossCounter; uint WinCounter; uint battles; } TargetCoreBase[] target; mapping(uint => address) base; address owner = msg.sender; function CreateTarget(string _hp, uint _levels, uint _AlienCount, uint _TargetAliens, uint _LossCounter, uint _WinCounter, uint _battles) internal { require(msg.sender == ownerOf(_CoreBaseId)); uint TargetId = target.push(TargetCoreBase(_hp, _levels, _AlienCount, _LossCounter, _WinCounter, 0)); base[TargetId]; } string TargetCoreBaseErr = "No CoreBase level"; function CheckTargetPairing(_battles) returns (bool) { if(TargetCoreBase.battles = 0) { return true; } else { return false; }
更新
我現在有正確數量的參數,但問題仍然存在。事實上,用任何其他結構變數替換 _battles 會返回相同的結果 - “找不到標識符”。
它無法辨識,因為您忽略了它。你的結構:
struct TargetCoreBase { uint hp; uint levels; uint AlienCount; uint TargetAliens; uint LossCounter; uint WinCounter; uint battles; }
但是當您創建結構的實例時:
target.push(TargetCoreBase(_hp, //TargetCoreBase.hp _levels, //TargetCoreBase.levels _AlienCount, //TargetCoreBase.AlienCount _LossCounter,//TargetCoreBase.TargetAliens _WinCounter, //TargetCoreBase.LossCounter 0)); //TargetCoreBase.WinCounter //TargetCoreBase.battles is omitted
常識說你實際上忽略了這個
TargetAliens
變數。
只是建立在以前的答案…
你有以下問題:
- 您的
push()
呼叫失去並且輸入battles
,或失去的任何參數(根據 flygoing 的回答)。CheckTargetPairing()
不包括_battles
參數的類型。- 在
CheckTargetPairing()
中,該if
語句沒有使用您傳入的參數。它試圖引用類型聲明,而不是實際變數。- 相同的
if
語句是賦值 (=
) 而不是進行比較 (==
)。CreateTarget()
參數類型錯誤_hp
(string
而不是uint
)。這裡有一些東西可以讓你部分到達那裡。我不知道下面是否真的是您想要實現的目標,但它是最接近您提供的編譯內容的表示。
contract YourContract { struct TargetCoreBase { uint hp; uint levels; uint AlienCount; uint TargetAliens; uint LossCounter; uint WinCounter; uint battles; } TargetCoreBase[] target; mapping(uint => address) base; address owner = msg.sender; function CreateTarget(uint _hp, uint _levels, uint _AlienCount, uint _TargetAliens, uint _LossCounter, uint _WinCounter, uint _battles) internal { uint TargetId = target.push(TargetCoreBase(_hp, _levels, _AlienCount, _LossCounter, _WinCounter, 0, 0)); base[TargetId]; } string TargetCoreBaseErr = "No CoreBase level"; function CheckTargetPairing(uint _battles) returns (bool) { if (_battles == 0) { return true; } else { return false; } } }