繁体   English   中英

在 C 中无效使用不完整的 typedef

[英]invalid use of incomplete typedef in C

我在 C 中实现了一个数据结构,但在我的测试文件中出现了这个错误。 不添加代码,因为那将是一个巨大的帖子,其中包含大量代码到 go,但这是我的代码的样子:

header.h file:
typedef struct array Arr;

functions.c file:
#include "header.h"

struct array{
int number;
int size;
char *names;
}

main.c file:
#include "header.h"

bool function(const Arr *const variable)
{

for (int i = 0; i < variable->size; i++)
{
 variable->number[i] = i;
}
}

所以我得到了标题中提到的错误,指的是 Arr*-> number 和 Arr ->*size。 我怀疑的问题是 Arr 只是类型定义但没有定义。 如果是这种情况,我该如何解决?

这是主要代码:

  main.c
#include <stdio.h>
  #include "header.h"
  int main(){
  set *setA = set_empty();

  set_insert(69,setA );

  set_insert(15, setA);

    set *setB = set_empty();

    set_insert(12,setB );

    set_insert(15, setB);

  set *setDiff = set_difference(setA, setB);

  printf("\n");

  print_set(setDiff);

  bool diff = verify_difference(setDiff, setA, setB);
}

bool verify_difference(const set *const setDiff, const set *const setA, const struct set *const setB)

{

  bool answer = true;

  for (int x = 0; x < setDiff->size; x++)
  {
          if (set_member_of(setDiff->array[x], setA) && set_member_of(setDiff->array[x], setB))
          {
                  answer = false;
                  break;
          }
  }
  return answer;
}

header.h
#ifndef HEADER_H
#define HEADER_H
#include <stdbool.h>

typedef struct set set;

set *set_empty();

void set_insert(const int value, set *s);

bool set_member_of(const int value, const set *const s);

functions.c
#include <stdio.h>
#include "header.h"
struct set {

    int capacity;

    int size;

    char *array;

};

set *set_empty()
{

struct set *ptr = malloc(sizeof(struct set));

ptr->size = 0;

ptr->array = malloc(sizeof(char));

ptr->capacity = 1;

return ptr;
}
void set_insert(const int value, set *s)
{
    if (!set_member_of(value, s)) {
        int bit_in_array = value; // To make the code easier to read

        // Increase the capacity if necessary
        if (bit_in_array >= s->capacity) {
            int no_of_bytes = bit_in_array / 8 + 1;
            s->array = realloc(s->array, no_of_bytes);
            for (int i = s->capacity / 8 ; i < no_of_bytes ; i++) {
                s->array[i] = 0;
            }
            s->capacity = no_of_bytes * 8;
        }

        // Set the bit
        int byte_no = bit_in_array / 8;
        int bit = 7 - bit_in_array % 8;
        s->array[byte_no] = s->array[byte_no] | 1 << bit;
        s->size++;
    }
}
set *set_difference(const set *const s1, const set *const s2)
{

struct set *s = set_empty();


for (int i = 0; i < s1->size; i++)
{
  if (!set_member_of(s1->array[i], s2))
  {
    set_insert(s1->array[i], s);
  }
}

for (int i = 0; i < s2->size; i++)
{
  if (!set_member_of(s2->array[i], s1))
  {
    set_insert(s2->array[i], s);
  }
}

return s;
}

bool set_member_of(const int value, const set *const s)
{
    int bit_in_array = value;

    if (bit_in_array >= s->capacity) {
        return false;
    }

    int byte_no = bit_in_array / 8;
    int bit = 7 - bit_in_array % 8;
    char the_byte = s->array[byte_no];

    return the_byte & 1 << bit;
}

结构的定义应在 main 中可用。 否则编译器不知道该语句引用的结构中是否有数据成员number

Arr->number[i] = i;

此外,在任何情况下,该语句都是不正确的,因为Arr是类型说明符,并且根据结构定义,数据成员number不是数组

看来你的意思

variable[i].number = i;

但是作为function参数

bool function(const Arr *const variable)

被声明为指向常量 object 的指针,那么您不能更改指向该结构的数据成员。

因此,要么将 function function的定义从main.c functions.c中,要么将结构定义放在 header 文件中。

而且有错别字

Typedef struct array Arr;
^^T

你需要使用小写字母

typedef struct array Arr;

我只能冒险猜测。 您的代码片段可能有误。

将结构定义移动到header.h并检查。

    //header.h file:
    typedef struct array Arr;
    
    struct array{
        int number;
        int size;
        char *names;
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM