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

 
 
> структуры, доступ к полям
Метценгерштейн
сообщение Feb 8 2015, 10:08
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот у нас структура, через typedef
Код
typedef struct abc_s {
  int aa;
  int bb;
} abc_t;

создаю переменную этого типа
Код
abc_t abc;

дальше, хочу присвоить значение полю aa в моей переменной
Код
abc.aa = 8;

выдает ошибку. Почему? И как правильно?

а затолкав в ф-ю - все нормально. Т.е. вне ф-ии нельзя, получается, проводить начальную инициализацию?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Feb 8 2015, 17:03
Сообщение #2


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

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



Что-то у меня легко задается элемент структуры в майн-функции. Правда, я не пишу
typedef struct abc_s {
...
Зачем давать название структуре, если будет использоваться определение типа?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 17:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(ViKo @ Feb 8 2015, 20:03) *
Зачем давать название структуре, если будет использоваться определение типа?


Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде struct abc_s *next_item; и никто это не обругал.
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Apr 2 2015, 13:12
Сообщение #4


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

Группа: Участник
Сообщений: 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
SSerge
сообщение Apr 2 2015, 15:56
Сообщение #5


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

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- Метценгерштейн   структуры   Feb 8 2015, 10:08
- - SM   правильно вот так: abc_t abc = {8,9}; // по станд...   Feb 8 2015, 10:20
- - _Pasha   Цитата(Метценгерштейн @ Feb 8 2015, 14:08...   Feb 8 2015, 11:31
- - Метценгерштейн   я разобрался. нельзя одно поле инициализировать вн...   Feb 8 2015, 12:14
|- - SM   Цитата(Метценгерштейн @ Feb 8 2015, 15:14...   Feb 8 2015, 12:16
|- - SSerge   Цитата(SM @ Feb 8 2015, 19:16) Можно...   Feb 8 2015, 12:40
|- - SM   Цитата(SSerge @ Feb 8 2015, 15:40) Это да...   Feb 8 2015, 12:55
|- - ViKo   Цитата(SM @ Feb 8 2015, 20:14) Обычно, та...   Feb 8 2015, 17:20
||- - SM   Цитата(ViKo @ Feb 8 2015, 20:20) Попробов...   Feb 8 2015, 17:35
|- - CrimsonPig   Цитата(ohmjke @ Apr 2 2015, 14:12) Так а ...   Apr 2 2015, 13:40
- - ViKo   Возвращаясь к стартовому вопросу... У меня всё раб...   Feb 8 2015, 17:39
|- - SM   Цитата(ViKo @ Feb 8 2015, 20:39) И я не п...   Feb 8 2015, 17:41
- - ViKo   Я же написал, что работает. В Keil. В Main вот так...   Feb 8 2015, 17:59
- - SM   Цитата(ViKo @ Feb 8 2015, 20:59) В Main в...   Feb 8 2015, 18:00
- - ViKo   Цитата(SM @ Feb 8 2015, 21:00) А вне Main...   Feb 8 2015, 18:06


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

 


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


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