teratail header banner
teratail header banner
質問するログイン新規登録
C

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

Q&A

解決済

3回答

5287閲覧

C言語の構造体のメンバをoffsetでアクセスする方法

ParaParaDance

総合スコア56

C

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

0グッド

2クリップ

投稿2020/08/19 09:59

0

2

C言語で大きさの異なる構造体メンバについて、構造体メンバ名ではなくて、offset(番目)でアクセスする方法はありませんでしょうか。
それができればLoopで回して構造体メンバの全てに読み書きができるので大変便利になります。

※もちろん、配列でやれば簡単な話ですが、メンバの型が異なるので配列で作るとなると最も大きなメンバのサイズを基準に作ることになり、メモリの無駄が大きくなります。

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

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

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

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

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

maisumakun

2020/08/19 10:01

型が異なる値を「Loopで回して全てに読み書き」するとは、どのような状況なのでしょうか?
cateye

2020/08/19 10:44

「型が異なる」構造体を同じ様にアクセスする・・・こと自体がおかしいです。 ・・・設計をやり直しましょう・・・
pepperleaf

2020/08/19 12:18

「大きさの異なる構造体メンバ」をどうアクセスすると考えていますか? 具体的な構造体の例はないでしょうか? 最初に構造体メンバのオフセットを取得すれば、そのオフセットでのアクセスは簡単です。ただ、大きさの異なるメンバという事は、型(int,long,char, etc.)も違うと思うのですが、それをどう Loopで回すのでしょう。
otn

2020/08/19 12:19

どんな構造体でしょうか?
thkana

2020/08/19 13:26

https://teratail.com/questions/274489 で解決したはずの話と思いますが、 なにか条件が変わったのですか? > メモリの無駄が大きくなります。 「無駄」ではなく、そういうアクセスをするためのコストです。そのコストを負うとシステムが破綻するのか、という判断は必要でしょう。破綻しないのなら支払えばいい話です。破綻するのなら、そのアクセス方法を諦めるというのが「ベター」な判断となるのでは?
退会済みユーザー

退会済みユーザー

2020/08/20 06:08

なんか同じような質問を3、4回くらいしてる気がするのですが…
guest

回答3

0

ベストアンサー

結局,以前と同じような話にしかならない.

各メンバの型が異なるので,オフセット位置とサイズがわかったところで,
最終的にメンバをどうやって(≒何型として)「読み書き」するつもりなのか?

C

1//構造体 2typedef 3struct S 4{ 5 short s; 6 char c; 7 int i; 8} S; 9 10//メンバの個数 11#define N_MEM 3 12 13//メンバのオフセットとサイズを配列に持っておく. 14//(これは構造体の宣言から機械的に作れるだろう) 15#define M_SIZE(type, mem) sizeof(((type *)0)->mem) 16const size_t MemOffset[N_MEM] = { offsetof(S,s), offsetof(S,c), offsetof(S,i) }; 17const size_t MemSize[N_MEM] = { M_SIZE(S,s), M_SIZE(S,c), M_SIZE(S,i) }; 18 19// 20int main(void) 21{ 22 S TheS; //S型のインスタンスがあって 23 24 int i; 25 //forでどうの(具体的に何をするのか不明) 26 for( i=0; i<N_MEM; ++i ) 27 { 28 //とりあえずここで "i番目のメンバ" のオフセットとサイズが 29 //MemOffset[i], MemSize[i] として得られるが…? 30 31 //ここでどうやって "i番目のメンバ" の値を読み書きすることを考えている? 32 } 33 return 0; 34}

投稿2020/08/20 01:31

fana

総合スコア12229

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

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

0

というか
https://teratail.com/questions/274489
のfanaさんの回答である

(というか,switchのコードを吐くやつを用意すればよくね?感.)

で話は終わってると思います。そういう構造体とswitch-case文を吐くスクリプトを適当な言語で生成するようにしておけばいいと思います。


C++なら、状況によってはもうすこし違うアプローチがあります。構造化束縛です。
https://cpprefjp.github.io/lang/cpp17/structured_bindings.html

投稿2020/08/19 13:42

yumetodo

総合スコア5852

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

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

0

その構造体の構造がわかれば、先頭からのオフセットでアクセスすることはできます
が、構造が不明の場合はどうしようもないですね

投稿2020/08/19 12:37

y_waiwai

総合スコア88180

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問