scandir в реализации функции c - sel - PullRequest
0 голосов
/ 27 октября 2018

man scandir дает мне следующую структуру функции scandir:

int scandir(const char *dirp, struct dirent ***namelist,
              int (*filter)(const struct dirent *),
              int (*compar)(const struct dirent **, const struct dirent **));

Предположим, я определил следующее:

struct dirent **namelist;
int len = scandir('.', &namelist, NULL, NULL)

это список всех файлов и имен папокв текущей папке.Но предположим, что у меня есть функции filter и compar следующей структуры:

int (*filter)(const struct dirent *) {
}

и аналогичные для сравнения, и я хочу вызвать эту функцию фильтра или просто NULL на основе некоторых критериев:

if (some criteria) int *filters = NULL;
else int* filters = &filter
int len = scandir('.', &namelist, filters, NULL)

но это дает ошибку указателя.Есть ли способ это исправить?

1 Ответ

0 голосов
/ 28 октября 2018
  1. filter - это указатель на функцию, а не указатель на int.
  2. В вашем коде filter локально ограничен блоком if else, что неверно.

Рабочий код будет выглядеть примерно так:

int nodots(const struct dirent *dp)
{
    return (dp->d_name[0] != '.');
}

int main(int argc, char **argv)
{
  struct dirent **entries;
  ...
  int (*myfilter)(const struct dirent *) = NULL;
  if(some_condition) myfilter = nodots;
  ...
  nents = scandir(".", &entries, myfilter, alphasort);
}
...