Solidity
將在一個合約的儲存中分配的結構的地址傳遞給另一個合約的函式
我有一份契約,其中聲明了在
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]); } }