首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C-错误:“struct name_s”类型的定义不完整

C-错误:“struct name_s”类型的定义不完整
EN

Stack Overflow用户
提问于 2019-04-19 18:30:04
回答 1查看 1.5K关注 0票数 1

我试图在C中实现一个布卢姆过滤器。我将文件分成两个标题,一个是公共的,一个是私有的。第一个包含函数的签名e--结构的类型--以及第二个--结构的定义。

以下是heade的代码:

bloom_filter_private.h

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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 */

最后,我有一个文件,其中实现了create/destroy函数的代码:

bloom_filter.c

代码语言:javascript
运行
复制
#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.cbloom_filter.h位于名为src的同一个文件夹中。文件bloom_filter_private.h位于文件夹include的子文件夹pdf中。

问题是,我试图用以下简单的代码创建一个空布卢姆过滤器,我有以下错误:

错误:“struct bloom_filter_s”类型定义不完整

因此,我无法访问structur的文件。

main.c

代码语言:javascript
运行
复制
#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; 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 18:45:20

将结构的定义放入私有文件的全部目的是使用户不能看到内容。如果您想让用户访问这些字段,则需要在库中创建访问器函数:

bloom_filter.c:

代码语言:javascript
运行
复制
int get_vector_element(bloom_filter_t bloom_filter, int index)
{
     return bloom_filter->bit_vector[index];
}

bloom_filter.h:

代码语言:javascript
运行
复制
int get_vector_element(bloom_filter_t bloom_filter, int index);

您可以在main中执行以下操作

代码语言:javascript
运行
复制
for ( i = 0; i < 10; i++ )
    printf("[%d] =: %d\n", i, get_vector_element(bloom_filter, i));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55766220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档