C言語 gccのビットフィールドに詳しい人きて

■ このスレッドは過去ログ倉庫に格納されています
1 ◆Cmaster.z. 2018/07/04(水) 13:15:51.984ID:7zJZJaFqM
例えば

struct Tag {
uint32_t a:5;
uint32_t b:8;
uint32_t c:13;
uint32_t d:6;
} S;

というのがあったとして、a~dの先頭ビットがSの先頭から何バイト目にあるかを取得する方法を教えて

2以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:17:55.527ID:9qEwpE6K0
処理系はなんだよ

3 ◆Cmaster.z. 2018/07/04(水) 13:19:11.681ID:7zJZJaFqM
>>2
gcc
Linux 16
x86_64

4 ◆Cmaster.z. 2018/07/04(水) 13:19:29.374ID:7zJZJaFqM
Ubuntu 16だったすまん

5 ◆Cmaster.z. 2018/07/04(水) 13:21:01.367ID:7zJZJaFqM
効率的な方法がいい
コンパイル時に解決できるような方法

6以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:22:35.687ID:S33naPYMd
アドレス出せば?

7 ◆Cmaster.z. 2018/07/04(水) 13:23:09.208ID:7zJZJaFqM
>>6
ビットフィールドのアドレスは取得出来ない

8以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:24:52.166ID:gswa150Z0
マクロでなんやかんやする

9 ◆Cmaster.z. 2018/07/04(水) 13:25:32.359ID:7zJZJaFqM
>>8
そのアイデアの中身が欲しいんだお…

10以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:27:19.371ID:nSnNgjLi0
起動時に何ビット目か計測しておくくらいしか思いつかない

11以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:27:44.480ID:S33naPYMd
エンディアンが分からないってこと?

12 ◆Cmaster.z. 2018/07/04(水) 13:29:44.879ID:7zJZJaFqM
>>10
やっぱコンパイル時ってのは厳しいか…(´・ω・`)
起動時に計測しておいたものを使い回すのが最善かな

13 ◆Cmaster.z. 2018/07/04(水) 13:33:33.203ID:7zJZJaFqM
>>11
いや、エンディアンはx86だからリトルエンディアンだよ(´・ω・`)
あとgccは低いビットから順次詰めてくようになってる

14 ◆Cmaster.z. 2018/07/04(水) 13:34:08.661ID:7zJZJaFqM
ただし__atribute__((packed))を付けるものとする(´・ω・`)

15以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:35:40.754ID:nSnNgjLi0
コンパイル前にソースプログラムを読み込みビット位置を確定してソースを書き換えるプリプロセッサを作れば…

16 ◆Cmaster.z. 2018/07/04(水) 13:37:07.149ID:7zJZJaFqM
>>15
お、なるほど…(´・ω・`)
bashとかで行けそうだけど、絶対手作業で打ち込む方が早いね

17以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:41:44.291ID:nSnNgjLi0
位置は.hに#defineで出力させるだけのプログラム作ればOKか?

18 ◆Cmaster.z. 2018/07/04(水) 13:50:52.774ID:7zJZJaFqM
>>17
そんな手間をかけさせるわけにはいかないお(;・∀・)
ビットフィールドの位置を取得しなくても大丈夫なように、自力で何とかするお

19以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:51:48.763ID:nSnNgjLi0
>>18
1回作れば一生使いまわしできるぞ

20以下、5ちゃんねるからVIPがお送りします2018/07/04(水) 13:52:44.086ID:gswa150Z0
#define offsetof_Tag_a 0

21 ◆Cmaster.z. 2018/07/04(水) 13:56:31.010ID:7zJZJaFqM
>>19
まぁそこまで必要でもないからな…(´・ω・`)
気持ちだけ受け取っとくお

■ このスレッドは過去ログ倉庫に格納されています