Как использовать struct в разных файлах c программированием - PullRequest
0 голосов
/ 28 июня 2018

Я получаю ошибку dereferencing pointer to incomplete type, но я дважды использовал структуру в другом файле и отлично работает. Почему, когда я пытаюсь использовать его в третий раз, я получаю эту ошибку? Очевидно, я использую другое имя, что означает, что это не совсем та же структура.

Здесь я определяю структуру

//bom.h
#ifndef BOM_H_INCLUDED
#define BOM_H_INCLUDED

struct polyinfo {
    int size;
    int poly[];
};

struct polyinfo *createpoly(struct polyinfo *s, int sz, int p2[]){
    int i;
    s=(int*)malloc(sizeof(*s) + sizeof(int)*sz);
    s->size=sz;
    for(i=0;++i<sz;)
        s->poly[i]=2*p2[i];
    return s;
};

int* bom(int s[], int n);

#endif // BOM_H_INCLUDED

Здесь я использую его дважды, отлично работает

//bom.c
#include <stdio.h>
#include "bom.h"

int* bom(int s[], int n){
    int i;
    int *s2;
    struct polyinfo *s3;//using the structure of polyinfo
    struct polyinfo *s4;//using the structure of polyinfo 2nd time
    s4 = createpoly(s4, n, s);//creating a poly multiply by 2

    printf("printing 2nd:");
    for(i=0;++i<n;)
        printf("%d", s4->poly[i]);
    printf("\n");

    s2=(int*)malloc(n*sizeof(int));
    printf("received n= %d\n",n);
    for(i=0;++i<n;)
        printf("%d", s[i]);
    printf("\n");

    for(i=0;++i<n;)
        s2[i]=2*s[i];

    s3 = createpoly(s3, n, s);//creating a poly multiply by 2

    printf("printing the struct, poly size: %d\n",s3->size);

    for(i=0;++i<n;)
        printf("%d ", s3->poly[i]);

    printf("\n");
    return s2;
}

Попытка использовать его в третий раз, выдает ошибку: dereferencing pointer to incomplete type

//main.c
#include <stdio.h>

int main(){
    int i, s[]={1,1,1,0,1};//the pattern that will go
    int n=sizeof(s)/sizeof(*s);//size of the pattern
    int *p;//sending the patt, patt-size & receiving the poly
    struct polyinfo *s5;//using the structure of polyinfo 3rd time
    s5 = createpoly(s5, n, s);//creating a poly multiply by 2

    printf("printing 2nd:");
    for(i=0;++i<n;)
        printf("%d", s5->poly[i]);
    printf("\n");

    p=bom(s, n);

    for(i=0;++i<n;)
        printf("%d", p[i]);

    return 0;
}

Если я попытаюсь использовать #include "bom.h" в main.c, ошибка будет multiple definition

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ошибки компоновщика нескольких определений происходят из-за определения функции в заголовочном файле.

  • Включите заголовочный файл из всех файлов, использующих его.
  • Переместите определение функции createpoly в bom.c, но сохраните прототип функции в bom.h.
0 голосов
/ 28 июня 2018

На самом деле в вашем коде есть две проблемы, и вам нужно исправить их обе. Исправление только одной проблемы, но не другой (что, по сути, вы и пытались) не сработает.

1) В настоящее время createpoly() определено (то есть реализовано) в заголовке, поэтому каждая единица компиляции, которая #include с этим заголовком, получит свое собственное определение - что заставляет программу не связываться в большинстве случаев. Самое простое решение для этого - объявить функцию только в заголовке и определить ее только в одном исходном файле (который, предпочтительно, также будет включать этот заголовок). Существуют альтернативы - например, префикс определения функции с static - но такие параметры имеют другие последствия (например, заставляя каждый объектный файл иметь свое собственное локальное определение функции), поэтому лучше избегать, если у вас нет особой необходимости делать это что.

2) Предварительного объявления достаточно для объявления указателя (например, struct polyinfo *s5 в вашем коде), но недостаточно для разыменования этого указателя (например, printf("%d", s5->poly[i])). Решение, в вашем случае, состоит в том, чтобы включить заголовок (с определением struct polyinfo) в main.c.

...