Zeigen Sie Daten aus einem anderen Vertrag in Solidity an

Der Code lässt sich gut kompilieren. Aber es gibt den folgenden Fehler, wenn das Ereignis LogData aktiviert ist. LogAddress funktioniert gut. Muss ich explizite Getter für die Zustandsvariablen einrichten?

transact to browser/Test.sol:Factory.getContract errored: VM error: invalid opcode. Der Konstruktor sollte zahlbar sein, wenn Sie einen Wert senden. Die Hinrichtung könnte geworfen haben. Debuggen Sie die Transaktion, um weitere Informationen zu erhalten.

pragma solidity ^0.4.15;

contract TestContract {

    uint public iD;
    bytes32 public name;
    function setAttr(uint _id, bytes32 _name) {
        iD = _id;
        name = _name;
    }
}

contract Factory {

    TestContract myTest;
    address contractAddress;
    function Factory () {
        myTest = new TestContract();
        myTest.setAttr(100,"0x111");
        contractAddress = address(myTest);
    }

    event LogData(uint _mydata, bytes32 _name);
    event LogAddress(address _add);
    function getContract() {
        myTest = TestContract(contractAddress);
        LogAddress(contractAddress);
        LogData(myTest.iD(), myTest.name());
    }

}

Antworten (1)

Ich habe nur herumgespielt, bis es funktioniert.

pragma solidity ^0.4.15;

contract TestContract {

  uint public iD;
  bytes32 public name;
  function TestContract(uint _id, bytes32 _name) public {
    iD = _id;
    name = _name;
  }
}

contract Factory {

  TestContract myTest;
  TestContract testContract;
  function Factory () public {
    testContract = new TestContract(100,"0x123");
  }

  event LogData(uint _mydata, bytes32 _name);
  event LogAddress(address _add);
  function getContract() public {
    LogAddress(testContract);
    LogData(testContract.iD(), testContract.name());
  }
}

Ich hoffe es hilft.

Danke @RobHitchens, die obigen Änderungen funktionieren jetzt. Ich hatte eine Folgefrage: In den LogData wirft Remix einen Fehler, wenn ich testContract.iD() in testContract.iD ändere. Muss ich den Standard-Getter verwenden? Wenn die Zustandsvariable öffentlich ist - sollte ich nicht direkt mit testContract.iD darauf zugreifen können. Remix zeigt einen Fehler "Type Error: Invalid type of arg. in function call........)
Der "freie" 'öffentliche' Getter für ist iDeine Funktion, also muss darauf ()zugegriffen werden.