Solidity

將在一個合約的儲存中分配的結構的地址傳遞給另一個合約的函式

  • January 12, 2018

我有一份契約,其中聲明了在storage.

從這個合約中,我呼叫另一個合約中的一個函式,該函式將單個結構作為輸入。

為了解決“語法障礙”,我改為傳遞結構的內容(變數)。

我需要向結構中添加更多變數,現在我得到以下編譯錯誤:

堆棧太深,嘗試刪除局部變數。

本能地,我認為唯一的解決方案是將結構“按地址”傳遞給函式

由於我在 中分配了這些結構的數組storage,我認為它應該是可行的。

但是,無論我如何嘗試寫下來,我都會不斷出錯。

當我將返回類型聲明為 時address,出現以下編譯錯誤:

返回參數類型 struct MyStruct 儲存引用不能隱式轉換為預期的類型地址。

當我將返回類型聲明為 時MyStruct storage,出現以下編譯錯誤:

位置必須是公開可見功能的記憶體(刪除“儲存”關鍵字)。

當我將返回類型聲明為時MyStruct memory,我收到以下執行時錯誤:

請求的靜態記憶體負載超過 32 個字節。

Solidity 標準是否在任何地方指出這是不可行的?

謝謝你。

本能地,我認為唯一的解決方案是將結構“按地址”傳遞給函式

您不能訪問儲存變數的物理地址(就像使用 C 一樣),這在 Solidity 中是不允許的。地址類型僅用於引用其他賬戶(合約或外部)的地址,不用於引用記憶體地址。

一種解決方法是使用智能合約而不是結構來儲存您的數據。這樣你就可以傳遞智能合約的地址,而不必傳遞數據。我在下面發布了一個範例:

contract Person {
   uint public age;
   uint public weight;

   function Person(uint _age, uint _weight) public {
       age = _age;
       weight = _weight;
   }
}

contract PersonHolder {

   address[] public people; // Could use Person[] here

   function addPerson(uint age, uint weight) public {
       people.push(new Person(age, weight));
   }

   function getPerson(uint index) public view returns (Person) {
       require(people.length > index);

       return Person(people[index]);
   }
}

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