質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

1113閲覧

構造体に使い方について

hiro329

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/08/10 06:27

前提

struct i2c_msg msg[] = { { .addr = dev_addr, .flags = 0, .len = 1, .buf = &reg_addr, }, { .addr = dev_addr, .flags = I2C_M_RD, .len = len, .buf = data, }, };

実現したいこと

i2c通信のデータ構造体が次のように定義されています。
この場合どのような書き方になるのでしょうか。
構造体というと

struct smi230_sensor_data {
int16_t x;
int16_t y;
int16_t z;
uint32_t sensor_time;
};

たとえば、次のような書き方しか知りません。

この場合、
smi230_sensor_data sens;

sens.x = 10;
sens.y = 20;
sens.z = 30;

のようにアクセスすると認識しおります。
間違っていますでしょうか。

その場合、上記に示した、構造体はどのような書式になりますでしょうか。

教えていただけると幸いです。

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

前提

ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

実現したいこと

ここに実現したいことを箇条書きで書いてください。### ヘディングのテキスト

  • ▲▲機能を動作するようにする

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2022/08/10 06:37

何を聞きたいのかわかりません。 もうちょっと詳しく説明できませんか
guest

回答3

0

ベストアンサー

i2c_msg構造体が別にあってそれの配列(長さ2)を{}で初期化し、さらにi2c_msg構造体を他の回答にもある指示付き初期化で初期化しいます。
なのでmsg[]は構造体ではなく配列です。アクセスするならmsg[0].addr;こんな感じ。

c++

1#include <stdio.h> 2 3//コンパイルエラーが収まるまで適当に定義を追加 4#define I2C_M_RD 0 5 6void* dev_addr = NULL; 7void* reg_addr = NULL; 8void* data = NULL; 9int len = 0; 10 11struct i2c_msg { 12 void* addr; 13 int flags; 14 int len; 15 void* buf; 16}; 17 18struct i2c_msg msg[] = { 19 { 20 .addr = dev_addr, 21 .flags = 0, 22 .len = 1, 23 .buf = &reg_addr, 24 }, 25 26 { 27 .addr = dev_addr, 28 .flags = I2C_M_RD, 29 .len = len, 30 .buf = data, 31 }, 32}; 33 34int main(void){ 35 // Your code here! 36 printf("%d", msg[0].addr); 37}

投稿2022/08/10 06:45

RiaFeed

総合スコア2701

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

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

0

.addrなどの部分は指示付き初期化です。
従来の{dev_addr,0,1,&reg_addr},...という書き方と同じです。

投稿2022/08/10 06:37

can110

総合スコア38266

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

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

0

指示初期化子(designated initializer)です。

投稿2022/08/10 06:34

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問