У тебя неправильный подход. Ты сначала делаешь какую-то большую функцию, а потом хочешь её разбивать. Так вот эта большая функция твоя - это полное фуфло. Вот в чём дело. Потому что ты её уже неправильно сделал.
У тебя не должно быть так, что сначала появляется функция, а потом ты думаешь, что ею можно сделать. Должно быть наоборот. Сначала должна появляться задача, которую нужно сделать, а вот уже под эту задачу должна появляться функция, которая её выполняет. И таких функций может быть много, и все они могут быть разными.
Например, ты хочешь вывести строку "hello" в C.
Код#include <stdio.h>
int main(void)
{
printf("hello\n");
puts("hello");
fputs("hello\n", stdout);
fprintf(stdout, "hello\n");
fwrite("hello\n", 1, 6, stdout);
return 0;
}
Вывод
[guest@localhost c]$ .ansi t.c -o t
[guest@localhost c]$ ./t
hello
hello
hello
hello
hello
[guest@localhost c]$
Вот это уже готовые функции, их уже когда-то написали. И они решают твою задачу. Причём они для этого изначально вообще не предназначались. Многие из них не используются для таких задач, но они могут быть использованы. Они просто что-то делают с тем, что в них подают. А что в них подают и предназначались ли они для этого изначально - это неважно.
А вот та же задача, но перечисленные функции использовать запрещено. Что делать?
Можно написать функцию вместо них.
Код#include <stdio.h>
void f1(void)
{
putchar('h');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n');
}
void f2(char c)
{
putchar(c);
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n');
}
void f3(char c)
{
int i;
putchar('h');
putchar('e');
for (i = 0; i < 2; i++)
putchar(c);
putchar('o');
putchar('\n');
}
int main(void)
{
f1();
f2('h');
f3('l');
return 0;
}
Вывод
[guest@localhost c]$ .ansi t.c -o t
[guest@localhost c]$ ./t
hello
hello
hello
[guest@localhost c]$
Вот это уже ближе к делу. Задача поставлена и решена с помощью нескольких разных функций. То, что эти функции нигде больше не могут использоваться, - это неважно, это другой вопрос. Главное, что задача решена правильно и точно, как и ставилась.
А вот теперь давай подумаем, как так получилось, что функция printf(), написанная десятки лет назад, решила нашу задачу и тысячи других задач, а свои функции f1(), f2() и f3() могут решить только нашу задачу, но кроме неё не могут решить и десятка других задач?
В чём разница между printf() и f1()? В том, что в printf() строка "hello" передаётся через параметр (то есть выводимый текст параметризован), тогда как в f1() строки вообще нет, она образуется из символов, которые даже не параметризованы. А что у нас с f2(), ведь там есть параметр? А в f2() выводимый текст параметризован недостаточно, так же как и в f3().
В чём же секрет параметризации? В том, что данные должны быть параметризованы максимально и иметь как можно меньше всяких зависимостей. Для этого их стремятся сделать настолько простыми, насколько это возможно, потому что никогда не угадаешь, какие конструкции будут действовать через десятки лет, а какие выкинут на помойку и забудут, как страшный сон.
Вот таким образом и пишется функция: ты должен ставить задачу и решать её вызовом какой-то функции. А если функции не существует, то ты всё равно должен её вызывать, но потом дописывать её содержимое. И вот дописывая функцию, внутри неё ты делаешь то же самое - ставишь задачу и решаешь её вызовом какой-то функции.
В примере выше ты решаешь задачу вывода строки "hello" функцией f1(), а внутри функции f1() ты решаешь задачу вывода символа на экран функцией putchar(). (Благо putchar() готова уже и хорошо параметризована. Но если не готова, то ты так же её вызываешь, а потом дописываешь её внутренность, в которой всё повторяется - задача и вызов.)