Вы не можете передать тип в качестве параметра функции в C.
MPI использует значения типа MPI_Datatype
, чтобы указать, какой тип передается, но что касается кода C, все, что выwrite для того, чтобы что-то действительно делать с объектом, должно обрабатывать этот объект как фактический тип, известный во время компиляции.
Итак, MPI, вероятно, предоставляет вам некоторые функции, которые немного помогают (janneb указывает MPI_Type_size
и я не знаю, какие есть другие).Но для такого рода вещей в C вам часто приходится кропотливо писать код для каждого типа:
switch(type) {
MPI_LONG_DOUBLE:
/* having said this, equality checks on floating-point types
are often a mistake anyway due to rounding errors making
values come out non-equal when "really" they're equal for
your purposes. But that's a whole subject of its own.
*/
if (*(long double*)ary != *(long double*)b) /* do something */;
break;
MPI_DOUBLE:
if (*(double*)ary != *(double*)b) /* do something */;
break;
MPI_FLOAT:
if (*(float*)ary != *(float*)b) /* do something */;
break;
MPI_INT:
if (*(int*)ary != *(int*)b) /* do something */;
break;
/* etc ... */
MPI_UNSIGNED_CHAR:
if (*(unsigned char*)ary != *(unsigned char*)b) /* do something */;
break;
default:
/* janneb's code */
int sz;
MPI_Type_size(type, &sz);
if (memcmp(ary, b, sz) {
// do something
}
/* or it might be better to indicate an error, so that any types
you haven't dealt with explicitly can be added to the code
when encountered.
*/
}
На самом деле, код janneb будет работать для всех целочисленных типов практически во всех реализациях C, которые вас интересуютимя, но если вы заботитесь о «правильной» переносимости, вам, вероятно, следует все равно обращаться с ними особо.
Очевидно, что вы действительно не захотите дублировать /* do something */
в своем коде, поэтому вы, вероятно, определите функциюequals
, и назовите это из теста if
в myMethod
.