Мikа писал(а):BCluster, ничего не происходит

На дисплее отображается число, хотя оно должно уменьшаться
Если Вы всё ещё не перешли на указатели или передачу по ссылке, то число и не должно уменьшаться.
Если вдруг пропустили - ещё раз повторю. При вызове функции все её аргументы скрыто копируются в новые переменные, с которыми функция может что угодно делать - все изменения будут ТОЛЬКО внутри функции и никак не повлияют на значения этих переменных снаружи.
Для того, чтобы указать, что надо не копировать переменные, а использовать те, что в аргументах, нужно либо функцию объявлять не как func(int a), а как func (int &a) (так можно только в C++), либо передавать в функцию не переменную, а указатель на неё (указатель - это по сути адрес ячейки памяти, в которой лежит переменная). Сравните:
Ваш вариант:
Сама функция:
void func (unsigned char sl, ...)
{
sl--;
...
}
Вызов:
sl = 3;
func (sl, ...);
При вызове функции создастся копия (передача аргумента по значению) переменной sl (внутренняя для функции). Она и уменьшится на 1. А при выходе из фунции - просто уничтожится. Внешняя же sl так и останется равна 3.
Вариант, допустимый в C++:
Сама функция:
void func (unsigned char &sl, ...)
{
sl--;
...
}
Вызов:
sl = 3;
func (sl, ...);
Теперь, посколько функция объявлена с &, это означает, что копия переменной не будет создаваться (передача аргумента по ссылке), и функция будет изменять ту же внешнюю переменную sl.
Вариант для C с указателями:
Сама функция:
void func (unsigned char *sl, ...)
{
(*sl)--;
...
}
Вызов:
sl = 3;
func (&sl, ...);
Теперь в функцию передаётся не переменная-значение, а указатель (адрес ячейки памяти, в которой хранится переменная). Соответственно, и при вызове надо писать &sl (&sl означает адрес переменной sl), а внутри функции - использовать *sl (sl внутри функции означает указатель адрес (мы ведь адрес передали в функцию), а *sl - то, что по этому адресу лежит (значение переменной)).
Вот такой своего рода ликбез.