2016-10-13 2 views
0

Для класса AC программирования, мне сказали, чтобы создать следующие структур с определений типов, в таком порядке:Использование таНос для создания указателя на несколько элементов структуры

//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); 

Однако, оттуда я не уверен, что нужно сделать, чтобы пройти через указатель для просмотра конкретного события. Я знаю, что это не просто массив, поэтому события [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

события [I] будет полностью работать. В C обозначение массива является сокращением для арифметики указателя, поэтому события [i] эквивалентны * (события + i) –

+1

Кроме того, [не отбрасывайте возвращаемое значение malloc] (http://stackoverflow.com/questions/ 605845/делать-I-монолитно-заместитель на результат из-таНоса). –

+0

Какие предупреждения вы получаете от компилятора? – user3386109

ответ

1

Компилятор говорит вам, что линия 82 бардак.

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

В частности, первый член event структуры является массивом char name[20], но вы пытаетесь инициализировать его с помощью одного символа *title. Но большая проблема заключается в том, что time и date (в структуре 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

Я вижу, что у вас есть ошибки todo: handle, но что именно вы намереваетесь делать с этими ifs? –

+0

@ 13islucky Я оставляю это для вас. Вы должны решить, что должна делать программа, если не осталось памяти (первый TODO). И вам нужно решить, что должна делать программа, если вход пользователя недействителен (второй TODO). – user3386109

Смежные вопросы