取消对C中不完整类型的引用(指向结构的指针)

取消对C中不完整类型的引用(指向结构的指针),c,pointers,struct,typedef,C,Pointers,Struct,Typedef,当我第一次(在main中)尝试使用指向结构的指针时,我在main.c的第14行中遇到了这样一个错误“取消对不完整类型的指针的引用”。这些是我的文件: main.c #include <stdio.h> #include <stdlib.h> #include "struttura_dati.h" int main(int argc, char *argv[]) { Prodotti *prodotti; int i, k, nc=0; k=atoi(argv[1]);

当我第一次(在main中)尝试使用指向结构的指针时,我在main.c的第14行中遇到了这样一个错误“取消对不完整类型的指针的引用”。这些是我的文件:

main.c

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

int main(int argc, char *argv[])
{
Prodotti *prodotti;
int i, k, nc=0;

k=atoi(argv[1]);

prodotti=leggi_medicinali();

printf("%d", prodotti->categorie[0]);

free(prodotti); /*da liberare anche vett */
return 0;
}
#包括
#包括
#包括“struttura_dati.h”
int main(int argc,char*argv[])
{
普罗多蒂*普罗多蒂;
int i,k,nc=0;
k=atoi(argv[1]);
prodotti=leggi_medicinali();
printf(“%d”,prodotti->categorie[0]);
自由(普罗多蒂);/*自由女神*/
返回0;
}
斯特鲁图拉·达蒂·h

#ifndef STRUTTURA_DATI_
#define STRUTTURA_DATI_

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

#define MAXNOME 21          /* max lunghezza nomi */
#define MAXPROD 50          /* max numero prodotti */
#define MAXDITT 10          /* max numero ditte */

typedef struct strutt_dati medicinale;
typedef struct vett_struct Prodotti;

Prodotti* leggi_medicinali();
int cerca(char temp[MAXNOME], char database[MAXPROD][MAXNOME], int n);
void stampa(char stringa[]);

#endif
\ifndef STRUTTURA\u DATI_
#定义STRUTTURA_DATI_
#包括
#包括
#定义MAXNOME 21/*max lunghezza nomi*/
#定义MAXPROD 50/*MaxNumero prodotti*/
#定义MAXDITT 10/*最大数字Ditt*/
类型定义结构strutt_dati medicinale;
typedef struct vett_struct Prodotti;
Prodotti*leggi_medicinali();
int cerca(字符温度[MAXNOME],字符数据库[MAXPROD][MAXNOME],int n);
void stampa(char stringa[]);
#恩迪夫
曼陀罗

#include "struttura_dati.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct strutt_dati {
char nome[MAXNOME];
int ditta;
int categoria;
};

struct vett_struct {
medicinale *vett;
char ditte[MAXDITT][MAXNOME];
char categorie[MAXPROD][MAXNOME];
int n_categorie;
int n_ditte;
};

Prodotti* leggi_medicinali() {

int i=0, fl;
char temp_categ[MAXNOME], temp_ditta[MAXNOME];
FILE *fp;

Prodotti* leggi_medicinali() {

int i=0, fl;
char temp_categ[MAXNOME], temp_ditta[MAXNOME];
FILE *fp;

Prodotti* prodotti;

fp=fopen("Medicinali.txt", "r");
if(fp==NULL) {
    printf("Errore nell'apertura del file ''Medicinali.txt''\n");
    exit(EXIT_FAILURE);
}

prodotti=malloc(MAXPROD*sizeof(Prodotti*));
prodotti->vett=malloc(MAXPROD*sizeof(medicinale));

prodotti->n_categorie=0;
prodotti->n_ditte=0;


while(!feof(fp)) {
    fscanf(fp, "%s %s %s", temp_categ, prodotti->vett[i].nome, temp_ditta);
    fl=cerca(temp_categ, prodotti->categorie, prodotti->n_categorie);
    if(fl==-1) {
        strcpy(prodotti->categorie[prodotti->n_categorie], temp_categ);
        prodotti->vett[i].categoria=prodotti->n_categorie;
        prodotti->n_categorie++;
    }
    else
        prodotti->vett[i].categoria=fl;

    fl=cerca(temp_ditta, prodotti->ditte, prodotti->n_ditte);
    if(fl==-1) {
        strcpy(prodotti->ditte[prodotti->n_ditte], temp_ditta);
        prodotti->vett[i].ditta=prodotti->n_ditte;
        prodotti->n_ditte++;
    }
    else
        prodotti->vett[i].ditta=fl;
    i++;
}
printf("%s ", prodotti->categorie[0]); /* THIS, IN struttura_dati.c WORKS, BUT IT DOESN'T IN main.c */
fclose(fp);
return prodotti;
}
#包括“struttura_dati.h”
#包括
#包括
#包括
strutt_dati结构{
字符名称[最大名称];
int ditta;
内分类;
};
结构vett_结构{
medicinale*vett;
char ditte[MAXDITT][MAXNOME];
字符分类[MAXPROD][MAXNOME];
国际n_分类;
int n_ditte;
};
Prodotti*leggi_medicinali(){
inti=0,fl;
字符温度类别[MAXNOME],温度类别[MAXNOME];
文件*fp;
Prodotti*leggi_medicinali(){
inti=0,fl;
字符温度类别[MAXNOME],温度类别[MAXNOME];
文件*fp;
普罗多蒂*普罗多蒂;
fp=fopen(“Medicinali.txt”,“r”);
如果(fp==NULL){
printf(“Errore nell'apertura del file”“Medicinali.txt”“\n”);
退出(退出失败);
}
prodotti=malloc(MAXPROD*sizeof(prodotti*);
prodotti->vett=malloc(MAXPROD*sizeof(medicinale));
prodotti->n_分类=0;
prodotti->n_ditte=0;
而(!feof(fp)){
fscanf(fp,“%s%s%s”,临时类别,产品->检查[i]。名称,临时编辑);
fl=cerca(临时类别、产品类别->分类、产品类别->n分类);
如果(fl==-1){
strcpy(prodotti->categorie[prodotti->n\u categorie],临时类别);
prodotti->vett[i].categoria=prodotti->n_categorie;
prodotti->n_categorie++;
}
其他的
prodotti->vett[i].categoria=fl;
fl=cerca(温度、产量->产量、产量->不产量);
如果(fl==-1){
strcpy(prodotti->ditte[prodotti->n_ditte],temp_ditta);
prodotti->vett[i].ditta=prodotti->n_ditte;
prodotti->n_ditte++;
}
其他的
prodotti->vett[i].ditta=fl;
i++;
}
printf(“%s”,prodotti->categorie[0]);/*这在struttura_dati.c中可以使用,但在main.c中不可用*/
fclose(fp);
返回prodotti;
}
你能帮我理解为什么main.c不能正确使用prodotti->(某物)?谢谢!

这些定义:

struct strutt_dati {
char nome[MAXNOME];
int ditta;
int categoria;
};

struct vett_struct {
medicinale *vett;
char ditte[MAXDITT][MAXNOME];
char categorie[MAXPROD][MAXNOME];
int n_categorie;
int n_ditte;
};
需要在
struttura\u dati.h
中,而不是
struttura\u dati.c
中。当前,在
main.c
中使用结构时,定义不可见。

这些定义:

struct strutt_dati {
char nome[MAXNOME];
int ditta;
int categoria;
};

struct vett_struct {
medicinale *vett;
char ditte[MAXDITT][MAXNOME];
char categorie[MAXPROD][MAXNOME];
int n_categorie;
int n_ditte;
};

需要在
struttura\u dati.h
中,而不是
struttura\u dati.c
中。当前,当您在
main.c
中使用结构时,定义不可见。

代码当前的结构方式,我认为即使您解决了当前的问题,您也会遇到空引用问题。在main.c中,您声明

Prodotti *prodotti;
你(大概)用它来填充

prodotti=leggi_medicinali();
但看看目前引用的函数

Prodotti* leggi_medicinali() {

    int i=0, fl;
    char temp_categ[MAXNOME], temp_ditta[MAXNOME];
    FILE *fp;

    Prodotti* prodotti;

    (... things that works)

    return;
}

看到最后的“回归”了吗?它到底做了什么?它返回了什么吗?它只是将控制权转移回主函数,而主函数缺少返回值。实际上,我很惊讶编译器没有接收到这一点。

按照代码当前的结构,我认为即使解决了当前的问题,您也会遇到空引用问题。在您的mai中n、 c你已经宣布

Prodotti *prodotti;
你(大概)用它来填充

prodotti=leggi_medicinali();
但看看目前引用的函数

Prodotti* leggi_medicinali() {

    int i=0, fl;
    char temp_categ[MAXNOME], temp_ditta[MAXNOME];
    FILE *fp;

    Prodotti* prodotti;

    (... things that works)

    return;
}

看到最后的“return”了吗?它真的做了什么?它返回了什么吗?它只是把控制权移回主函数,而主函数却没有返回值。我真的很惊讶编译器没有找到它。

谢谢你的回答,我这么做是因为我需要做一个ADT(稍后我会做得更好,现在我只是在草拟代码。)但是,我以前用过这个方法来定义结构,它成功了,为什么现在不起作用?这是我知道的唯一一种方法,以后有一个ADT。如果你真的想隐藏结构定义,你可以让函数在
struttura\u dati.c
中实现,在指向结构的指针上运行。谢谢你的回答,我做到了t因为我需要做一个ADT(稍后我会做得更好,现在我只是在画代码。)但是,我以前用过这个方法来定义结构,它成功了,为什么现在不起作用?这是我知道的唯一一种方法,以后会有一个ADT。如果你真的想隐藏结构定义,你可以让函数在
struttura_dati.c
中实现,在指向struct.Ops的指针上运行,我真的很抱歉,我忘记了把它写在问题中,但是在代码中我有“return prodotti”,但是,它不起作用。/我在第一篇文章中添加了prodotti*prodotti,现在所有的东西都有了,但是它是一个很长的代码,如果你想回答我就回答我。哦,我真的很抱歉,我忘了在问题中写它,但是在代码中我有“return prodotti”但是,它不起作用。:/我已经在第一篇文章中添加了Prodotti*Prodotti,现在已经有了所有内容,但这是一个相当长的代码,如果你愿意,请回答我。