프로그램을 작성 중이며 구조 요소의 두 주소 사이의 차이를 계산해야합니다. 죄송합니다 명확하지 않은 경우 일부 코드가 더 명확 할 수 있습니다.동일한 구조의 두 요소를 뺍니다?
코드에는 일부 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 주소의 차이를 계산하는 것입니다.
는 여기에 내가지고있어 오류입니다 : 여기에 포함 된 유형 std::vector<int>*
및 s_str**
때문에
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-’
내가, 내가 제대로 주소를 액세스 할 수 없습니다 것 같아. 적절한 방법은 무엇입니까?
세부 정보 : MPI-I/O를 사용하여 파일을 작성해야합니다. MPI에게 각 proc이 전체 데이터 세트를 작성하는 데 필요한 공간을 알려주는 것입니다. 기본적으로 MPI-I/O를 사용하여 파일에 사용자 정의 구조체의 내용을 작성하려고합니다. 이유가 여기 있습니다.
'struc1'은 이미 * 주소 (포인터)이므로 address-of 연산자를 사용하면 주소 주소 (포인터에 대한 포인터)를 얻을 수 있습니다. 예를 들어를 사용하여 '수정'하면 '& struc1-> itab-struc1' 그러면 주소를 얻지 못하면 구조체 안에 itab 멤버의 * offset *을 얻습니다.이 구조체에는 표준 ['offsetof']이 있습니다 (http : // en .cppreference.com/w/cpp/types/offsetof) 매크로가 이미 있습니다. –
아, 구조체에 주소 연산자를 사용하지 않는 등의 '수정'을 사용해도 형식이 실제로 호환되지 않으므로 오류가 발생할 수 있으며 포인터를 캐스팅해야합니다. 또는 원하는 경우 offset을 얻으려면'offsetof' 매크로를 사용하십시오. –
@JoachimPileborg'offsetof'는 클래스가 표준 레이아웃이 아닌 한 UB입니다. 그리고'std :: vector'는 표준 레이아웃이 아니며 둘 다'Str'이 아닙니다. –