реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> структуры, доступ к полям
ViKo
сообщение Feb 8 2015, 18:06
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(SM @ Feb 8 2015, 21:00) *
А вне Main, как автор хотел, слабо?

Яволь, пардон, ... спорол-с...
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Apr 2 2015, 13:12
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Цитата(SM @ Feb 8 2015, 21:14) *
Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде struct abc_s *next_item; и никто это не обругал.


Так а почему все-таки так нельзя делать?

Если просто выполнить typedef так:
Код
typedef struct
{
    int a;
    char b;
} test_t;

то все работает.

Но мне для связного списка как раз нужно поле с указателем на следующий элемент:
Код
typedef struct
{
    int a;
    char b;
    test_t *next;
} test_t;

вот так не работает, пиште "unknown type name". Но почему? Тип test_t ведь определен.

Приходится делать так:
Код
typedef struct
{
    int a;
    char b;
    struct test_t *next;
} test_t;


А чтобы потом в коде еще можно было сделать так:
Код
test_t *s_test;
s_test = s_test->next;

(ошибка "a value of type "test_t *" cannot be assigned to an entity of type "struct test_t *")

приходится добавлять test_t между идентификатором struct и фигурными скобками:
Код
typedef struct test_t
{
    int a;
    char b;
    struct test_t *next;
} test_t;


Сообщение отредактировал ohmjke - Apr 2 2015, 13:20
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Apr 2 2015, 13:40
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(ohmjke @ Apr 2 2015, 14:12) *
Так а почему все-таки так нельзя делать?


Ответ на вопрос "почему" читать тут:
http://stackoverflow.com/questions/252780/...t-so-often-in-c

CODE

typedef struct S_Tag
{
int a;
int b;

struct S_Tag* pNext;
} S ;

int _tmain(int argc, _TCHAR* argv[])
{
S struct1;
S struct2;

struct2.pNext = &struct1;

return 0;
}

Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 2 2015, 15:56
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ohmjke @ Apr 2 2015, 20:12) *
Но мне для связного списка как раз нужно поле с указателем на следующий элемент:

Проблема решается путём предварительного определения typedef, а потом самой структуры.
Это работает потому что при обработке typedef нет неоходимости знать деталей устройства структуры.
Код
typedef struct test_t test_t;
struct test_t
{
    int a;
    char b;
    test_t *next;
};

Кстати, обратите внимание на то, что имя test_t используется и для имени структуры и как имя нового типа, в С можно так делать (хотя и нежелательно - вводит в заблуждение) потому что эти имена не конфликтуют - они принадлежат разным пространствам имён, а компилятор по контексту определяет что имеется в виду.

Но так дело обстоит в С, а в С++ всё сложнее и одновременно проще.
В С++ структура это тоже класс, то есть
struct s { ...
эквивалентно
class s { public: ...
и поэтому в предыдущем примере нет необходимости объявлять typedef, имя структуры уже является именем нового типа.
Но можно и оставить, тавтология с typedef допускается для совместимости с С. sm.gif


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 00:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016