-
- 1) за u08, u16 и т.п. сжигать нужно -- используй стандартные типы данных. 2) заморачиваться и не нужно -- для размера любого типа есть sizeof(type name or variable name), размер массива можно узнать как sizeof(array)/sizeof(array[0]), смещение fk0(116 знак., 16.08.2013 16:12)
- За использование типов данных, размер которых не гарантирован нужно, перед созжением, долго-долго пытать калёным железом :) - Скрипач(16.08.2013 19:53)
- А я считаю, что сжигать нужно за экстремизм и за призывы к сожжению. Рекурсия, есличо :-) - SciFi(16.08.2013 20:33)
- А чо про "пытки каленым железом" забыли? Я считаю, нужны :) - Скрипач(16.08.2013 20:39)
- А еще вырывание ногтей для особо забывчивых (см. 37 сек) :) - rezident(16.08.2013 20:43, youtube)
- А чо про "пытки каленым железом" забыли? Я считаю, нужны :) - Скрипач(16.08.2013 20:39)
- А я считаю, что сжигать нужно за экстремизм и за призывы к сожжению. Рекурсия, есличо :-) - SciFi(16.08.2013 20:33)
- Твое возмущение понятно. Потому что на разных платформах разная разрядность. Не помню, чего именно. Но меня это сейчас не трогает, пока я пробую на AVR. Да и в лом писать каждый раз и искать, чтобы скопипастить unsigned char, unsigned int. Быстро mazur(26 знак., 16.08.2013 17:55)
- Выражение "unsigned int" бессмысленно и сокращается до "unsigned". Либо до "int". Смотря что нужно. А вот с char аккуратнее! Либо всегда сам пиши "unsigned char", либо "signed char". Либо всегда помни, что по-умолчанию на данной платформе (если fk0(652 знак., 16.08.2013 18:00 - 18:03)
- Развивайте моторику пальцев. Если не можете набрать "unsigned" за 2 секунды, то откладывайте программирование и тренируйте навыки машинистки. - SciFi(16.08.2013 18:00)
- пока набираешь, можно подумать о том, что набираешь :) - Vladimir Ljaschko(16.08.2013 18:13)
- в стандарте написано что размеры short, int и long имеют не убывающую последовательность, те могут быть 8-16-32, а могут и 32-32-32. так что uint8_t, uint16_t, uint32_t и сжигай сколько хочешь. - Nikolay801_(16.08.2013 17:39)
- avrlibtypes.h: mazur(2233 знак., 16.08.2013 16:52)
- Забей - юзай что удобно. А если перейдёшь на Cortex, то тогда и посмотришь, что от этого и проблем-то нет - Vit(16.08.2013 17:04)
- Я указал выше какие проблемы. Они есть. - fk0(16.08.2013 17:08)
- бред там - Vit(16.08.2013 17:10)
- Научись обосновывать свои утверждения. А сказанное мною здесь попросту многим не понятно. - fk0(16.08.2013 17:20)
- не выделывайся - Vit(16.08.2013 17:21)
- Научись обосновывать свои утверждения. А сказанное мною здесь попросту многим не понятно. - fk0(16.08.2013 17:20)
- бред там - Vit(16.08.2013 17:10)
- Я указал выше какие проблемы. Они есть. - fk0(16.08.2013 17:08)
- Я тоже могу какую-нибудь ерунду запостить из недр /usr/include -- её там мегабайты. Вот видишь написано unsigned int, signed long и т.п. -- вот их и используй и не морочь мозги. - fk0(16.08.2013 17:00)
- Забей - юзай что удобно. А если перейдёшь на Cortex, то тогда и посмотришь, что от этого и проблем-то нет - Vit(16.08.2013 17:04)
- 1) и CMSIS сжечь - Vit(16.08.2013 16:16)
- Однозначно! Я уже писал. Как, например, u32 в printf отправлять (%d, %ld -- что ему нужно?), scanf аналогично, (не)эффективности кода опять же (лишние команды на 32-битном ARM для u16, например). А как узнать максимальное/минимальное значение для fk0(210 знак., 16.08.2013 16:21)
- а какие ссылки у Профессионалов. У нас только указатели :-). - abivan(16.08.2013 16:57)
- Паскаль лучше, чем C. - fk0(16.08.2013 17:03)
- всё это наносное - при портировании наоборот заостряет вопросы несовместимости архитектур/либ, иначе огрести из-за разной величины int как нефиг делать. - Vit(16.08.2013 16:36)
- Нужно нормально писать код, чтоб не огрести. Все средства для этого есть. int специально так сделан, чтоб писать код работающий без изменений на любой архитектуре. А с u16 и т.п. -- нужно всё переписывать при смене платформы. Что точно является fk0(258 знак., 16.08.2013 16:40)
- и как на 8-ми разрядном int использовать для счетчика циклов до 255? оверхед и замедление предлагаешь? на проце с 24мя байтами озу и 512 флэша. - abivan(16.08.2013 17:06)
- Ерунда. Дважды делал проекты для MSP430 в паре с двумя разными программистами. Оба писали/отлаживали отдельные программные модули (не привязанные к "железу") на ПК под Windows. Типы данных были свои собственные переопределяемые под конкретную rezident(81 знак., 16.08.2013 17:02)
- Типичный пример "УМВР". Из частного никак не следует общего. А вот для доказательства обратного достаточно единичного примера, и они есть. Волшебные константы в коде (ибо свой limits.h для своих типов никто не написал). Тип стал шире. Не fk0(408 знак., 16.08.2013 17:16)
- ну и намешал мух с котлетами. буэ - Vit(16.08.2013 17:38)
- Я же указал, что именованные типы переопределялись под конкретную платформу. Т.е. поросту говоря, uint16_t был именно 16-и разрядным (подбирался именной такой тип) на всех используемых платформах. - rezident(16.08.2013 17:28)
- А вот с использованием int, заточенного на 32-х разрядность ARM, нахлебался достаточно (чужой исходник пришлось в свой код имплементировать). - rezident(16.08.2013 17:10)
- Та же самая проблема, только наоборот. Исходник с гвоздям прибитым u16 точно так же способен выдать массу приключений на ARM -- во всех местах, где он соприкасается с внешним миром, в котором ожидают int. И заметно проиграть по-скорости в fk0(19 знак., 16.08.2013 17:25)
- Не стоит обобщать на ровном месте. Именованные типы определенной разрядности используются преимущественно в выровненных структурах, предназначенных для передачи и обработки данных. Локальные переменные затачивать на разрядность никто и не rezident(11 знак., 16.08.2013 17:32)
- Ещё раз сжигать. Жечь напалмом. За не пойми какую ендианность, за классные грабли на ARM7/PIC24 с ошибкой BUS ERROR и/или непредвиденным выравниванием... (Де)сериализаторы нужно писать руками, остальное грязный хак. Кортексы развращают. Сделать их fk0(257 знак., 16.08.2013 17:56)
- Ну и облейте себя бензином, коль уж хотите до конца честным быть. Это ведь вы исключительно библиотечные функции пользуете, а мы по-старинке - "вручную" разгребаем :) - rezident(16.08.2013 20:29)
- +1. Вот за это точно сжигать - Vit(16.08.2013 17:58)
- Ещё раз сжигать. Жечь напалмом. За не пойми какую ендианность, за классные грабли на ARM7/PIC24 с ошибкой BUS ERROR и/или непредвиденным выравниванием... (Де)сериализаторы нужно писать руками, остальное грязный хак. Кортексы развращают. Сделать их fk0(257 знак., 16.08.2013 17:56)
- Не стоит обобщать на ровном месте. Именованные типы определенной разрядности используются преимущественно в выровненных структурах, предназначенных для передачи и обработки данных. Локальные переменные затачивать на разрядность никто и не rezident(11 знак., 16.08.2013 17:32)
- Та же самая проблема, только наоборот. Исходник с гвоздям прибитым u16 точно так же способен выдать массу приключений на ARM -- во всех местах, где он соприкасается с внешним миром, в котором ожидают int. И заметно проиграть по-скорости в fk0(19 знак., 16.08.2013 17:25)
- Типичный пример "УМВР". Из частного никак не следует общего. А вот для доказательства обратного достаточно единичного примера, и они есть. Волшебные константы в коде (ибо свой limits.h для своих типов никто не написал). Тип стал шире. Не fk0(408 знак., 16.08.2013 17:16)
- даже спорить не хочу - не только с пиками имею дело:). пишешь явно о чём-то виртуальном... "любое переписывание", "принципиально невозможна компиляция" - вааще набор страшилок - Vit(16.08.2013 16:51)
- Да, с K&R сложно поспорить. Идея об отсутствии типов с гвоздями прибитой разрядностью -- именно их. - fk0(16.08.2013 17:01)
- они точно C11 не придумывали. - Vit(16.08.2013 17:06)
- Я вообще-то про C89 или даже более старый. int всю жизнь не имел жёстко заданной ширины. - fk0(16.08.2013 17:17)
- а я о невозможности предать переменную библиотечной функции - Vit(16.08.2013 17:21)
- Указатель на неё не передашь. И даже warning можешь не получить. Саму переменную тоже: printf("%d", U32) при переезде с 32-бит на 16 бит. В лучшем случае компилятор умеет парсить формат printf и давать warning. А если vprintf, то не факт, что fk0(438 знак., 16.08.2013 17:31)
- а я о невозможности предать переменную библиотечной функции - Vit(16.08.2013 17:21)
- Я вообще-то про C89 или даже более старый. int всю жизнь не имел жёстко заданной ширины. - fk0(16.08.2013 17:17)
- они точно C11 не придумывали. - Vit(16.08.2013 17:06)
- Да, с K&R сложно поспорить. Идея об отсутствии типов с гвоздями прибитой разрядностью -- именно их. - fk0(16.08.2013 17:01)
- Нужно нормально писать код, чтоб не огрести. Все средства для этого есть. int специально так сделан, чтоб писать код работающий без изменений на любой архитектуре. А с u16 и т.п. -- нужно всё переписывать при смене платформы. Что точно является fk0(258 знак., 16.08.2013 16:40)
- а какие ссылки у Профессионалов. У нас только указатели :-). - abivan(16.08.2013 16:57)
- Однозначно! Я уже писал. Как, например, u32 в printf отправлять (%d, %ld -- что ему нужно?), scanf аналогично, (не)эффективности кода опять же (лишние команды на 32-битном ARM для u16, например). А как узнать максимальное/минимальное значение для fk0(210 знак., 16.08.2013 16:21)
- За использование типов данных, размер которых не гарантирован нужно, перед созжением, долго-долго пытать калёным железом :) - Скрипач(16.08.2013 19:53)
- Размер элемента массива Timers_Queue определяется его типом tmrs_queue. sizeof (tmrs_queue) даст вам размер элемента массива (размер структуры) в байтах. Или нужно что-то другое? - rezident(16.08.2013 15:50)
- Размер указать нельзя, но можно оставить в структуре резерв. Например, так: Ксения(179 знак., 16.08.2013 15:24 - 15:39)
- Если я правильно понял суть ваших затруднений, то обратите внимание на union. - rezident(16.08.2013 15:32, ссылка)
- ну ты спросил. уже 3 ответа на 3 разных вопроса - abivan(16.08.2013 15:28)
- где у Вас элемент размером 3 байта? для определения размеров используйте sizeof и offsetof - abivan(16.08.2013 15:26)
- Пример можно? Выше поправил. - mazur(16.08.2013 15:33)
- все равно неясно в чем заморочка? в определении кол-ва элементов в массиве Timers_Queue или еще что. - abivan(16.08.2013 15:43)
- offsetof - пока так, пока вопрос не пойму abivan(592 знак., 16.08.2013 15:45)
- все равно неясно в чем заморочка? в определении кол-ва элементов в массиве Timers_Queue или еще что. - abivan(16.08.2013 15:43)
- Пример можно? Выше поправил. - mazur(16.08.2013 15:33)
- эээ, а вопрос то в чем? ты объявляешь тип переменной - на основании объявленного типа под нее выделится нужный объем памяти. по большому счету неважно объявил ты ее отдельно или внутри структуры. Snaky(126 знак., 16.08.2013 15:24)
- Ну смотрите. В данный момент, массив из: байт статус, два байта счетчик. Хочу сделать следующее (в начале топика асмовская подпрограмма). Переменная счетчик. Указатель на массив. Указатель должен складываться со счетчиком, считывать байт статус. mazur(147 знак., 16.08.2013 15:29)
- реально раз 10 прочитал пока не начал что-то понимать. зачем так словами жонглировать? похоже у тебя проблемы с пониманием как обращаться к элементам структуры. у тебя массив структур, вот и обращайся сначала к нужной структуре из массива по Snaky(278 знак., 16.08.2013 15:53)
- А как нужно? - mazur(16.08.2013 15:56)
- ну st_flags - это же член структуры, следовательно надо к нему по полному имени обращаться. Snaky(421 знак., 16.08.2013 16:04)
- А как нужно? - mazur(16.08.2013 15:56)
- в Си запись arr[index] эквивалентна index[arr], потому что эквивалентна *(arr + index). Указатель в Си это не только адрес переменной, но и инфа для компилятора о размере типа - она нужна именно для расчета смещения. т.е. размер массива структур Vit(106 знак., 16.08.2013 15:44)
- array[index] == *(typeof(array))((char*)array + sizeof(array[0])*index) - fk0(16.08.2013 16:15 - 16:25)
- Тогда уж array[index] == *(array + index), зачем множить? - Ксения(16.08.2013 16:19)
- То есть, мне не нужно заморачиваться о размере элемента из байт-статус+счетчик? - mazur(16.08.2013 15:51)
- Компилятор сам разберётся. Мне кажется, что для начала нужно устаканить один момент Vit(315 знак., 16.08.2013 16:04)
- Лучше ему пока не знать от typedef -- запутается в конец. Пусть пишет вручную struct, так нагляднее. - fk0(16.08.2013 16:17)
- считаю, что как раз с ним нагляднее. struct вручную чревато мурашками - где описание, а где объявление, сами компиляторописатели не очень-то разбираются - Vit(16.08.2013 16:26)
- Не понимаю проблемы с компиляторами, их нет. А typedef вокруг каждого struct неудобен тем, что мы не видим, что это struct и можем подумать, что это скалярный тип данных. Потом, например, пытаться передавать по-значению. И даже работать будет, но fk0(22 знак., 16.08.2013 16:38)
- есть. с профессиональными особенно. а скалярные типы давно все помнят наизусть:) - Vit(16.08.2013 16:42)
- Это из стандартных. А через что сделан MySuperDataType -- х.з. - fk0(16.08.2013 16:44)
- правильная IDE подскажет. или прыгнуть на определение поможет на крайняк. а в блокноте да, надо помнить. - Snaky(16.08.2013 16:54)
- ну дык и читать (хедеры) иногда нужно - Vit(16.08.2013 16:52)
- Это из стандартных. А через что сделан MySuperDataType -- х.з. - fk0(16.08.2013 16:44)
- есть. с профессиональными особенно. а скалярные типы давно все помнят наизусть:) - Vit(16.08.2013 16:42)
- Не понимаю проблемы с компиляторами, их нет. А typedef вокруг каждого struct неудобен тем, что мы не видим, что это struct и можем подумать, что это скалярный тип данных. Потом, например, пытаться передавать по-значению. И даже работать будет, но fk0(22 знак., 16.08.2013 16:38)
- считаю, что как раз с ним нагляднее. struct вручную чревато мурашками - где описание, а где объявление, сами компиляторописатели не очень-то разбираются - Vit(16.08.2013 16:26)
- Лучше ему пока не знать от typedef -- запутается в конец. Пусть пишет вручную struct, так нагляднее. - fk0(16.08.2013 16:17)
- не нужно. Я понял тебе нужен цикл по всем элементам массива, т.е. проверить статусы во всех таймерах. можешь указатель ++, а можешь и индех массива ++ - abivan(16.08.2013 15:57)
- Компилятор сам разберётся. Мне кажется, что для начала нужно устаканить один момент Vit(315 знак., 16.08.2013 16:04)
- +1 вообще не нужно оперировать быйтами. А только элементами массива и полями структуры. А если еще вырвнивание начнется ... - abivan(16.08.2013 15:47)
- array[index] == *(typeof(array))((char*)array + sizeof(array[0])*index) - fk0(16.08.2013 16:15 - 16:25)
- реально раз 10 прочитал пока не начал что-то понимать. зачем так словами жонглировать? похоже у тебя проблемы с пониманием как обращаться к элементам структуры. у тебя массив структур, вот и обращайся сначала к нужной структуре из массива по Snaky(278 знак., 16.08.2013 15:53)
- Ну смотрите. В данный момент, массив из: байт статус, два байта счетчик. Хочу сделать следующее (в начале топика асмовская подпрограмма). Переменная счетчик. Указатель на массив. Указатель должен складываться со счетчиком, считывать байт статус. mazur(147 знак., 16.08.2013 15:29)
- 1) за u08, u16 и т.п. сжигать нужно -- используй стандартные типы данных. 2) заморачиваться и не нужно -- для размера любого типа есть sizeof(type name or variable name), размер массива можно узнать как sizeof(array)/sizeof(array[0]), смещение fk0(116 знак., 16.08.2013 16:12)