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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Поиск по массиву в compile time на С
DASM
сообщение Aug 14 2018, 07:10
Сообщение #46


Гуру
******

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



Цитата(Nixon @ Aug 14 2018, 09:39) *
В стандарте то стандарте, но не совсем "С", точнее совсем не "С". C++11 это.

Ну с связи с возможностью удобной интеграции GCC в MS VS посредством VisualGDB я пересел полностью на GCC, для которого и С ++ 11 совсем не новинка. Если поджимают ресурсы - не пользую stl, new и подобное просто, а сами по себе плюсы ничего не кушают, даже виртуальные методы - точно также делались в голом С, посредством таблиц и передачей в функции явного this, так что ничего не теряю с плюсами это точно


Цитата(Kabdim @ Aug 14 2018, 09:49) *
Почему они так написали - понятно, пишут так что бы их поняли без буквоедства, но кмк тут они переборщили с обобщением. В стандарте следующее:

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

это как раз в Сях, без спецификации underlying типа. А Никсон как раз описал возможность в С11 явно указать этот тип, причем в такой форме это не возможность, а обязанность.
PS laughing.gif я таки с вашими новыми знаниями добил майкрософтовский компилер!!
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 14 2018, 07:17
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(DASM @ Aug 14 2018, 10:10) *
это как раз в Сях, без спецификации underlying типа.

Это цитата из ISO/IEC JTC1 SC22 WG21 N3690 Date: 2013-05-15 7.2 Enumeration declarations
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 16 2018, 06:32
Сообщение #48


Гуру
******

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



Цитата
typedef enum { tst, tst2, tst3 } test;
#pragma pack (1)
typedef struct
{
test f;
test g;
test h;
} lala;
lala l;
int t = sizeof(l.f); // = 1 OK
int z = sizeof (lala); // = 3 OK
int a = offsetof (lala, g);// = 1 OK
int q = sizeof(tst); // = 4 WTF ??
#pragma pack ()

А что тут не так с sizeof (tst) ? Он 4 стал равен, хотя все остальное по 1, с учетом того что ГЦЦ привел энум к чару
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 16 2018, 14:29
Сообщение #49


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(DASM @ Aug 16 2018, 09:32) *
А что тут не так с sizeof (tst) ? Он 4 стал равен, хотя все остальное по 1, с учетом того что ГЦЦ привел энум к чару

А чего вы хотите добиться применяя sizeof к значению?
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 16 2018, 14:41
Сообщение #50


Гуру
******

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



Цитата(Kabdim @ Aug 16 2018, 17:29) *
А чего вы хотите добиться применяя sizeof к значению?

Просто понять почему он в структуре один, а вот так просто -4
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 16 2018, 14:56
Сообщение #51


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



После sizeof ( некого enum ), недалеко и до sizeof ( #define чего-то ) ... sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 16 2018, 15:09
Сообщение #52


Гуру
******

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



Цитата(Forger @ Aug 16 2018, 17:56) *
После sizeof ( некого enum ), недалеко и до sizeof ( #define чего-то ) ... sm.gif

А все же, почему так?
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 16 2018, 15:13
Сообщение #53


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Aug 16 2018, 18:09) *
А все же, почему так?

Да кто его ж знает, компилятор этот ...

Вот тут немножко есть про это: https://stackoverflow.com/questions/8115550...-type-data-in-c


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 17 2018, 08:08
Сообщение #54


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Извиняюсь, если это уже предлагали(не читал все сообщения)
https://www.boost.org/doc/libs/1_67_0/libs/.../doc/index.html

The library supports both C++ and C compilation. It does not depend on any other Boost libraries and therefore may be used as a standalone library.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 17 2018, 10:39
Сообщение #55


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(DASM @ Aug 16 2018, 17:41) *
Просто понять почему он в структуре один, а вот так просто -4

Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 17 2018, 10:54
Сообщение #56


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Kabdim @ Aug 17 2018, 14:39) *
Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.

А где Вы видите значение в структуре? Перечисление - это такой же тип, как, например, структура. Только поля перечислений могут использоваться без имени самого перечисления.
Например,
Код
typedef enum
{
    OK = 0,
    ERR
}TEnum;

дает возможность объявлять переменные перечислимого типа:
Код
TEnum my_var; // my_var - это теперь int или char в зависимости от реализации компилятора
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 17 2018, 11:51
Сообщение #57


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Я не вижу. Вопрос был DASM'у цитата к которой вопрос в моем посте до вопроса. Посмотрите внимательно на код DASM, с которого началось обсуждение.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 17 2018, 12:04
Сообщение #58


Гуру
******

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



Цитата(Kabdim @ Aug 17 2018, 13:39) *
Как это значение может быть в структуре? Это просто число, оно нигде, пока вы его куда-то не положите. А если положили то и sizeof нужно применять к месту куда положили.

offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля.
Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 17 2018, 12:23
Сообщение #59


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Aug 17 2018, 15:04) *
offsetof считает смещения поля в структуре. Видно, что оно увеличивается на один после такого энум поля.
Что вам непонятно? Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.

Вставил как есть ваш код в компилятор ARM (keil), в двух версиях: v5.06 и v6.10.1, вышло sizeof(tst) = 1 ... Все норм.
По-ходу ваш компилятор такой ... странный cranky.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 17 2018, 12:45
Сообщение #60


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Применительно к этой ситуации, как раз Кейл - неправильно делает, но полезным для эмбедеда способом.
Цитата(DASM @ Aug 17 2018, 15:04) *
Почему компилятор, выделяя место для поля типа энум - отводит на это 1 байт, но sizeof применительно к элементу этого энум дает 4.

Если это вопрос, то потому что sizeof принимает либо тип, либо выражение. Т.к. это выражение, то число-значение энума, автоматом в выражении приводится к int. И sizeof соответственно отдает размер инта.
Go to the top of the page
 
+Quote Post

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

 


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


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