質問

これが役立つ場合は、私の最後の質問からのフォローアップです。

いくつかのctype構造体を定義しています

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", POINTER(c_ubyte)),
                ("work_count", c_ushort)]

class EthercatPacket(Structure):
    _fields_ = [("ether_header", ETH_HEADER),
                ("Ethercat_header", EthercatHeader),
                ("data", POINTER(EthercatDatagram))]

これはPythonによって正しく解析され、欠落しているクラスは他の場所で定義されていることに注意してください。 私の問題は、次のコードを呼び出すときです

packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header

これは誤りです。私が問題を理解しているように、データは何らかのポインターであるため、EthercatDatagramに(実際に)マッピングされないため、パーサーは基礎となるヘッダーフィールドを認識しません。

そのフィールドと、POINTER()で表される他のフィールドを読み取る方法はありますか?

役に立ちましたか?

解決 2

わかりました

正しいコードは

print packet.data.header[0]

質問を敢えて見てくれた7人に感謝します

答えのGoogle文字列は次のとおりでした:python ctype dereference pointer 3番目のヒット

他のヒント

角括弧表記は確かに正しいです。参考までに、最近作成したctypesコードの一部を次に示します。

class Message(Structure):
    _fields_ = [ ("id", BYTE), ("data", POINTER(BYTE)), ("data_length", DWORD) ]
    def __repr__(self):
        d = ' '.join(["0x%02X" % self.data[i] for i in range(self.data_length)])
        return "<Message: id = 0x%02X, " % (self.id) + "data_length = " + str(self.data_length) + (self.data_length > 0 and (", data: " + d) or "") + ">"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top