gpt4 book ai didi

c++ - 减去两个元素(来自同一结构)的地址?

转载 作者:行者123 更新时间:2023-11-28 06:39:07 25 4
gpt4 key购买 nike

我正在编写一个程序,我需要计算结构元素的两个地址之间的差异。抱歉,如果不清楚,一些代码可能更明确。

代码中有一些 MPI 元素,但这不是我的问题所在。

typedef struct Str {
std::vector<int> itab;
std::vector<char> ctab;
} s_str;

int main(int argc, char **argv)
{
s_str *struc1 = new s_str();

MPI_Datatype Strtype;
int count = 2;
int lengths[2] = { 8, 8 };
MPI_Aint disp[2];
disp[0] = &struc1->itab - &struc1;
disp[1] = &struc1->ctab - &struc1;
MPI_Datatype types[2] = { MPI_INT, MPI_CHAR };
MPI_Type_create_struct(count, lengths, disp, types, &Strtype);
MPI_Type_commit(&Strtype);

(...)
}

问题发生在这些行:

MPI_Aint disp[2];
disp[0] = &struc1->itab - &struc1;
disp[1] = &struc1->ctab - &struc1;

首先,MPI_Aint 是一个“包含任何有效地址的 C 类型”(摘自文档)。我在这里要做的是计算 struc1->itab 和 struc1 地址之间的差异。

这是我遇到的错误:

tmp2.cpp: In function ‘int main(int, char**)’:
tmp2.cpp:30:30: erreur: invalid operands of types ‘std::vector<int>*’ and ‘s_str** {aka Str**}’ to binary ‘operator-’
tmp2.cpp:31:30: erreur: invalid operands of types ‘std::vector<char>*’ and ‘s_str** {aka Str**}’ to binary ‘operator-’

我想我没有正确访问地址,因为这里涉及的类型是 std::vector<int>*s_str** .什么是正确的方法?

更多细节:我需要这个来使用 MPI-I/O 写入文件。它告诉 MPI 每个 proc 需要多少空间来写入它的整个数据集。所以基本上,我只想使用 MPI-I/O 在文件中写入用户定义结构的内容。原因如下。

最佳答案

我认为你的推理有点错误,即使你给出了 vector 所在的地址, vector 的实际元素也可能放在其他地方。

例如尝试

s_str struc1;
struc1.itab.push_back(0);
printf( "struc1.itab %p\n", (void*)&(struc1.itab) );
printf( "struc1.ctab %p\n", (void*)&(struc1.ctab) );
printf( "struc1.itab[0] %p\n", (void*)&(struc1.itab[0]) );
printf( "struc1 %p\n", (void*)&struc1 );

struc1.itab 000000000022fde0
struc1.ctab 000000000022fdf8
struc1.itab[0] 0000000000327f40
struc1 000000000022fde0

也许您最初有一个包含两个普通 c 数组的结构?

typedef struct 
{
int itab[100];
char ctab[100];
} struc1;

那么你所做的事情会更有意义。

关于c++ - 减去两个元素(来自同一结构)的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com