C - ошибка: неполное определение типа "struct name_s" - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь реализовать фильтр Блума в C. Я разбил файл на два заголовка, один открытый и один закрытый.Первый содержит сигнатуру функции e typedef структуры, а второй - определение структуры.

Это код нижнего заголовка:

bloom_filter_private.h

#ifndef BLOOM_FILTER_PRIVATE_H
#define BLOOM_FILTER_PRIVATE_H

#include <pds/bloom_filter.h>

struct bloom_filter_s {
    int *bit_vector;
    int dimension;
};

#endif /* BLOOM_FILTER_PRIVATE_H */

bloom_filter.h

#ifndef BLOOM_FILTER_H
#define BLOOM_FILTER_H

typedef struct bloom_filter_s* bloom_filter_t;

bloom_filter_t bloom_filter_create(int const dimension);

int bloom_filter_destroy(bloom_filter_t bloom_filter);

#endif /* BLOOM_FILTER_H */

В итоге у меня есть файл, в котором я реализовал код функции создания / уничтожения:

bloom_filter.c

#include <stdio.h>
#include <stdlib.h>
#include "bloom_filter_private.h"

bloom_filter_t bloom_filter_create(int const dimension) {

    if ( dimension >= 0) {

        int i;
        bloom_filter_t bloom_filter = malloc(sizeof(struct bloom_filter_s));

        if ( bloom_filter == NULL) {
            perror("Unable to create a bloom filter");
            abort();
        }

        bloom_filter->bit_vector = NULL;

        if ( dimension > 0 ) {

            bloom_filter->bit_vector = (int *) malloc(dimension * sizeof(int));

            if ( bloom_filter->bit_vector == NULL ) {
                perror("Unable to create a bit vector");
                abort();
            }

            for ( i = 0; i < dimension; i++ ) 
                bloom_filter->bit_vector[i] = 0;
        }

        bloom_filter->dimension = dimension;
        return bloom_filter;
    }
    else return NULL;
}

int bloom_filter_destroy(bloom_filter_t bloom_filter) {

    if ( bloom_filter != NULL) {

        free(bloom_filter->bit_vector);
        free(bloom_filter);

        return 1;   
    }

    return -1;
} 

Файлы bloom_filter.c и bloom_filter.h находятся в одной папке с именем src.Файл bloom_filter_private.h находится в подпапке pdf папки include.

Проблема в том, что я пытаюсь создать пустой фильтр Блума со следующим простым кодом, у меня есть эта ошибка:

ошибка: неполное определение типа "struct bloom_filter_s"

Поэтому я не могу получить доступ к полям structur.

main.c

#include <stdio.h>
#include <pds/bloom_filter.h>

int main(void) { 

    int i;
    bloom_filter_t bloom_filter = bloom_filter_create(10);

    for ( i = 0; i < 10; i++ )
        printf("[%d] =: %d\n", i, bloom_filter->bit_vector[i]);

    return 0; 
}

1 Ответ

3 голосов
/ 19 апреля 2019

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

bloom_filter.c:

int get_vector_element(bloom_filter_t bloom_filter, int index)
{
     return bloom_filter->bit_vector[index];
}

bloom_filter.h:

int get_vector_element(bloom_filter_t bloom_filter, int index);

Вы можете сделать следующее в main:

for ( i = 0; i < 10; i++ )
    printf("[%d] =: %d\n", i, get_vector_element(bloom_filter, i));
...