我正在编写程序,需要计算结构元素的两个地址之间的差。抱歉,如果不清楚,某些代码可能会更明确。
代码中有一些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将用户定义的结构的内容写入文件中。这就是为什么。
最佳答案
我认为您的推理有些错误,即使您给出向量实际位置的地址,也可能将向量的实际元素放置在其他位置。
尝试例如
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;
那么您在做什么会更有意义。