Solidity
合約讀取另一個合約返回的字元串
我有 2 個契約,
Parents
其中Child
有一個公共字元串變數 -name
。contract Child { string public name; function child (string _name){ name = _name; } }
Parents
需要獲得該名稱:contract Parents { string public childName; Child child; function Parents(address _childAddress){ child = Child(_childAddress); childName = child.name(); // I also tried child.name } }
但我收到以下錯誤:
Error: Type tuple() is not implicitly convertible to expected type string storage ref. childName = child.name();
所以我試圖創建另一個函式
Child
,它將返回一個字元串:function getName() returns (string name) { return name; }
而
Parents
我已經改變了childName = child.name(); into---> childName = child.getName();
但我不斷收到同樣的錯誤。有任何想法嗎?一如既往,感謝您的幫助。
一個合約返回的可變大小數據不能被另一個合約讀取。
Parents
正在嘗試讀取 astring
並Child
因此出現錯誤。EVM 無法從外部函式呼叫中讀取可變大小的數據…請注意,另一方面,可以返回可變大小的數據,只是無法從 EVM 中讀取。
這是一個可以編譯的版本。
由於
address
類型更容易轉換為string
類型,因此我將原始地址儲存為address
類型,並添加了一個函式以在需要時轉換address
為string
。contract Child { address public addr; function child (address _addr) { addr = _addr; } function getAddress() returns (address) { return addr; } function toBytes(address x) returns (bytes b) { b = new bytes(20); for (uint i = 0; i < 20; i++) { b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); } } function getName() returns (string) { return string(toBytes(addr)); } } contract Parents { address public childAddr; Child child; function Parents(address _childAddress) { child = Child(_childAddress); childAddr = child.getAddress(); } }
我已將所有地址儲存為
address
類型。我添加了
toBytes(...)
從address
類型轉換為類型的函式bytes
(來自如何將地址轉換為 Solidity 中的字節?)。您可以
bytes
通過string
使用string(...)
.