Неудобная структура данных - PullRequest
2 голосов
/ 11 апреля 2011

Я пишу утилиту, которая принимает текстовые файлы с разделителями табуляции и выводит таблицы HTML.Частью функциональности является возможность передавать значения фильтра в командной строке.Так, например, если у нас есть столбец «A», я должен быть в состоянии передать --filter «A» «foo» и видеть только те строки, для которых в столбце «A» содержится «foo».

Это подводит меня к моему вопросу.Я пишу это на C, и, возможно, из-за моей неопытности с языком у меня возникают проблемы с выражением структуры данных моего «фильтра».

Моя первоначальная попытка решить проблему - предварительно сохранить фильтры:

//Parse parameters and values, i.e. --start, --length
for (; i<argc; i++){
    if (argv[i][1] == '-'){
        argv[i]++; //Strip long options 
        if (i+1 == argc || argv[i+1][0] == '-'){
                fprintf(stderr, "Error: Missing argument to optional parameter!\n");
                exit(1);
        }
    }
    if (strcmp(argv[i], "-start")==0)
        start = strtol(argv[i+1], NULL, 0);
    else if (strcmp(argv[i], "-length")==0)
        length = strtol(argv[i+1], NULL, 0);
    else if (strcmp(argv[i], "-filter")==0){ //Store the filter arguments for later processing
        filters = realloc(filters, sizeof(char*) * (f+2));
        filters[f++] = strdup(argv[i+1]);
        filters[f++] = strdup(argv[i+2]);
    }
}

И затем, как только у меня появятся имена столбцов, для создания малонаселенного массива значений фильтра, который соответствует длине заголовка файла.Итак, если я просматриваю столбец 4, я смотрю четвертое значение массива фильтра и проверяю, заполнено ли оно значением.

Код, который расширяет «начальное» хранилище фильтра доэта таблица поиска выглядит следующим образом:

//Now that we know how many cols we have, create a sparsely populated filter array
for (j=0,i=0; i<ncols; i++){
    filtercols = realloc(filtercols, sizeof(char*) * (ncols+1));
    filtercols[i] = strdup("");
    for (c=0; c<f; c++){
        if (strcmp(columns + j, filters[c])==0){
            filtercols[i] = strdup(filters[c+1]);
            break;
        }
    }

    while (columns[j]){
        j++;
    }
    j++;
}

Кроме того, что это неудобно, я вижу, что если я укажу фильтр, который имеет одинаковое значение как для имени столбца, так и для значения фильтра, это не будет работать.

В чем-то вроде Python я бы справился с этим со словарями.Как лучше всего использовать эту ситуацию при работе в C?

Спасибо за потраченное время.

1 Ответ

2 голосов
/ 11 апреля 2011

Вы можете просто использовать хеш:

http://uthash.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...