Tag: struct

无法理解MPI_Type_create_struct

我无法理解MPI_Type_create_struct方法。 假设我们有一个结构: struct foo(){ float value; char rank; } 我们希望将此结构发送到另一个进程。 考虑下面的代码示例: int count = 2; //number of elements in struct MPI_Aint offsets[count] = {0, 8}; int blocklengths[count] = {1, 1}; MPI_Datatype types[count] = {MPI_FLOAT, MPI_CHAR}; MPI_Datatype my_mpi_type; MPI_Type_create_struct(count, blocklengths, offsets, types, &my_mpi_type); 我不确定在这个例子中做什么偏移和块长度。 有人可以解释上面这两部分吗?

具有“共同初始序列”的联合’双关语’结构:为什么C(99+)而不是C ++规定了’联合类型的可见声明’?

背景 关于通过union进行类型惩罚的大多数未实现或实现定义的性质的讨论通常引用以下位,在此通过@ecatmur( https://stackoverflow.com/a/31557852/2757035 ),对标准的豁免-layout struct具有成员类型的“公共初始序列”: C11( 6.5.2.3结构和联合成员 ; 语义 ): […]如果一个union包含几个共享一个公共初始序列的结构(见下文),并且如果union对象当前包含这些结构中的一个,则允许检查它们中任何一个的公共初始部分。 可以看到已完成的工会类型的声明 。 如果对应的成员具有一个或多个初始成员的序列的兼容类型(并且对于位字段,具有相同的宽度),则两个结构共享共同的初始序列 。 C ++ 03( [class.mem] / 16 ): 如果POD-union包含两个或多个共享公共初始序列的POD结构,并且如果POD-union对象当前包含这些POD结构中的一个,则允许检查它们中的任何一个的公共初始部分。 如果对应的成员具有一个或多个初始成员的序列的布局兼容类型(并且对于位字段,具有相同的宽度),则两个POD结构共享共同的初始序列。 这两个标准的其他版本都有类似的语言; 从C ++ 11开始,使用的术语是标准布局而不是POD 。 由于不需要重新解释,这不是真正的类型惩罚,只是应用于union成员访问的名称替换。 针对C ++ 17(臭名昭着的P0137R1)的提议使得这种显式使用的语言就像“访问就像其他结构成员被提名一样”。 但请注意粗体 – “ 在任何地方都可以看到完整类型的联合声明 ” – C11中存在的条款,但在2003年,2011年或2014年的C ++草案中没有任何内容(几乎完全相同,但后来的版本取代了“ POD“使用新术语标准布局 )。 在任何情况下,在任何C ++标准的相应部分中都完全没有’ union类型位的可见声明。 @loop和@ Mints97,在这里 – https://stackoverflow.com/a/28528989/2757035 – 显示这一行在C89中也没有,首先出现在C99中,然后保留在C中(尽管如此,再一次,永远不会过滤到C ++)。 关于此的标准讨论 [剪断 […]

为什么“typdef struct {struct S * s; S;“包含指向同一类型的指针编译?

我正在尝试typedef一个struct ,其中包含指向另一个相同类型的指针。 多数民众赞成我认为最好的版本: typedef struct Element { char value; struct Element *next; } Element; 为什么该变体也在编译+执行?: typedef struct { char value; struct Element *next; } Element; 为了描述第一个我会说: “现在名字struct Element Element ” ,第二个作为: “取这个匿名struct并称之为Element ” 但是为什么我仍然可以在第二种情况下声明一个struct Element (在struct中) ? (在GCC和MSVC工作)

memcpy vs C中的赋值

在什么情况下我应该期望memcpys在现代INTEL / AMD硬件上的性能优于其他? 我在32位Intel平台上使用GCC 4.2.x(但我也对64位感兴趣)。

双花括号初始化C结构的含义是什么?

我目前正在使用遗留的C ++代码,使用gcc 2.9.X成功编译。 我被要求将此遗留代码移植到gcc 3.4.X. 大多数错误很容易纠正,但这个特殊的错误让我很困惑。 上下文 : struct TMessage { THeader header; TData data; }; struct THeader { TEnum myEnum; TBool validity; }; 做了什么 : const TMessage init = {{0}}; /* Later in the code … */ TMessage message = init; 我的问题 : {{}}运算符的含义是什么? 它是否将第一个字段( 标题 )初始化为二进制0? 它是否将第一个结构( 枚举 )的第一个字段初始化为(字面值)0? 我得到的3.4.6错误是invalid conversion from ‘int’ […]

将对象初始化为全零

通常,数据结构的有效初始化是将所有成员设置为零。 即使使用C ++进行编程,也可能需要与外部API进行交互。 以下是否有任何实际区别: some_struct s; memset(&s, 0, sizeof(s)); 简单地说 some_struct s = { 0 }; 人们发现自己都使用这两种方法,选择哪种方法更适合给定的应用程序? (希望据了解,这只适用于POD结构;如果该结构中存在C ++ std :: string,则会遇到各种各样的破坏。) 对于我自己来说,作为一个不使用memset的C ++程序员,我从不确定函数签名,所以我发现第二个例子更容易使用,除了更少打字,更紧凑,甚至更多很明显,因为它在声明中说“这个对象被初始化为零”而不是等待下一行代码并且看到,“哦,这个对象是零初始化的”。 在C ++中创建类和结构时,我倾向于使用初始化列表; 我很好奇人们对上面两个“C风格”初始化的想法,而不是与C ++中可用的内容进行比较,因为我怀疑我们很多人都与C库接口,即使我们自己主要用C ++编写代码。 编辑: Neil Butterworth在后续提出这个问题 ,我认为这是这个问题的一个有趣的推论。

C中的单个结构成员的sizeof

我试图声明一个依赖于另一个结构的结构。 我想使用sizeof是安全的/迂腐的。 typedef struct _parent { float calc ; char text[255] ; int used ; } parent_t ; 现在我想声明一个与parent_t.text大小相同的struct parent_t.text 。 我怎样才能做到这一点? (下面的伪代码。) typedef struct _child { char flag ; char text[sizeof(parent_t.text)] ; int used ; } child_t ; 我用parent_t和struct _parent尝试了几种不同的方法,但我的编译器不接受。 作为一个技巧,这似乎工作: parent_t* dummy ; typedef struct _child { char flag ; char text[sizeof(dummy->text)] ; […]

具有相同成员类型的C结构是否保证在内存中具有相同的布局?

基本上,如果我有 typedef struct { int x; int y; } A; typedef struct { int h; int k; } B; 我有A a ,C标准是否保证((B*)&a)->k与ay相同?

C:typedef struct name {…}; VS typedef struct {…}名称;

正如标题所说,我有这个代码: typedef struct Book{ int id; char title[256]; char summary[2048]; int numberOfAuthors; struct Author *authors; }; typedef struct Author{ char firstName[56]; char lastName[56]; }; typedef struct Books{ struct Book *arr; int numberOfBooks; }; 我从gcc得到这些错误: bookstore.c:8:2: error: unknown type name ‘Author’ bookstore.c:9:1: warning: useless storage class specifier in empty declaration [enabled by default] bookstore.c:15:1: warning: useless […]

访问struct成员就好像它们是单个数组一样?

我有两个结构,其值应该计算一个沉重的平均值,就像这个简化版本: typedef struct { int v_move, v_read, v_suck, v_flush, v_nop, v_call; } values; typedef struct { int qtt_move, qtt_read, qtt_suck, qtd_flush, qtd_nop, qtt_call; } quantities; 然后我用它们来计算: average = v_move*qtt_move + v_read*qtt_read + v_suck*qtt_suck + v_flush*qtd_flush + v_nop*qtd_nop + v_call*qtt_call; 现在和他们一起我需要包含另一个变量。 现在,例如,我需要包含v_clean和qtt_clean 。 我无法将结构更改为数组: typedef struct { int v[6]; } values; typedef struct { int qtt[6]; […]