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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Анонимные структуры IAR vs Keil
dimone
сообщение Jun 4 2016, 10:24
Сообщение #1


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242



-Приветствую, есть проект на "Сях в ИАР-е , в нем плотно используются структуры с "автоопределением" типа:
Код
static union
    {struct
         {  сhar bit_1 : 1;    
            char bit_2 : 1;
            char bit_3 : 1;
            char bit_4 : 1;
            char bit_5 : 1;
            char bit_6 : 1;
            char bit_7 : 1;
            char bit_8 : 1;
        } ;
      char byte;
    };

И с использованием членов как: bit_2 =1; или byte=5;
Возникла необходимость перетянуть прогу на Кеил, и тут наткнулся на неприятную вещь,
как невозможность использовать вышеуказанное непосредственно ,
при попытке использовать команду препроцессора #pragma anon_unions
компилятор пропускает лишь объявление\определение, с предупреждением,
но при попытке обратиться к члену дает ошибку...
Может у кого-то будут идеи как минимальными затратами исправить ситуацию, уж больно не хочется перелопачивать всё )
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 4 2016, 18:21
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(dimone @ Jun 4 2016, 13:24) *
Уши бы поотрывал этому писателю!
Если ты не можешь запомнить, что нумерация бит в байте при ЛЮБЫХ условиях начинается с НУЛЯ, а не с единицы, то пора задуматься о смене профессии...

Теперь по теме:
Под какой таргет пишете?
Какой стандарт языка задаёте компилятору?
Какая версия keil?

HINT:
http://electronix.ru/forum/lofiversion/index.php/t88403.html


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 5 2016, 01:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(dimone @ Jun 4 2016, 13:24) *
Уши бы поотрывал этому писателю!
Если ты не можешь запомнить, что нумерация бит в байте при ЛЮБЫХ условиях начинается с НУЛЯ, а не с единицы, то пора задуматься о смене профессии...

Простите, а с чего Вы решили, что автор этого не знает или не запомнил? Приведенный код в этом намеков не содержит. Названия полей - так-то может удобнее так (часто и бывает)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 5 2016, 02:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (demiurg_spb @ Jun 4 2016, 21:21) *
Какой стандарт языка задаёте компилятору?

Не С99 вот и вся "проблема".


QUOTE (DASM @ Jun 5 2016, 04:38) *
может удобнее так (часто и бывает)

Может еще и типа TRUE equ 0, признаете "удобнее"?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 5 2016, 02:46
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(zltigo @ Jun 5 2016, 05:36) *
Может еще и типа TRUE equ 0, признаете "удобнее"?

Зачем утрировать? Не совсем тот случай
Go to the top of the page
 
+Quote Post
dimone
сообщение Jun 5 2016, 06:46
Сообщение #6


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242



Цитата(dimone @ Jun 4 2016, 13:24) *
Уши бы поотрывал этому писателю!
Если ты не можешь запомнить, что нумерация бит в байте при ЛЮБЫХ условиях начинается с НУЛЯ, а не с единицы, то пора задуматься о смене профессии...

-спасибо за совет, почти по-Фрейду, особенно если учесть что у меня есть документы радиста и диплом радиоинженера одного из питерских вузов..
Хочу возразить вам, в случаях если битовая нумерация отражает ,например, работу анодных ключей индикатора, то физическая нумерация разрядов может отображатьсяна
их битовые эквиваленты ,для удобства и во избежании путаницы..
Извиняюсь что вырвано из контекста, но это не моветон)

Опции компилятора: --c99 -c --cpu Cortex-M3
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 5 2016, 06:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Во-во. cool.gif
Кстати, а какую ошибку он выдает?
Go to the top of the page
 
+Quote Post
dimone
сообщение Jun 5 2016, 06:59
Сообщение #8


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242




при объявлении:
warning: #64-D: declaration does not declare anything
при доступе:
error: #20: identifier "bit_2" is undefined

Сообщение отредактировал dimone - Jun 5 2016, 07:02
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 5 2016, 07:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Да, вижу, попробовал.
Почитал тут срач https://rsdn.ru/forum/cpp/4809952.flat - охота заморачиваться с анонимностью отпала напрочь. Может ну ее?
Go to the top of the page
 
+Quote Post
dimone
сообщение Jun 5 2016, 07:24
Сообщение #10


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242



Цитата(DASM @ Jun 5 2016, 10:09) *
..- охота заморачиваться с анонимностью отпала напрочь. Может ну ее?

-И я склоняюсь к этому, точнее уже морально готов править тонну кода,
но людям же свойственно пытаться прокатить "на шарика", и вот попытка не пытка.. laughing.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 5 2016, 07:49
Сообщение #11


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

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



Сделать структуру именованной, а потом заменить одним махом в Notepad++ bit_1 на bits.bit_1. А еще лучше - на Anode.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 5 2016, 17:23
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Сделать структуру именованной, а потом при помощи define задать для старого имени из исходников эквивалент имени члена новой структуры.
Go to the top of the page
 
+Quote Post
dimone
сообщение Jun 5 2016, 18:37
Сообщение #13


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242



Цитата(jcxz @ Jun 5 2016, 20:23) *
Сделать структуру именованной, а потом при помощи define задать для старого имени из исходников эквивалент имени члена новой структуры.

-cамое простое и логичное решение, в моеи ситуации, как сразу не допер..
Спасибо!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 5 2016, 20:14
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(DASM @ Jun 5 2016, 05:46) *
Зачем утрировать? Не совсем тот случай

Именно тот случай.
Либо давай имена в соответствии с исполнительными механизмами на более высоком уровне абстракции, либо не изобретай велосипед вовсе. И диплом радиоинжинера тут совершенно не причём.
Есть люди с двумя-тремя дипломами, а программировать не умеют...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2016, 15:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (DASM @ Jun 5 2016, 10:09) *
Почитал тут срач https://rsdn.ru/forum/cpp/4809952.flat - охота заморачиваться с анонимностью отпала напрочь. Может ну ее?

Никаке срачи читать не собираюсь, поскольку неименованные структуры безмерно полезны. Когда приходится изредка описывать, например, протоколы под убогие компиляторы, то заморочки вылезют немалые, БЕЗ возможности описания таких структур.


QUOTE (dimone @ Jun 5 2016, 09:46) *
Хочу возразить вам, в случаях если битовая нумерация отражает ,например, работу анодных ключей индикатора....

...то нефиг их называть "битами" да и нумеровать их цифрами.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 7 2016, 11:16
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(zltigo @ Jun 6 2016, 18:38) *
Никаке срачи читать не собираюсь, поскольку неименованные структуры безмерно полезны.

Я Вам именно и не предлагал. Речь не об их полезности, а разношерстности толкования их компиляторами и довольно посредственного понимания программистами терминологии.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2016, 16:02
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (DASM @ Jun 7 2016, 14:16) *
Речь не об их полезности, а разношерстности толкования их компиляторами

Лично я никогда никакой разношерстности толкования компиляторами не замечал, а пользую повседневно я их 6-7 штук.
Либо компилятор понимает, либо нет. После с99 понимают все. До с99 - некоторые. Поминаемый здесь Кейл, правда, не использовал сколь-нибудь серьезно никогда.
QUOTE
и довольно посредственного понимания программистами терминологии.

а это вооюще не интересно, главное, что меня компиляторы понимают.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 7 2016, 19:09
Сообщение #18


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А каким образом решается конфликт объявления нескольких разных анонимных структур или юнионов с одинаковыми названиями членов на том же уровне иерархии (локальном/глобальном)? Что там говорит стандарт о вложениях анонимных структур/юнионов? Все анонимные вложения тоже считаются одним уровнем области видимости, на котором запрещены одинаковые имена? Или запрет наложения имён только на том же уровне (не заходя в анонимные структуры), а поиск при компиляции будет вниз по иерархии (по анонимам) до первого встречного совпадающего имени? В последнем случае зарыта грабля. Логично, конечно, если при создании структуры правила поиска будут ближе к разбору исполняемого кода. Но т.к. факт анонимности структуры обнаруживается после создания компилятором её (анонимного) типа, то все проверки имён будут после. Проблема видится в том, что имена членов при этом не должны совпадать ни с какими именованными объектами, которые нельзя замещать на текущем уровне (локальном/глобальном). Это усложняет логику компилятора. Хотелось бы знать - ради чего.

Цитата(dimone @ Jun 5 2016, 22:37) *
Цитата(jcxz)
Сделать структуру именованной, а потом при помощи define задать для старого имени из исходников эквивалент имени члена новой структуры.

-cамое простое и логичное решение, в моеи ситуации, как сразу не допер..

Там разве не все члены придётся "задефайнивать"? Ведь <старые имена> это все члены структуры.

Цитата(zltigo)
неименованные структуры безмерно полезны. Когда приходится изредка описывать, например, протоколы под убогие компиляторы, то заморочки вылезют немалые, БЕЗ возможности описания таких структур.

Можно пример? В чём полезность?
Как в С99 или другом стандарте безымянная структура объявленная в одном модуле видна другому модулю? Члены/поля структур передаются через хидеры с typedef. А безымянную структуру-переменную вроде как нельзя объявить через typedef. Даже просто указатель на неё не передать в код из другого модуля. Пока наблюдается только полная невидимость глобальной структуры/юниона-переменной извне модуля. А внутри модуля переменная такая, которая в памяти есть, но её адрес получить нельзя. Адрес первого элемента/члена это не то же самое. Но размер узнать можно, если при объявлении было указано предворяющее имя. ЗЫ. Термин модуль здесь в Паскаль-терминологии. Если в Си он что-то другое/большее значит.

--------
Кажется можно объявить анонимную структуру-переменную с предворяющим именем, и этот созданный тип перенести в typedef и задать ему имя, которое можно будет использовать в type-cast. Но полученное type-object-name будет только для текущего модуля, т.к. оно создаётся после создания переменной.

Сообщение отредактировал GetSmart - Jun 8 2016, 12:43


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Baser
сообщение Jun 7 2016, 21:18
Сообщение #19


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(GetSmart @ Jun 7 2016, 22:09) *
А каким образом решается конфликт объявления нескольких разных анонимных структур или юнионов с одинаковыми названиями членов на том же уровне иерархии (локальном/глобальном)?

Можно пример? Если это о сборке нескольких в один проект, то придётся следить чтобы имена членов у разных протоколов никогда не совпали. Если совпадут, то кирдык компиляции. Править протоколы, точнее множество имён, под свою сборку - плохая идея. Гораздо проще править одно имя - имя структуры.

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

Вот пример для ИАР-а MSP430:
Код
typedef struct {
  union {
    unsigned short StatAll;
    struct {
        unsigned char Status;
        struct {
            unsigned char Mode  :2;
            unsigned char Dir   :1;
            };
        };
    };
  struct {
    unsigned char fZeroHold     :1;
    unsigned char               :7;
    };
  unsigned char CurrentLimit
  unsigned int AccelStart;
  unsigned int AccelBrake;
  ...
  signed long MaxPosition;
  } motor_vars_t;

motor_vars_t Motor;

Именованны только члены вложенных структур, сами внутренние структуры анонимны.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 7 2016, 21:45
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Baser @ Jun 8 2016, 01:18) *
Компилятор сам именует всё не именованное (анонимное) своими внутренними уникальными именами, поэтому никаких конфликтов нет. Если посмотреть листинги и мар-файл, там все эти имена видны.

А причём тут это? При разборе текста кода этих имён в тексте не должно быть и если даже писатель кода туда вставит имя из MAP-файла, то компилятору надо заругаться. Если "уникальные имена" становятся видимы постфактум, то как их предугадывать? )) Плюс это уже далеко от стандарта.

----------
Вообще, если в стандарте написано, что доступ к члену структуры/юниона происходит через оператор точка или ->, и явно не указано, что есть другой способ, то анонимная compound-переменная (ака структура/юнион) не разрешена. Операторы точка и -> бинарные. Внутри объявления compound-константы связь с типом есть неявно, без необходимости использовать имя. То бишь есть смысл/удобство его опускать в тексте и для сокращения текста и для анонимного варианта. И ещё здесь между объявлением анонимного compound-типа (вместе с переменной) и доступом к члену нет возможностей локального замещения имён. Но, признаюсь, в реале мне никогда не надобились такие анонимы и не проверял создание таких переменных и констант ни на каком компиляторе.

Сообщение отредактировал GetSmart - Jun 8 2016, 11:40


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 8 2016, 05:50
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(GetSmart @ Jun 8 2016, 01:09) *
-cамое простое и логичное решение, в моеи ситуации, как сразу не допер..
Там разве не все члены придётся "задефайнивать"? Ведь <старые имена> это все члены структуры.

Даже если все - ну и что? Единственный косяк - неудобно будет при отладке.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jun 8 2016, 09:16
Сообщение #22


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(GetSmart @ Jun 8 2016, 00:45) *
А причём тут это? При разборе текста кода этих имён в тексте не должно быть и если даже писатель кода туда вставит имя из MAP-файла, то компилятору надо заругаться. Если "уникальные имена" становятся видимы постфактум, то как их предугадывать? )) Плюс это уже далеко от стандарта.

----------
Вообще, если в стандарте написано, что доступ к члену структуры/юниона происходит через оператор точка или ->, и явно не указано, что есть другой способ, то анонимная compound-переменная (ака структура/юнион) не разрешена. Операторы точка и -> бинарные. Внутри объявления compound-константы связь с типом есть неявно, без необходимости использовать имя. То бишь есть смысл/удобство его опускать в тексте и для сокращения текста и для анонимного варианта. И ещё между объявлением анонимного compound-типа (вместе с переменной) и доступом к члену нет возможностей локального замещения имён. Но, признаюсь, в реале мне никогда не надобились такие анонимы и не проверял создание таких переменных и констант ни на каком компиляторе.

Вообще то это стандартное свойство C++ и оно очень удобно.
Для чего нужно - пример выше я привел.
Доступ к члену вложенной структуры короче:
Motor.Mode;
Иначе пришлось бы писать:
Motor.Aaa.Bbb.Ccc.Mode;
Что никакого практического смысла для алгоритма не имеет, только загромождает текст.

Вот, чтобы не рыться, глава из руководства на IAR MSP430:
Код
ANONYMOUS STRUCTS AND UNIONS
When a structure or union is declared without a name, it becomes anonymous. The effect is that its members will only be seen in the surrounding scope.
Anonymous structures are part of the C++ language; however, they are not part of the C standard. In the IAR C/C++ Compiler for MSP430 they can be used in C if language extensions are enabled.

Example
In this example, the members in the anonymous union can be accessed, in function f, without explicitly specifying the union name:

struct S {
    char mTag;
    union {
        long mL;
        float mF;
    };
} St;

void F(void)
{
    St.mL = 5;
}

The member names must be unique in the surrounding scope. Having an anonymous struct or union at file scope, as a global, external, or static variable is also allowed. This could for instance be used for declaring I/O registers, as in this example:

__no_init volatile
union {
    unsigned char IOPORT;
    struct {
        unsigned char Way: 1;
        unsigned char Out: 1;
    };
} @ 8;

/* Here the variables are used*/

void Test(void)
{
    IOPORT = 0;
    Way = 1;
    Out = 1;
}

This declares an I/O register byte IOPORT at address 0. The I/O register has 2 bits declared, Way and Out. Note that both the inner structure and the outer union are anonymous.
Anonymous structures and unions are implemented in terms of objects named after the first field, with a prefix _A_ to place the name in the implementation part of the namespace. In this example, the anonymous union will be implemented through an object named _A_IOPORT.

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 8 2016, 09:22
Сообщение #23


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

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



http://www.keil.com/support/man/docs/armcc...59124962747.htm
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 8 2016, 11:09
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Baser @ Jun 8 2016, 13:16) *
Вообще то это стандартное свойство C++ и оно очень удобно.

Анонимные структуры и юнионы есть и в простом Си. Точнее IAR в режиме <Си без плюсов> умеет работать с анонимными структурами/юнионами. Что написано в стандартах разных годов - затрудняюсь утверждать.

Спор идёт о допустимости корневой анонимности, а не внутри именованной структуры/юниона.

------

У Кейла на сайте смесь Си и Си++. Смесь бульдога с носорогом.
Код
typedef union
{
    int i, j;
} U;                 // U identifies a reusable anonymous union.

И называется анонимной структурой/юнионом совсем не то, что в этой ветке. Для Кейла анонимность = отсутствие первого имени (сразу после struct). Такой обходной путь через прагму чтобы подчеркнуть, что это (анонимность) не совсем то, что обычно означает.



Сообщение отредактировал GetSmart - Jun 8 2016, 21:38


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 8 2016, 11:14
Сообщение #25


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Насколько я помню
static union
безымянный - это фича придуманная именно IAR очень давно (в 90x годах прошлого века), для .h файлов периферии, что бы, например и к портам и к битам можно было по имени обращаться (как в старых даташитах) и все это было глобально....

больше вроде бы этого ни у кого нет
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 8 2016, 15:55
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jun 7 2016, 22:09) *
Можно пример?

CODE
// Beacon Invite
typedef struct bi_s{
    air_header_s;
    union {
    bi_data_s;
    ushort     data_raw;
    };
} bi_s;

QUOTE
В чём полезность?

В отсутствии абсолютно лишних сущностей, когда они лишние.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 8 2016, 21:39
Сообщение #27


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jun 8 2016, 19:55) *
В отсутствии абсолютно лишних сущностей, когда они лишние.

Здесь виднеется объявление члена внутри структуры только по одному идентификатору. Если это идентификатор type-object-name и он будет восприниматься как безымянный член с таким типом, то в этом ничего общего с инициированным ТС обсуждением. У него жалоба была на отсутствие (корневого) имени структуры-переменной. И Вами утверждалось, что Си (или C99 и выше) такое обязан уметь.

А если air_header_s и bi_data_s являются предворяющеми (до скобки {) именами stuct/union объявлений типов (то есть не совсем type-object-name), то в старом Си это наверняка было запрещено. Как и return с аргументом и без скобок. А если из нового стадарта следует, что такое имя и с предворяющим ключевым словом struct/union и без него означает одно и то же, то может такой код вполне однозначен. Если в старой интерпретации Си предворяющее struct/union имя никак не могло использоваться без struct/union-keyword.

Сообщение отредактировал GetSmart - Jun 8 2016, 22:35


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2016, 02:26
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jun 9 2016, 00:39) *
Здесь виднеется объявление члена внутри структуры только по одному идентификатору....

К чемк поминание неведомого термине "идентификатор"?
Можете, как и у Автора, описать структкру внутри. Это НЕ имеет зачения. Суть в том, что структура при объявлениине имеет имени - только тип.





--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 9 2016, 05:35
Сообщение #29


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jun 9 2016, 06:26) *
К чемк поминание неведомого термине "идентификатор"?

Идентификатор (текстовый) - синоним имени, когда речь идёт о тексте исходника. Или в Си он с чем-то другим связан? Или в Си++.
Чтобы обходить чужую терминологию её надо обозначить.

Цитата(zltigo @ Jun 9 2016, 06:26) *
Можете, как и у Автора, описать структкру внутри. Это НЕ имеет зачения. Суть в том, что структура при объявлениине имеет имени - только тип.

Требуется добавить: если она является structure/union member (другой структуры). То есть вложенная структура может не иметь имя. На счёт корневого имени (имени переменной) - какие ваши доказательства?
Для Си утверждение о имени будет корректно, если там ясно написано какое имя и в каких условиях. Т.к. при вложениях там всё становится относительным. Если не написано в каких условиях, то не факт, что утверждение/определение для всех условий. И анонимность можно толковать по-разному. В IARе анонимность членов могла разрешаться когда были включены опции <режим Си> & <Allow IAR Extensions>. То есть без режима Си++. Стандарт/Описание IAR Extensions узнавать надо видимо у IAR-a.

Тут много раз были попытки толковать анонимность как <отсутствие одного из имён>, плюс подмена отсутсвия имени у типа vs имени у переменной. У Кейла тоже самое. Цитат из стандарта не хватает.

Сообщение отредактировал GetSmart - Jun 9 2016, 10:16


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 9 2016, 09:19
Сообщение #30


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

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



Топикстартер собирался исключительно имена элементов использовать. Без иерархии... Обломался.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2016, 11:04
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jun 9 2016, 08:35) *
Идентификатор (текстовый) - синоним имени

Так вот ни имени, ни синонима там нет. Там есть тип. Все. Назвать все нужно своими именами. Тогда ВСЕ становится ясным.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jun 9 2016, 13:59
Сообщение #32


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(GetSmart @ Jun 9 2016, 08:35) *
Идентификатор (текстовый) - синоним имени, когда речь идёт о тексте исходника. Или в Си он с чем-то другим связан? Или в Си++.

Все верно: в качестве идентификатора используются поля вложенной структуры так, как если бы они были просто полями, без организации в анонимную структуру.
К этому по сути вся анонимность и сходится.
При иерархии, естественно, возникает ошибка "идентификатор уже был определен ранее".
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 9 2016, 17:00
Сообщение #33


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jun 9 2016, 15:04) *
Так вот ни имени, ни синонима там нет. Там есть тип. Все. Назвать все нужно своими именами. Тогда ВСЕ становится ясным.

Синоним в языке общения. В том контексте.
Вы приводили текстовые примеры. И программы (исходники) языка Си тоже текстовые. С какого момента последовательность букв стала именно типом? Сперва выделится лексический элемент, а потом будет происходить его поиск в допустимых списках компилятора, с учётом контекстных приоритетов и правил. Либо могут выделяться сразу несколько лексических элементов до того, как начнётся их поиск. В начале лексического анализа типов нет. Можно было бы поспорить что на этом уровне есть, но не ясно какой терминологии лучше придерживаться. Идентификатором я называл набор символов (из текста), лексическую еденицу выделенную по лексическим правилам. Соответствующую правилим задания имён (ака идентификаторов).

Вы лучше объясните топикстартеру как это заявление
Цитата(zltigo)
Лично я никогда никакой разношерстности толкования компиляторами не замечал, а пользую повседневно я их 6-7 штук.
Либо компилятор понимает, либо нет. После с99 понимают все. До с99 - некоторые. Поминаемый здесь Кейл, правда, не использовал сколь-нибудь серьезно никогда.

решит его проблему. Какой формулировкой C99 или C11 разрешает безымянные переменные с типом struct. И какой разрешаются безымянные члены с типом struct.

Сообщение отредактировал GetSmart - Jun 10 2016, 15:55


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 10 2016, 09:52
Сообщение #34


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



легко находится в сети
Код
Hello All
In IAR C it's possible to declare a struct without an identifier, like:

struct
{
unsigned char TempBit:1;
unsigned char TempBitInt:1;
unsigned char f2:1;
unsigned char f3:1;
unsigned char f4:1;
unsigned char f5:1;
unsigned char f6:1;
unsigned char f7:1;
};

And access the bits directly TempBit=1,
In GCC however an identifier is requiered

struct BTEST
{
unsigned char TempBit:1;
unsigned char TempBitInt:1;
unsigned char f2:1;
unsigned char f3:1;
unsigned char f4:1;
unsigned char f5:1;
unsigned char f6:1;
unsigned char f7:1;
};

And access done like BTEST.TempBit=1 ,,,
Can it realy be that GCC cant handle structs without identifiers ?
Best regards,

У GCC тоже свои тараканы расширения.

Сообщение отредактировал GetSmart - Jun 10 2016, 10:29


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
dimone
сообщение Jun 14 2016, 12:23
Сообщение #35


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

Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242



Цитата(ViKo @ Jun 9 2016, 12:19) *
Топикстартер собирался исключительно имена элементов использовать. Без иерархии... Обломался.

-так наверно и получилось в Кеиле, -имена есть, а иерархии -нет, но вы держитесь (с))
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 14 2016, 22:15
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(dimone @ Jun 14 2016, 15:23) *
-так наверно и получилось в Кеиле, -имена есть, а иерархии -нет, но вы держитесь (с))

Не изучал со структурами, но анонимные юнионы в ИАРе исключены из некоторых версий компилятора.
ИАР ссылается на ANSY C.
Как по мне, шаг в нужном направлении, "типизация - наше всё".
Хотя поначалу было непросто, обновился ради нового кристалла, а нужно все перелопатить.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:34
Рейтинг@Mail.ru


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