2016-10-13 44 views
0

對於交流編程類,我被告知要創建的typedef以下結構,按照這個順序:使用malloc創建一個指向多個項目結構

//STRUCTS 
struct time { 
    unsigned int hour; 
    unsigned int minute; 
    unsigned int second; 
};//end struct time 
struct date { 
    unsigned int month; 
    unsigned int day; 
    unsigned int year; 
};//end struct Date 
struct event { 
    char name[20]; 
    struct time* time; 
    struct date* date; 
};//end struct event 

//TYPEDEFS 
typedef struct time Time; 
typedef struct date Date; 
typedef struct event Event; 

從那裏,我應該問要創建的最大事件數量,然後分配一個具有足夠內存的指針用於許多事件。我的部分工作是:

Event *events; 

//Ask for max number of events and allocate memory 
printf("Number of events to add: "); 
scanf("%d", &numEvents); 
events = (Event*) malloc(sizeof(Event) * numEvents); 

但是,從那裏我不確定如何遍歷指針查看特定事件。我知道這不僅僅是一個數組,所以events [i]將不起作用。但除此之外,我迷路了。爲獲得一個事件我(打破)函數是:

void getEvent(Event *events, int index){ 
    //variables 
    char title[20]; 
    unsigned int day, month, year, hour, minute, second; 
    Event tempEvent; 


    //Ask for input 
    printf("Input title, date, and time.\n"); 
    if(index == 0) 
     printf("example -> title: dd/mm/yy hh:mm:ss\n"); 

    //Take input 
    scanf("%20[^:]: %u/%u/%u %u:%u:%u", title, &day, &month, &year, &hour, &minute, &second); 


    tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } }; 

    events[index] = tempEvent;  
} 

我知道,這是不對的,和我在測試段故障。

當我編譯,我得到這些警告(和有關類似事情有些重複):

Lab4.c: In function ‘getEvent’: Lab4.c:82:2: warning: braces around scalar initializer 
tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } }; 
^ Lab4.c:82:2: note: (near initialization for ‘(anonymous).name[1]’) 

Lab4.c:82:39: warning: excess elements in scalar initializer 
tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } } 
+6

事件[Ⅰ]將完全工作。在C中,數組符號是指針運算的簡寫,所以events [i]等於*(events + i) –

+1

此外,[不要轉換malloc的返回值](http://stackoverflow.com/questions/ 605845/DO-鑄最結果-的-的malloc)。 –

+0

你從編譯器得到了什麼警告? – user3386109

回答

1

編譯器告訴你,行82是一個爛攤子。

tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } }; 

特別地,event結構的第一構件是一個數組char name[20],但在嘗試使用單個字符*title進行初始化。但更大的問題是timedate(在event結構中)是指針,並且您沒有爲這些指針分配任何內存。

一種解決辦法是分配內存,然後有scanf填充中的值,如下所示:

void getEvent(Event *events, int n) 
{ 
    // allocate memory 
    events[n].time = malloc(sizeof(Time)); 
    events[n].date = malloc(sizeof(Date)); 
    if (events[n].time == NULL || events[n].date == NULL) 
    { /* TODO: handle the error */ } 

    //Ask for input 
    printf("Input title, date, and time.\n"); 
    if (n == 0) 
     printf("example -> title: dd/mm/yy hh:mm:ss\n"); 

    //Take input 
    int count = scanf("%20[^:]:%u/%u/%u%u:%u:%u", events[n].name, 
         &events[n].date->day, &events[n].date->month, &events[n].date->year, 
         &events[n].time->hour, &events[n].time->minute, &events[n].time->second); 
    if (count != 7) 
    { /* TODO: handle the error */ } 
} 
+0

我看到你有待辦事項:處理錯誤,但是你究竟打算如何處理這些錯誤? –

+0

@ 13islucky我讓你去做。如果沒有剩餘內存(第一個TODO),你必須決定程序應該做什麼。如果用戶輸入無效(第二個TODO),則需要決定程序應該執行的操作。 – user3386109

相關問題