Ethereumj

無法辨識結構屬性

  • December 15, 2020

我一直在學習 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()參數類型錯誤_hpstring而不是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;
   }
 }
}

引用自:https://ethereum.stackexchange.com/questions/60414