🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1380閲覧

C言語からpython向けに変換された構造体へのアクセス方法

tomoyuki500219

総合スコア21

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/29 05:41

Pythonで下記、不明点が出ています。
抽象的でわかりにくい質問だと思いますが、下記での質問方法しか思いつかない若輩者です。
アドバイスしていただける方、恐縮ですが、よろしくお願いいたします。

下記構造体があります typedef struct {       unsigned long avf ;       char dummy[36] ;       MAZ_TD_COMMONtd_common ;       MAZ_TD_VARIOUStd_various ; } MAZ_TD ; 上記、C言語の構造体を下記のようにpython用で変換してあります class MAZ_TD (Structure): _fields_ = [("avf", c_ulong), ("dummy", c_char * 36), ("td_common", MAZ_TD_COMMON), ("td_various", MAZ_TD_VARIOUS)] 下記、maz_get_all_tool_data関数の出力(data)は上記、MAZ_TD型へ格納されるとのこと。 MAZ_TD型のtd_commonにpythonでアクセスするコードがわかりません。どのようにコーディングすれば良いでしょうか? all_data = sdk.maz_get_all_tool_data(0,206) ※0,206は入力引数 あくまでおそらくですが、206件分のデータが返ってきていると思います。 all_data["data"].td_commonかと思いましたが、 AttributeError: 'MAZ_TD_Array_206' object has no attribute 'td_common' というエラーになります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

確認ですが、掲載のコードに間違いは有りませんか?
(区切り位置に着目してください)

  • (A) MAZ_TD COMMONtd_common;

 文脈から違うと思いますが、MAZ_TD しか定義がないので確認したい点

  • (B) MAZ_TD_COMMON td_common;
  • (C) MAZ_TD_COMMONtd_common; <-- 掲載のコード

("td_common", MAZ_TD_COMMON)
定義されてるのは MAZ_TD のみなので、
MAZ_TD 構造体のメンバは(B)で定義して、
MAZ_TD_COMMON構造体の定義も必要です。


all_data["data"].td_commonかと思いましたが、
MAZ_TD_Array_206 object has no attribute 'td_common'

エラーメッセージより、all_data["data"] が長さ206の配列なのであれば、
リストのようにアクセスできるはずです。

python

1for data in all_data["data"]: 2 print(data.td_common)

参考:

投稿2021/01/29 06:03

teamikl

総合スコア8738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomoyuki500219

2021/01/29 06:14

不躾な質問方法ながらご回答ありがとうございます。助かります。 失礼いたしましたMAZ_TD_COMMON td_common;です MAZ_TD_COMMON構造体の定義も別途されています。(とてもメンバが多いです) for data in all_data["data"]: print(data.td_common) をターミナルで実行すると、下記が出力されますが、実際の値ではないです <smooth_struct.MAZ_TD_COMMON object at 0x03330D60> <smooth_struct.MAZ_TD_COMMON object at 0x014B9850> <smooth_struct.MAZ_TD_COMMON object at 0x03330D60> <smooth_struct.MAZ_TD_COMMON object at 0x014B9850> <smooth_struct.MAZ_TD_COMMON object at 0x03330D60> <smooth_struct.MAZ_TD_COMMON object at 0x014B9850> 以下数件繰り返し。206件分かと
teamikl

2021/01/29 06:26 編集

MAZ_TD_COMMONの定義もあるのでしたら、正常な挙動です。 表示されているのは、Pythonのオブジェクトの表現です。 MAZ_TD_COMMON内の実際に表示したい値(例: xxxメンバがあるとすれば) print(data.td_common.xxx) と表示するか、 __str__ メソッドをオーバーライドし実装することで、 print時の出力形式を任意の形式に変更できます。
tomoyuki500219

2021/01/29 06:32

pythonの文法的に説明できる程、理解できていなく消化不良な感じですが、結果、print(data.td_common.xxx)で値を取れました。ありがとうございます。 __str__ メソッドをオーバーライドの方法は理解できていません。__str__メソッドを勉強してみますが、今回はどのようにコーディングすれば良いか、可能でしたらご教示いただけると幸いです。
teamikl

2021/01/29 06:44 編集

__str__を実装するのは、どちらかというと、 自分で構造体を定義する時向けです。 MAZ_TD_COMMONの定義がライブラリ側から提供されてるのでしたら、 MAZ_TD も 独自に拡張した MAZ_TD_COMMON を参照するようにしないといけないので、かえって手間が増えるかもしれません。 class MAX_TD_COMMON(Structure):内で  ...#中略  def __str__(self) -> str: # 任意の文字列を返す   return f"{self.xxx}, {self.yyy}" # 各メンバには self. で参照 ※ インデントは全角スペースに変換してます。
tomoyuki500219

2021/01/29 07:02

ご回答、誠にありがとうございます。 やはり経験不足でしっかり理解はできないですがMAX_TD_COMMONは安易に書換できない立場ですので、今後、参考にさせていだきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問