ну он уже принимает **. * foo [] в прототипе функции даст ему тот же тип, что и ** foo :), который не является ошибкой, но часто ошибается программистами

я проблемы с компиляцией примера программы, представленной в разделе 5.11 книги. Я удалил большую часть кода и оставил только соответствующие вещи.

#define MAXLINES 5000
char *lineptr[MAXLINES];

void qsort1(void *lineptr[], int left, int right, int (*comp)(void *, void *));
int numcmp(char *, char *);

main(int argc, char *argv[]) {
    int numeric = 1;
    /* ... */
    qsort1((void**) lineptr, 0, 100, (int (*)(void*, void*))(numeric ? numcmp : strcmp));
}

void qsort1(void *v[], int left, int right, int (*comp)(void *, void *)) {
    /* ... */
}

int numcmp(char *s1, char *s2) {
    /* ... */
}

Проблема в том, что код не компилируется (я использую компилятор Digital Mars). Я получаю ошибку:

        qsort1((void**) lineptr, 0, nlines - 1, (int (*)(void*, void*))(numeric
? numcmp : strcmp));

                 ^
go.c(19) : Error: need explicit cast to convert
from: int (*C func)(char const *,char const *)
to  : int (*C func)(char *,char *)
--- errorlevel 1

Должно быть, что-то не так с объявлениями, хотя я правильно вставил код из книги. Я не знаю достаточно, чтобы сделать правильные изменения (раздел об указателях функций, конечно, мог бы быть написан более подробно).

РЕДАКТИРОВАТЬ: я должен был упомянуть, что я читаю ANSI-версию книги.