Вот код
int AreSymEquivalent_hkl(const T_SgInfo *SgInfo, int h1, int k1, int l1,
int h2, int k2, int l2)
{
int iList, mh2, mk2, ml2, hm, km, lm;
T_RTMx *lsmx;
mh2 = -h2;
mk2 = -k2;
ml2 = -l2;
/* check list of symmetry operations */
lsmx = SgInfo->ListSeitzMx;
for (iList = 0; iList < SgInfo->nList; iList++, lsmx++)
{
hm = lsmx->s.R[0] * h1 + lsmx->s.R[3] * k1 + lsmx->s.R[6] * l1;
km = lsmx->s.R[1] * h1 + lsmx->s.R[4] * k1 + lsmx->s.R[7] * l1;
lm = lsmx->s.R[2] * h1 + lsmx->s.R[5] * k1 + lsmx->s.R[8] * l1;
if ( h2 == hm && k2 == km && l2 == lm)
return (iList + 1);
else if (mh2 == hm && mk2 == km && ml2 == lm)
return -(iList + 1);
}
return 0;
}
Это функция, определенная из довольно известного пакета 'sginfo' в области вычислительной кристаллографии. (Вы можете скачать отсюда, если хотите: https://github.com/rwgk/sginfo/tree/master/sginfo_1_01) Так что я уверен, что в этом нет ошибки. Вопрос в строках
lsmx = SgInfo->ListSeitzMx;
for (iList = 0; iList < SgInfo->nList; iList++, lsmx++)
Где "SgInfo" - это большая структура, которую я здесь не поместил, содержащая "ListSeitzMx" - атрибут объединения с именем "T_RTMx", который содержит информацию о некоторых матрицах , Определение следующее:
typedef union
{
struct { int R[9], T[3]; } s;
int a[12];
}
T_RTMx;
Это часть меня смущает, "++" после объединения. Что я знаю, так это то, что значение int перед "++" добавляет к 1, но тип объединения не имеет смысла. Или я сделал большую ошибку всего этого? То, что «lsmx» не является объединением или чем-то ... Как новичок C, я пытался написать небольшой тестовый сценарий по этому вопросу, но ошибки сводили меня с ума. Поэтому я наконец решил опубликовать sh этот вопрос ...