State-Variable

函式不會改變變數的值

  • February 26, 2017

我已經與一個結構體 Stock 簽訂了契約。我有一個包含兩個這樣的股票的數組。它們可以很好地初始化,但是當我嘗試更改變數的值時,什麼也沒有發生。此外,同一函式不能更改簡單字元串變數的值。

這是程式碼:

contract Company{

struct Stock{
   address owner;
   string bitcoinAddress;
}

string public companyName;
Stock[2] public owners;
string public test;

function Company(string _companyName, address[2] addresses){
   companyName = _companyName;
   for(uint8 x=0; x<owners.length; x++){
       owners[x] = Stock(addresses[x], "");
   }
}

function changeStockOwner(uint8 _number, address _newAddress) constant returns(string){
   if(msg.sender == owners[_number].owner){
       owners[_number].owner = _newAddress;
       test = "hello";
       return "well";
   }
}
}

所以,當我打電話時company.changeStockOwner(0, personal.listAccounts[1]),它返回“好”,所以我猜它可以通過 if 語句。但是,什麼都沒有改變。

我認為更改數組中結構的值可能會有些困難,所以我添加了測試只是為了看看我是否可以改變它,但這也不會改變。我也嘗試將 web3.eth.defaultAccount 設置為相同的所有者

$$ 0 $$.owner (只是看看它是否會工作)。 我使用了ethereum.github.io的線上編譯器。

我不知道我做錯了什麼。似乎很明顯它應該工作,但為什麼不呢?

changeStockOwner()被標記為常量,因此無法更改區塊鏈。

我從建構子中刪除了初始化循環,並在有效性檢查中添加了一個軟糖。它讓我們在建構子中使用 null args 初始化合約,並有助於確認設置/獲取過程。

contract Company{

   struct Stock{
       address owner;
       string bitcoinAddress;
   }

   bytes32 public companyName;
   Stock[2] public owners;
   string public test;

   function Company(bytes32 _companyName, address[2] addresses){
       companyName = _companyName;
       // arrays are initialized to 0
    }

   function changeStockOwner(uint8 ownerNumber, string newAddress) returns(bool success){
       // little fudge for testing
       if(msg.sender != owners[ownerNumber].owner && owners[ownerNumber].owner != 0) throw;
       owners[ownerNumber].bitcoinAddress = newAddress;
       return true;
   }
}

希望能幫助到你。

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