结构为 208 位长变量
struct as 208 bits long variable
我正在尝试制作一个可以容纳 208 字节 位的 struct
。我的意图是使用每 3 位变量存储 68 个值,每个值介于 0 和 4 之间。
我目前有这个,但是我遇到了很多错误:
typedef struct {
uint64_t _1vr = 0;
uint64_t _2vr = 0;
uint64_t _3vr = 0;
uint16_t _4vr = 0;
} TEST;
const TEST test_bits = {
._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
(BVUS_VISOKO << 60),
._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
(BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
(BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
(BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
(BVUS_NIZKO1 << 60),
._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
(BVUS_VISOKO << 60),
._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};
- 4x:警告 19('test_bits' 接近初始化)[默认启用]
- 4x:警告结构初始值设定项中有 4 个多余元素[默认启用]
- 错误 1 在“=”令牌之前应为“:”、“、”、“;”、“}”或“__attribute__”
- 一大堆:警告 51 左移计数 >= 类型宽度[默认启用]
- 初始化程序中指定的错误 2 未知字段“_1vr”
- 初始化程序中指定的错误 20 未知字段“_2vr”
- 初始化程序中指定的错误 38 未知字段“_3vr”
- 初始化程序中指定的错误 56 未知字段“_4vr”
这些变量是在全局范围内定义的。
我不知道发生了什么事。老实说,我没有看到任何错误(当然我错了但是......)
编辑:
完全按照 WChargin 所说的去做我仍然无法摆脱下一个错误:
- 错误 12('test_bits._1vr' 接近初始化)
- 错误 24('test_bits._2vr' 接近初始化)
- 错误 36('test_bits._3vr' 接近初始化)
- 错误 11 初始化元素不是常量
- 警告 1 左移计数 >= 类型宽度[默认启用]
编辑2:
我正在 8 位架构上执行此操作。
问题:
- 您不能在
struct
声明中初始化结构成员。
也就是说,您的 uint64_t _1vr = 0;
语句无效。
这就是您收到 "expected…before '=' token" 错误的原因。
- 据推测,您的常量被定义为错误的大小——它们
long
不够吗?
为简单起见,我在这里使用了 #define
s,它确实有效。
这个编译很好(gcc -c
):
#include <stdint.h>
typedef struct {
uint64_t _1vr;
uint64_t _2vr;
uint64_t _3vr;
uint16_t _4vr;
} TEST;
#define BVUS_ZAC1 0ul
#define BVUS_ZAC2 0ul
#define BVUS_VISOKO 0ul
#define BVUS_NIZKO1 0ul
#define BVUS_NIZKO2 0ul
const TEST test_bits = {
._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
(BVUS_VISOKO << 60),
._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
(BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
(BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
(BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
(BVUS_NIZKO1 << 60),
._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
(BVUS_VISOKO << 60),
._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};
但是请注意,sizeof(TEST)
在我的(64 位)机器上产生 32
。
这可能不是你想要的。
在这个特定的体系结构中,64 位被定义为 long long,因此更改发布到 ULL 的定义 @WChargin 是可行的。
我正在尝试制作一个可以容纳 208 字节 位的 struct
。我的意图是使用每 3 位变量存储 68 个值,每个值介于 0 和 4 之间。
我目前有这个,但是我遇到了很多错误:
typedef struct {
uint64_t _1vr = 0;
uint64_t _2vr = 0;
uint64_t _3vr = 0;
uint16_t _4vr = 0;
} TEST;
const TEST test_bits = {
._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
(BVUS_VISOKO << 60),
._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
(BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
(BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
(BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
(BVUS_NIZKO1 << 60),
._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
(BVUS_VISOKO << 60),
._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};
- 4x:警告 19('test_bits' 接近初始化)[默认启用]
- 4x:警告结构初始值设定项中有 4 个多余元素[默认启用]
- 错误 1 在“=”令牌之前应为“:”、“、”、“;”、“}”或“__attribute__”
- 一大堆:警告 51 左移计数 >= 类型宽度[默认启用]
- 初始化程序中指定的错误 2 未知字段“_1vr”
- 初始化程序中指定的错误 20 未知字段“_2vr”
- 初始化程序中指定的错误 38 未知字段“_3vr”
- 初始化程序中指定的错误 56 未知字段“_4vr”
这些变量是在全局范围内定义的。
我不知道发生了什么事。老实说,我没有看到任何错误(当然我错了但是......)
编辑:
完全按照 WChargin 所说的去做我仍然无法摆脱下一个错误:
- 错误 12('test_bits._1vr' 接近初始化)
- 错误 24('test_bits._2vr' 接近初始化)
- 错误 36('test_bits._3vr' 接近初始化)
- 错误 11 初始化元素不是常量
- 警告 1 左移计数 >= 类型宽度[默认启用]
编辑2:
我正在 8 位架构上执行此操作。
问题:
- 您不能在
struct
声明中初始化结构成员。 也就是说,您的uint64_t _1vr = 0;
语句无效。 这就是您收到 "expected…before '=' token" 错误的原因。 - 据推测,您的常量被定义为错误的大小——它们
long
不够吗? 为简单起见,我在这里使用了#define
s,它确实有效。
这个编译很好(gcc -c
):
#include <stdint.h>
typedef struct {
uint64_t _1vr;
uint64_t _2vr;
uint64_t _3vr;
uint16_t _4vr;
} TEST;
#define BVUS_ZAC1 0ul
#define BVUS_ZAC2 0ul
#define BVUS_VISOKO 0ul
#define BVUS_NIZKO1 0ul
#define BVUS_NIZKO2 0ul
const TEST test_bits = {
._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
(BVUS_VISOKO << 60),
._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
(BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
(BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
(BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
(BVUS_NIZKO1 << 60),
._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
(BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
(BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
(BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
(BVUS_VISOKO << 60),
._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};
但是请注意,sizeof(TEST)
在我的(64 位)机器上产生 32
。
这可能不是你想要的。
在这个特定的体系结构中,64 位被定义为 long long,因此更改发布到 ULL 的定义 @WChargin 是可行的。