Struct in Struct没有成员

时间:2016-02-03 20:34:00

标签: c struct

这是我的第一篇文章,我真的很抱歉我会做的...... 我有问题,我需要快点,我做错了什么? 它毗邻了一个"图书馆"关于结构的程序 我有文件:带有这种结构的标题

#include <stdio.h>
//Strutture
struct Date{short day, month, year;};
enum genre{thriller, novel, fantasy, horror};

struct Book{char title[64];
    char writer[32];
    enum genre bookGenre;
    struct Date published;
    short inLibrary;
    short outLibrary;
    short id;
};

然后是一个c文件,这个文件只包含定义; main将在另一个.c文件中:

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

...

//To add new book
Book_t *newBook(){
Book_t *bPtr;
if ((bPtr = calloc(1,sizeof(Book_t))) == NULL){
    printf("I'm sorry, I couldn't reserve enough memory\n");
}
else{

...

//Book genre
    while(genreOk ==0){
        printf("Insert new book's genre(0=thriller, 1=novel, 2=fantasy, 3=horror): ");
        scanf("%d",&t);
        if(-1< t <4){
            (*bPtr).genre = t;
            genreOk =1;
        }
        else{
            printf("\nInapropriate genre, try again");
        }
        printf("\n");
    }

    //Data libro
    while(dateOk ==0){
        printf("Insert new book's day of publish: ");
        scanf("%d", &dayT);
        printf("\nInsert new book's month of publish: ");
        scanf("%d", &monthT);
        printf("\nInsert new book's year of publish: ");
        scanf("%d", &yearT);

        dateOk = checkDate(dayT, monthT, yearT);
        if (dateOk == 1){
            (*bPtr).Date.day = dayT;
            (*bPtr).Date.month = monthT;
            (*bPtr).Date.year = yearT;
        }
        printf("\n");

    }
More messy code

当我尝试使用gcc -c mylib.c进行编译时出现此错误:

mylib.c: In function newBook:
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'genre'
 (*bPtr).genre = t;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
 (*bPtr).Date.day = dayT;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
 (*bPtr).Date.month = monthT;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
 (*bPtr).Date.year = yearT;

我在Windows 10计算机上使用Virtual Box和Ubuntu

3 个答案:

答案 0 :(得分:0)

genreDate是结构中字段的类型
bookGenrepublished是结构中字段的名称

所以,例如,你写的地方:

  (*bPtr).Date.day = dayT;

这是正确的:

  (*bPtr).published.day = dayT;

BTW,几乎每次使用->代替(* ).,因为它更容易,更快速,更简单:

  bPtr->published.day = dayT;

答案 1 :(得分:0)

您的代码有两个问题:

  1. 您会混淆类型名称和标识符名称。例如,在book结构中,成员名称为bookGenre,其类型为enum genre。您可以按标识符而不是按类型访问结构成员。因此,您需要编写(*book).genre
  2. ,而不是撰写(*book).bookGenre
  3. 您尚未在t来电之前声明变量scanf
  4. 您可以使用do实现类型验证循环,如下所示:

    enum genre input;
    do {
        printf("What is the genre?\n");
    } while (scanf("%d", &input) != 0 && input >= 0 && input <= 3);
    

    do循环将至少执行一次,因为在循环体完成后评估条件。这在这里是有道理的,因为我们首先询问用户问题,然后检查他是否输入了一个数字(scanf("%d", &input) != 0)并且它在[0, 3]范围内。如果条件尚未满足,则再次询问用户该问题,并且这将继续直到用户键入有效类型。请注意我们如何直接读入enum genre,而不是int - 这是因为int可以隐式地分配给enum,而不需要任何强制转换。< / p>

  5. 顺便说一句,您可以使用->访问结构指针成员。例如,代替(*book).genre,您可以编写book->genre

答案 2 :(得分:0)

另外,这个:

if(-1< t <4) ...

不起作用。 这样:

int t;

if ( (-1 < t) && (t < 4) ) ...

意愿。