-
- А так sizeof(((tSomeStruct*)(0))->someElement); - IBAH(10.01.2024 20:57)
- Спасибо. - Nikolay_Po(11.01.2024 10:55)
- О! А это работает, спасибо! Хотя, мои глаза... Ну заменим макросом! - Argon(10.01.2024 21:03)
- Что интересно, макрос offsetof() частенько похожим образом
реализован. Но тут, возможно, есть нарушение: разыменование
нулевого указателя. Видимо, поэтому в стандарте Си реализация
offsetof() отдана на усмотрение компиляторостроителей. SciFi(1 знак., 11.01.2024 10:49, ссылка)
- А вот offsetof как раз в этом компиляторе работает нормально. - Argon(11.01.2024 10:54)
- Он обязан работать нормально, есличо. Если не работает, пишите
рекламации компиляторостроителю. - SciFi(11.01.2024 11:01)
- Тогда вот это о чем: "макрос offsetof() частенько похожим образом
реализован"? Похожим - это каким? Кривым? Речь же вроде шла о том,
как обойти кривую реализацию sizeof(t.element) в этом компиляторе. - Argon(11.01.2024 11:11)
- Просто добавил информации в топик для полноты картины. Если вас что-то смущает, могу удалить. - SciFi(11.01.2024 11:17)
- Тогда вот это о чем: "макрос offsetof() частенько похожим образом
реализован"? Похожим - это каким? Кривым? Речь же вроде шла о том,
как обойти кривую реализацию sizeof(t.element) в этом компиляторе. - Argon(11.01.2024 11:11)
- Он обязан работать нормально, есличо. Если не работает, пишите
рекламации компиляторостроителю. - SciFi(11.01.2024 11:01)
- А вот offsetof как раз в этом компиляторе работает нормально. - Argon(11.01.2024 10:54)
- давно уже у меня добавлено в глобальные макросы. Жаль сразу не посмотрел, чтобы помочь. abivan(83 знак., 11.01.2024 10:39)
- Что интересно, макрос offsetof() частенько похожим образом
реализован. Но тут, возможно, есть нарушение: разыменование
нулевого указателя. Видимо, поэтому в стандарте Си реализация
offsetof() отдана на усмотрение компиляторостроителей. SciFi(1 знак., 11.01.2024 10:49, ссылка)
- Когда я мучился с XC8 (2013..2019 годы, примерно), то, вроде, делал
такой ужас (требуется определение структуры): Nikolay_Po(379 знак., 10.01.2024 20:32)
- Увы, не годится. Хотя бы потому что оперативно не поменять
расположение элементов в структуре (а до конца разработки мне это
потребуется раз ...дцать). Да и не похоже такое решение на
"компайлтайм". - Argon(10.01.2024 20:44)
- А! Вспомнил!!! Когда мне нужно менять размер элемента структуры, я
просто объявляю его своим, отдельным типом, до объявления
структуры. И вписываю этот тип в структуру как тип элемента. И
когда мне нужен размер элемента, я даю sizeof(ТипЭлемента). И дело
в шляпе! Nikolay_Po(98 знак., 10.01.2024 21:47)
- Меня бы это не спасло! Нужно было универсальным образом получить
размер каждого из полусотни разноразмерных элементов структуры
наиболее кратким образом, обратившись к именам. - Argon(10.01.2024 21:52)
- Что вы там такого автоматизируете? Структуры не ваши, чужие, из
другого кода? - Nikolay_Po(10.01.2024 23:15)
- Структуры мои, но общие для нескольких связанных проектов. Грубо
говоря конкретно это - микро-плк, транслирующий в обе стороны
данные modbus сервоприводов в шину CAN (и обратно). Так вот задача
состояла в нарисовании константной таблицы-маппера адресов
сервопривода и элементов большой структуры данных (в к-рой
присутствуют не все параметры сервоприводов + куча не связанных с
ними данных). Argon(145 знак., 11.01.2024 08:06)
- X-macro туда просится. Не? - SciFi(11.01.2024 11:20)
- Структуры мои, но общие для нескольких связанных проектов. Грубо
говоря конкретно это - микро-плк, транслирующий в обе стороны
данные modbus сервоприводов в шину CAN (и обратно). Так вот задача
состояла в нарисовании константной таблицы-маппера адресов
сервопривода и элементов большой структуры данных (в к-рой
присутствуют не все параметры сервоприводов + куча не связанных с
ними данных). Argon(145 знак., 11.01.2024 08:06)
- C++. Как - не знаю. Но чую, что для вашей задачи уже пора
переходить. - Nikolay_Po(10.01.2024 23:14)
- Проще простого - sizeof(MYSTRUCT::A); Только PIC-ам это не грозит. - VladislavS.(11.01.2024 11:18)
- Увы, для PIC18 это будет излишеством :) - Argon(11.01.2024 08:04)
- Что вы там такого автоматизируете? Структуры не ваши, чужие, из
другого кода? - Nikolay_Po(10.01.2024 23:15)
- Меня бы это не спасло! Нужно было универсальным образом получить
размер каждого из полусотни разноразмерных элементов структуры
наиболее кратким образом, обратившись к именам. - Argon(10.01.2024 21:52)
- Конечно, это не на этапе компиляции, если выключены оптимизации. А если оптимизатор работает, то вычисления разностей указателей оптимизируются до констант. Если повезёт - то получится именно на этапе компиляции. - Nikolay_Po(10.01.2024 21:42)
- А! Вспомнил!!! Когда мне нужно менять размер элемента структуры, я
просто объявляю его своим, отдельным типом, до объявления
структуры. И вписываю этот тип в структуру как тип элемента. И
когда мне нужен размер элемента, я даю sizeof(ТипЭлемента). И дело
в шляпе! Nikolay_Po(98 знак., 10.01.2024 21:47)
- Увы, не годится. Хотя бы потому что оперативно не поменять
расположение элементов в структуре (а до конца разработки мне это
потребуется раз ...дцать). Да и не похоже такое решение на
"компайлтайм". - Argon(10.01.2024 20:44)
- Первое должно работать. Возможно tSomeStruct как-то странно
определен. - AlexBi(10.01.2024 19:12)
- Да нет, ничего особенного, вроде этого: Argon(119 знак., 10.01.2024 19:28)
- Дык работает же reZident(1 знак., 10.01.2024 19:32, картинка)
- Значит, микрочиповский компилятор не справляется (уже было
замечено). - Argon(10.01.2024 19:33)
- А что насчет sdcc? Я лет 15 назад именно его использовал для PIC
(т.к. больше компиляторов не существовало, да и в наше время вроде
бы порта gcc под PIC не сделали). - Eddy_Em(10.01.2024 20:39)
- HI-TECH C® Compiler - Гyдвин(10.01.2024 20:44)
- Вроде как XC8 и есть порт GCC, правда, старой версии, где-то
обсуждали (или тут, или на microchip.com/forums), вроде, 4.3 или
около того. Говорили, что Микрочип столько непубличных
улучшайзингов навертел, что теперь повысить версию никак не смогут.
И, вроде, даже был вариант сборки XC8 из исходников, только без
фирменных оптимизаций Микрочипа. - Nikolay_Po(10.01.2024 20:43)
- Четвертый gcc - это 10 версий тому назад! Ну нельзя таким УГ пользоваться!!!! - Eddy_Em(10.01.2024 20:44)
- да проще смириться с этим косяком :) - Argon(10.01.2024 20:41)
- SDCC - свободный компилятор, в отличие от всякого этого… - Eddy_Em(10.01.2024 20:42)
- А что насчет sdcc? Я лет 15 назад именно его использовал для PIC
(т.к. больше компиляторов не существовало, да и в наше время вроде
бы порта gcc под PIC не сделали). - Eddy_Em(10.01.2024 20:39)
- Значит, микрочиповский компилятор не справляется (уже было
замечено). - Argon(10.01.2024 19:33)
- Дык работает же reZident(1 знак., 10.01.2024 19:32, картинка)
- Да нет, ничего особенного, вроде этого: Argon(119 знак., 10.01.2024 19:28)
- А так sizeof(((tSomeStruct*)(0))->someElement); - IBAH(10.01.2024 20:57)