Вы можете создать объединение обеих структур. From C11 6.5.2.3p6 :
Одна специальная гарантия сделана для упрощения использования объединений: если объединение содержит несколько структур, которые имеют общую начальную последовательность (см. ниже), и если объект объединения в настоящее время содержит одну из этих структур, разрешается проверять общую начальную часть любой из них везде, где видна декларация завершенного типа объединения. Две структуры имеют общую начальную последовательность, если соответствующие элементы имеют совместимые типы (и, для битовых полей, одинаковой ширины) для последовательности из одного или нескольких начальных элементов.
Предполагая, что обе структуры имеют "общую начальную последовательность", ie. Имея совместимые типы для начальных членов, вы можете получить доступ к одному из них с помощью другого.
struct sParametersUdc {
float PI;
float C1;
float C2;
float error_old;
float imin;
float imax;
};
struct sParametersD {
float PI;
float C1;
float C2;
float error_old;
float imin;
float imax;
};
union sParameters {
struct sParametersUdc udc;
struct sParametersD d;
};
void regulator(union sParameters *param, float error)
{
struct sParametersUdc *udc = ¶m->udc;
udc->PI += udc->C1 * error
+ udc->C2 * udc->error_old;
if (udc->PI > udc->imax) {
udc->PI = udc->imax;
}
if (udc->PI < udc->imin) {
udc->PI = udc->imin;
}
udc->error_old = error;
}
int main() {
struct sParametersUdc udc;
regulator(&(union sParameters){ .udc = udc }, 1.0);
struct sParametersD d;
regulator(&(union sParameters){ .d = d }, 1.0);
}
Подобные действия могут быть полезны в некоторых случаях, но я думаю, что здесь они служат только уловкой и снижают качество кода. Из того, что вы показали, это похоже на расчет выходного сигнала от интегральной части ПИД-регулятора. Я считаю, что ваш код должен просто создать единую структуру для представления этого «объекта» из обеих структур и одну функцию для его обработки, как в ответе @idris.