当我第一次尝试使用指向结构的指针(在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
#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
struttura_dati.c
#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;
}
你能帮我理解为什么main.c不能正确使用prodotti->(某事)的所有东西?谢谢!
答案 0 :(得分:1)
这些定义:
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_dati.h
,而不是struttura_dati.c
。目前,当您使用main.c
中的结构时,定义不可见。
答案 1 :(得分:0)
代码当前的结构方式,我认为即使你解决了当前的问题,你也会有一个NULL引用问题。在你的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;
}
看到最后的“回归”?它到底是做什么的?它会返回什么吗?它只是将控制权转移回主要功能,而主要功能则需要返回值。我真的很惊讶编译器没有选择它。