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

代码中有一些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;


那么您在做什么会更有意义。

10-08 11:02
查看更多