Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

возможно ли и каким образом в ассеблерных файлах использовать дефайны из С
Зависит от среды, но по-моему IAR тоже позволяет просто включить сишный заголовочник в .s-файл и использовать его дефайны. Единственно только, надо, чтобы в том заголовочнике не было непонятных для ассемблера объявлений, не заменяемых препроцессором (например, типы Си).

Можно просто запилить отдельный файл с дефайнами, а можно разделить объявления для Си и асемблера директивами условной компиляции - когда файл проходит компилятор Си предопределенные дефайны отличаются от случая, когда файл проходит ассемблер.

Вот, посмотрите, как это делается в AVR-GCC, идея везде одна. Только Вам надо будет найти в документации IAR'овский аналог дефайна __ASSEMBLER__.
Последний раз редактировалось YS Вс июл 28, 2013 19:55:49, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
srg320
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Re: Вопросы по С/С++ (СИ)

Сообщение srg320 »

YS, спасибо, буду разбираться.
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

Не за что. :beer:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

У меня вопрос по препроцессору.
Например имеется код:

Код: Выделить всё

#define x 0.5
#define y 550.3

#define const x*y
Если где-то в коде вставлю константу const, то препроцессор заменит её на выражение "0.5*550.3". А мне нужно получить результат этого выражения без дробной части, т.е. "275". Иначе в некоторых случаях компилятор вполне обоснованно линкует float-библиотеку (avr-gcc), которая мне не нужна.

Как можно заставить препроцессор вычислять выражение до компиляции?
Реклама
Эиком - электронные компоненты и радиодетали
srg320
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Re: Вопросы по С/С++ (СИ)

Сообщение srg320 »

а если написать так

Код: Выделить всё

#define const ((int)x*(int)y)
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

скорее так:

Код: Выделить всё

#define x (0.5)
#define y (550.3)
#define const ((int)(x*y))
в случае #define const ((int)x*(int)y) получим ноль

PS. препроцессор ничего не вычислит, зато в теле программы будет явное обращение к целому.

PPS. "const" - зарезервированное слово.
Реклама
srg320
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Re: Вопросы по С/С++ (СИ)

Сообщение srg320 »

а разве при вычислении (x*y) компилятор не подключит float-библиотеку?
может x и y брать заранее умноженные на 10 а результат делить потом на 100
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

PPS. "const" - зарезервированное слово.
Я в курсе, это для примера.
PS. препроцессор ничего не вычислит, зато в теле программы будет явное обращение к целому.
То есть он вообще не может вычислять?
может x и y брать заранее умноженные на 10 а результат делить потом на 100
Да можно и на калькуляторе посчитать и задефайнить результат. Хотелось бы, чтобы за меня это сделал препроцессор.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Код: Выделить всё

int asd;
.......
.......
asd= 0.5 * 550.3;
ИМХО, при таком раскладе, компилятор не будет ничего подключать. Он вычислит это выражение на этапе компиляции, округлит его и подставит в конструкцию.
По этому, результат кода

Код: Выделить всё

#define x 0.5
#define y 550.3
.......
int asd;
.......
.......
asd= x * y;
будет таким же.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Если идёт присвоение - да. Если условие сравнения - подключает.

Код: Выделить всё

#define max_counter  frequency*max_time
...

if (counter < max_counter)  // <<< тут уже линкует и пошла пьянка
{
...
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А если явно привести к типу ?

Код: Выделить всё

#define max_counter  (frequency*max_time)
...

if (counter < (unsigned int)max_counter)  // <<< тут уже линкует и пошла пьянка
{
...
}
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

Препроцессор Си
http://gcc.gnu.org/onlinedocs/cpp/
СпойлерСоздаём файлик c.c следующего содержания

Код: Выделить всё

#define x (0.5)
#define y (550.3)
#define xy (x*y)

int xy_i = xy;
Запускаем препроцессор командой "cpp c.c" (без кавычек, естественно). Получаем.

Код: Выделить всё

# 1 "c.c"
# 1 "<command-line>"
# 1 "c.c"




int xy_i = ((0.5)*(550.3));
Препроцессор из комплекта GNU C Compiler. Т.е. у кого стоит WinAVR или AVR Toolchain могут тоже попробовать.
Последний раз редактировалось Kavka Ср июл 31, 2013 19:03:26, всего редактировалось 2 раза.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

А если явно привести к типу ?
Вроде работает. Но это простой тест. Попробую дома на реальном проекте.
Спасибо.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Проверил всё.
Да, при явном приведении типа, не важно, в дефайне или в коде, всё работает.

Код: Выделить всё

#define max_counter  (uint16_t)(frequency*max_time)
Достаточно убрать это приведение, как происходит линковка флоата.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

подскажите пожалуйста, если я при определенном услови, с помощью оператора return, выхожу из ф-ции в основной цикл то как мне потом вернутся в ф-цию и продолжить с того места где я ранее прервал выполнение ?
Tell Me The Truth
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

Просто так после return - никак.
Может разделить эту функцию на две - одна делает, то что до return, другая то, что после?
Можно параметр функции сделать указывающий на "продолжение".
Мало информации, деталей мало, чтобы дать более дельный совет.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Обычно, если возникает такая потребность, надо пересмотреть логику работы.
Иногда и GOTO так хочется вставить, посидишь, почешешься... и родишь что-нибудь компактное и красивое :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

FreshMan писал(а):подскажите пожалуйста, если я при определенном услови, с помощью оператора return, выхожу из ф-ции в основной цикл то как мне потом вернутся в ф-цию и продолжить с того места где я ранее прервал выполнение ?
http://computerlib.narod.ru/html/setjmp.htm
http://ru.wikipedia.org/wiki/Setjmp.h
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Kavka писал(а):Мало информации, деталей мало, чтобы дать более дельный совет.
в основном цикле, окромя прочих операторов есть ф-ция play()

Код: Выделить всё

whli(1)
{
.....
.....
play();
......
......
}
в данной ф-ции , окромя других команд, мне надо организовать СОБСТВЕНННУЮ задержку, я ее сделал на Т2 который срабанывает по переполнению через 2мс
так вот, когда я нахожусь в ф-ции play() и я дохожу до того места где мне надо организовать задержку то я запускаю таймер и ВЫСКАКИВАЮ с ф-ции в основной цикл......, там я занимаюсь своими делами до тех пор пока Т2 не натикает мне сколько надо и если это случится то только тогда я запрыгиваю в play() и именно в то место где я оборвал выполнение данной ф-ции до того ......, вот как-то так.

Код: Выделить всё

play()
{
.....
.......
сдесь я запускаю Т2 и выпригиваю с данной ф-ции
сюда я возвращаюсь когда Т2 отсчитает определенное время
.....
......
}
ploop писал(а):ногда и GOTO так хочется вставить, посидишь, почешешься... и родишь что-нибудь компактное и красивое
так шо без GOTO никак ?
а ведь некоторые вопиют что это дурной тон :)) :wink: :))
Tell Me The Truth
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Вопросы по С/С++ (СИ)

Сообщение Psych »

Нельзя запустить таймер из мейн? Разбейте плей на две части.
FreshMan писал(а):так шо без GOTO никак ?
И с goto никак, насколько помню нельзя лезть из блока в другой блок.
Ответить

Вернуться в «Разные вопросы по МК»