2015-10-10 1 views
-5

[C ЯЗЫК] Мой учитель дал мне это, и я не позволил изменить его:C: Я не могу изменить мою структуру, но ошибка: должен использовать тег 'struct'. Это вина моего учителя?

struct NodeSCL { 
    int info; 
    struct NodeSCL* next; 
}; 
typedef NodeSCL* TypeSCL; // problem HERE 

я должен сделать программу, которая выполняется за два TypeSCL равной длины, а затем возвращать новые TypeSCL называемые «min_list», с младшим элементом, взятым из каждой позиции «i». Это моя программа:

TypeSCL minElements(TypeSCL l1, TypeSCL l2) 
{ 
    if(l1 == NULL) 
    { 
     return NULL; 
    } 
    TypeSCL min_list = (TypeSCL) malloc(sizeof(TypeSCL)); 
    if (l1->info <= l2->info) 
    { 
     min_list->info = l1->info; 
    } 
    else 
    { 
     min_list->info = l2->info; 
    } 
    min_list->next = minElements(l1->next, l2->next); 
    return min_list; 
} 

Я получил эту проблему «необходимо использовать„STRUCT“тег для обозначения типа„“NodeSCL Реальной проблема заключается в том, что я не могу изменить структуру и я не был. способный найти кого-то с той же проблемой (всем разрешили просто сменить структуру, чтобы решить проблему). Могу ли я что-то сделать, чтобы исправить проблему без изменения структуры? Спасибо за вашу помощь. Ps sorry ... Это C язык, а не C++

ответ

1

Если это предназначено для использования на C++, вам необходимо скомпилировать его с помощью компилятора C++. Если это предназначается, чтобы быть C, то ЬурейеЕ должен быть

typedef struct NodeSCL* TypeSCL; 

В любом случае, у вас есть проблемы со следующей строкой:

TypeSCL min_list = (TypeSCL) malloc(sizeof(TypeSCL)); 

sizeof (TypeSCL) дает размер типа указателя, не размер вещи, на которую указывает -; вы не выделяете достаточно памяти для экземпляра NodeSCL.

Если это предназначается, чтобы быть C++, то это должно быть написано как

TypeSCL min_list = new NodeSCL; 

Если это предназначается, чтобы быть C, используйте

TypeSCL min_list = malloc(sizeof *min_list); // no cast, operand of sizeof 

безвозмездной Rant

Ваш учитель способствует действительно дурной привычке, скрывая тип указателя в имени typedef. Нет ничего о имени TypeSCL, которое указывает на указатель на всех, и вводить в заблуждение использование двух совершенно разных имен для экземпляров типов и указателей типов.

Если вы хотите, чтобы объявить указатель на NodeSCL например, использования NodeSCL *, как так:

NodeSCL *min_list = new NodeSCL; //C++ 
struct NodeSCL *min_list = malloc(sizeof *min_list); // C 

Pointer семантика особенные, и вы не делаете никому никаких одолжений, скрывая их за определениями типов , только время, когда разумно это делать, если тип указателя должен быть «непрозрачным»; то есть пользователь этого типа никогда не должен разыменовывать его напрямую, а скорее передает его API, который выполняет все разыменования за кулисами.

+0

Строка 'NodeSCL * min_list = malloc (sizeof * min_list);' возвращает мне ту же ошибку, но с 'struct NodeSCL * min_list = malloc (sizeof * min_list); 'Я исправил его. – Falkons

+0

@Falkons: так что это определенно означает быть C, то? Я исправлю свой пример. –

4

Это C++ или C, так как у вас есть теги в вашем вопросе .. удалите один из них.

Если это C, и в соответствии с этой ошибкой я считаю, что это, то ваш учитель не так, и вы должны добавить struct к вашему typedef:

typedef struct NodeSCL* TypeSCL; 

В C, вы должны добавить ключевое слово struct везде, где вы его используете.

+0

Извините, ребята, это C-язык. – Falkons

+0

@Falkons Тогда вам нужно иметь 'struct' в typedef. –

1

Эта линия

TypeSCL min_list = (TypeSCL) malloc(sizeof(TypeSCL)); 

должен быть

TypeSCL min_list = malloc(sizeof(struct NodeSCL)); 
+0

(Я предполагал, что C, когда вы используете 'malloc') –

+0

Если я применил ваше исправление, я получил ошибку: использование необъявленного идентификатора 'NodeSCL'. – Falkons

+0

Включите этот заголовок –

2
typedef struct NodeSCL* TypeSCL; // without keyword struct it is likely to give error in C 

Вам нужно struct перед NodeSCL (предполагая C, как вы используетеmalloc).

+0

Пожалуйста, оставьте комментарий после downvoting. – ameyCU

+0

Извините, это C-язык – Falkons

+0

@Falkons Да, я ответил, предполагая, что C только :) – ameyCU

2

struct не требуется в C++. Тогда решение должно быть скомпилировано как C++.