Переопределить то я могу, но хотелось бы избавить общественность от ошибки

А я ее и без переопределения могу использовать, вот установка нуля:
- Код: Выделить всё
semctl(SemHandle, 0, SEM_SETVAL, PSemun(0)^);
Самым лучшим доказательством будет пример использования этой функции прямо в других C-программах:
- Код: Выделить всё
void init_semaphore( int sid, int semnum, int initval)
{
union semun semopts;
semopts.val = initval;
semctl( sid, semnum, SETVAL, semopts);
}
Как видите, четвертым параметром передается сам semopts, а не ссылка на него. А если использовать декларацию из unix/ipc.pp, например для установки значения, то либо вызов возвращает ошибку ERANGE, либо устанавливает совсем левое, весьма высокое значение семафора.
Да и если посмотреть на описание SEmun, то непонятно зачем передавать его как var-параметр, ведь те поля, которые данная функция может записывать, уже являются указателями, адрес самого semun ей совершенно для этого не нужен.