Нормально ли в C передавать больше аргументов, чем в других языках? Это просто природа процедурного программирования против OOP? Или я просто пишу плохие C коды?
Это очень обычное дело. Это потому, что в C у нас нет объектов (да, есть, но это нечто совершенно иное, чем то, что Java люди назвали бы объектами), а вместо этого просто переменные (объекты в C).
Таким образом, вы передаете эквивалент класса C функциям, просто передавая функции каждый атрибут этого класса. Матрицы инвертирования функций будут иметь такую сигнатуру:
void inverse (const double *input, size_t ix, size iy,
double *output, size_t ox, size_t oy);
В Java или C ++ это будет выглядеть примерно так:
void inverse(const Matrix &input, Matrix &output);
(Я не очень разбираюсь в C ++ кодировщик, так что простите меня за ошибки)
Дело в том, что объект Matrix
содержит внутри себя размерные переменные-члены. Что-то, что не одобряется в OOP -языках, - это классы данных, то есть классы без методов и c переменных-членов.
В C есть эквивалент, и это структура. Нет поддержки функций-членов, если вы не используете указатели на функции (вы можете использовать OOP в C, но это очень беспорядочно). По сути, структура - это просто класс без инкапсуляции и поддержки частных членов. Так что они подходят для своей цели.
В отличие от массивов, вам не нужно передавать их как указатели. Это прекрасно:
struct myStruct {
int a;
char b;
double c[2];
void **;
};
bool intIsFortyTwo(struct myStruct args) {
return args.a == 42;
}
Вы также можете возвращать структуры:
struct myStruct initStruct() {
struct myStruct ret = {.a=22, .b='a'};
return ret;
}
В общем случае рекомендуется использовать указатели из соображений производительности. Если вы не используете указатели, будет создана полная копия структуры. Тогда первая функция могла бы быть
bool intIsFortyTwo(struct myStruct *args) {
return args->a == 42;
}
Передача структур функциям не очень распространена, но это тоже не странно. Используйте, если сочтете это полезным.