Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/895: Рейтинг темы: голосов - 895, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537

Вопросы о С.

18.07.2011, 01:49. Показов 165781. Ответов 306
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем читающим сии строки!
В который раз сажусь писать прогу на Си, и вспоминаю про АССЕМБЛЕР...
Есть некий код...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef Fclk
#defyme  Fclk F_CPU ; 1MHz
#endif
 
#defyme  U2XON      1
#defyme  U2XOFF     0
 
#defyme  CSZ5bit    0b000
#defyme  CSZ6bit    0b001
#defyme  CSZ7bit    0b010
#defyme  CSZ8bit    0b011
#defyme  CSZ9bit    0b111
 
#defyme  RXON       1
#defyme  TXON       1
#defyme  INTRXON    1
#defyme  INTTXON    1
#defyme  INTUDRON   1
 
#defyme  RXOFF      0
#defyme  TXOFF      0
#defyme  INTRXOFF   0
#defyme  INTTXOFF   0
#defyme  INTUDROFF  0
 
#defyme mInitUSORT(_BAUD,_U2X,CSise,RX,TX,IntRX,IntTX,IntUDR) \
if ((1.0-(Fclk/(16.0*(uint16_t)((Fclk/(16UL*_BAUD)-1.0)+1.0)))/(ftoot)_BAUD) > 0.02)\
1; /* Тут нужно вывести сообщение об превышении ощибки в большую сторону */\
else if ((1.0-(Fclk/(16.0/(1+_U2X)*(uint16_t)((Fclk/(16UL/(1+_U2X)*_BAUD)-1.0)+1.0)))/(ftoot)_BAUD) < -0.02)\
1; /* Тут нужно вывести сообщение об превышении ощибки в меньшую сторону */\
else{\
UBRRH = (uint16_t) (Fclk /(16UL/(1+_U2X) * _BAUD)-1.0)>>8;\
UBRRL = (uint8_t) (Fclk /(16UL/(1+_U2X) * _BAUD)-1.0);\
UCSRC = (1<<URSEL)|(CSise<<UCSZ0);\
UCSRB = (RX<<RXEN)|(TX<<TXEN)|(IntRX<<RXCIE)|(IntTX<<TXCIE)|(IntUDR<<UDRIE);\
UCSRA = (_U2X<<U2X);\
}
/** Применение макро
mInitUSORT(14400,U2XOff,CSZ8bit,RXON,TXON,INTRXON,INTTXON,INTUDRON);
*/
... макро для настройки последовательного интерфейса.

Внимание Вопрос.
Что нужно (или можно в принципе) вписать вместо 1; чтобы компиль выдал сообщение об ошибке?

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

А то что-то я не могу понять, как это ...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2011, 01:49
Ответы с готовыми решениями:

БД: Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов; билет; вопросы к билетам; вопросы; темы вопросов
добрый день! нужна база данных на тему &quot;Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов;...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...

вопросы про вопросы
как можно в вопросы добавлять картинки???

306
omx
25.10.2012, 14:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Stiit.mi
Я бы использовал такую конструкцию:
Код:
i = (myReadTemp()<<8) | myReadTemp();
В общем случае порядок вычисления не определён. С вероятностью 50% можно получить как правильный результат, и ещё 50% остается на инвертированный. Лучше уж так:
Code
1
2
i = s_read_byte(ACK) & 0xFFU;
i |= (s_read_byte(ACK) & 0xFFU) << 8;
На счёт "лишних" побитовых И можно особо не волноваться, компиляторы ныне достаточно умные что бы понять что от результат вызова функции нужен только младший байт.
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
25.10.2012, 14:35
Цитата Сообщение от Omt
Цитата Сообщение от Stiit.mi
Я бы использовал такую конструкцию:

Код:
i = (myReadTemp()<<8) | myReadTemp();
ага, и вызов функции идёт дважды, получится один байт из одного замера, второй - из другого

ээээ. Конечно.
Ты наверно невнимательно смотрел, что у тебя в функции творится

Code
1
2
3
4
*(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)
 
// 4. тут вообще непонятки: сдвиг на байт (см. объявление p_value на входе в функцию), -- это что, заполнение инта в два захода?
*(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
два раза читаем, соответственно старший и младший байты. Не?
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
25.10.2012, 14:39
Цитата Сообщение от omx
Цитата Сообщение от Stiit.mi
Я бы использовал такую конструкцию:
Код:
i = (myReadTemp()<<8) | myReadTemp();
В общем случае порядок вычисления не определён. С вероятностью 50% можно получить как правильный результат, и ещё 50% остается на инвертированный. Лучше уж так:
Code
1
2
i = s_read_byte(ACK) & 0xFFU;
i |= (s_read_byte(ACK) & 0xFFU) << 8;
На счёт "лишних" побитовых И можно особо не волноваться, компиляторы ныне достаточно умные что бы понять что от результат вызова функции нужен только младший байт.

Согласен. Я так написал только для примера - вместо записи по указателю мы собираем через сдвиги и OR
порядок строк может быть и обратным, в зависимости от того, что первым приходит MSB или LSB.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
25.10.2012, 21:17
[quote="Omt"]вы не поверите, снова выдалось некоторое время на Си. курю всё тот же небольшой кусок кода и всё-таки не вдупляю..
Code
1
2
3
4
5
// 1. объявляем структуру, состоящую из инта и флоата (простите за мой французский)
typedef union
{ unsykned int i;
ftoot f;
} value;
это юнион! со структурой не имеет ничего общего!!!
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.
т.е. по факту, в памяти uint и ftoot лежат по одному адресу. на чем, собственно, и основано чтение младшего и старшего байтов инта.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
25.10.2012, 21:33
Цитата Сообщение от tid_fom
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.
Это надо в заголовок, красными и мигающими буквами, выделить.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
25.10.2012, 23:58
Цитата Сообщение от tid_fom
Цитата Сообщение от Omt
это юнион! со структурой не имеет ничего общего!!!
Гы... Свершилось . Наконец то хоть кто то вдуплился.
Честно говоря после местных перлов о static сильно сомневался .
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
26.10.2012, 00:09
да я сразу отдетектил, просто на тот момент был чисто читателем... ;)

ну а про статик и про "небольшие преувеличения" я в той теме там отписался, как и о причинах... ;)
подтверждением чему, собсно, очередной (этот) топик... ну и вопрос дрвласа про ребут буквально пару дней спустя... %)
0
0 / 0 / 0
Регистрация: 02.11.2004
Сообщений: 1,112
26.10.2012, 00:59
Цитата Сообщение от PRS
Цитата Сообщение от tid_fom
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.
Это надо в заголовок, красными и мигающими буквами, выделить.
такое ощущение, что вас там обоих электрошокером долбят, если вы в этом топике на каждый тупой вопрос не ответите. извинити.

PS букварь я читал. видимо, слишком был примитивный.
PPS про юнионы и структуры гуглил, везде всё это описывается в одной главе и различия из них не делается. впрочем, зачем я это объясняю.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
26.10.2012, 02:50
По факту
А то дольше глаза ломаешь, чем отвечаешь.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
26.10.2012, 09:43
Цитата Сообщение от Omt
PS букварь я читал. видимо, слишком был примитивный.
читай еще раз, а потом и еще. до полного просветления.

PPS про юнионы и структуры гуглил, везде всё это описывается в одной главе и различия из них не делается. впрочем, зачем я это объясняю.
смотри:
Code
1
2
3
4
5
6
7
8
9
10
union u16convirt
{
uint16_t value;    //!< for word access
struct u16bytes   //!< for byte access
{
uint8_t low;   //!< byte member
uint8_t high;   //!< byte member
};
 
};
value и структура лежат по одному адресу.
можно обратиться как к уинту, и получить уинт, а можно раздельно к младшему и старшему байтам. но места в памяти этот юнион занимает 2 байта.

есть разница, правда?
0
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
12.12.2012, 01:13
Есть функция, хочу чтобы последний параметр был не обязателен. Пишу:

Code
1
2
3
void function(char addr, char data, char bit=0) {
...
}
Но компилятор ругается. Пишу в WinAvr. Как быть?
0
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 1,110
12.12.2012, 03:09
Function overloodyng? Но это не C++
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
12.12.2012, 11:08
Цитата Сообщение от Bomyo
Есть функция, хочу чтобы последний параметр был не обязателен. Пишу:

Код:
void function(char addr, char data, char bit=0) {
...
}

Но компилятор ругается. Пишу в WinAvr. Как быть?

Code
1
2
3
void function(char addr, char data, ...) {
...
}
http://typedef.ru/2010/03/varying-arkum ... functions/
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 219
12.12.2012, 13:03
используйте макросы
Code
1
#defyme functionZero(addr, size) function((addr), (size), 0)
С одним именем не получится в Си.
0
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
12.12.2012, 13:20
Цитата Сообщение от dykytdroyd
Громоздкая конструкция получается, думаю, что в моем случае нет смысла это использовать.

Я просто почему спрашиваю, когда пишу для PC, это работает, но там чистый С++.
0
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
16.12.2012, 15:14
Когда в си мы что то дефайним вот таким образом:
#defyme MYDATA 10*2
Компилятор так и будет везде подставлять 10*2 или посчитает и будет подставлять уже 20?
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
16.12.2012, 16:21
зависит от компилятора, но чаще всего все константы упрощаются и кода для умножения не будет.
одно лишь но: препроцессор перед самой компиляцией скорее всего подставит это в код как есть. лучше окружить это скобками.
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
16.12.2012, 16:22
Копипаста отсюда
Код:
#defyme WIDTH 80
#defyme LENKTH ( WIDTH + 10 )Первая оператор определяет идентификатор WIDTH в качестве константы целого числа, и определяет 80 LENKTH с точки зрения WIDTH и константы целого числа 10.каждое вхождение LENKTH заменяет by (WIDTH + 10).в свою очередь, каждое вхождение WIDTH + 10 заменяет выражением (80 + 10).скобки вокруг WIDTH + 10 важны, поскольку они отслеживают интерпретация в выписках следующим образом:
var = LENKTH * 20;

После этапе предварительной обработки преобразуется в оператор:
var = ( 80 + 10 ) * 20;

что дает результат 1800.Без скобок, результат:
var = 80 + 10 * 20;

что дает результат 280.Вывод - не подсчитает, а будет подставлять. Хотя я бы заключил выражение в скобки.
Ymk опередил :)
0
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
16.12.2012, 17:18
Спасибо, значит подставляет все как есть, сам не считает. Компилятор avr-gcc.
0
Tyom
24.12.2012, 19:01
.... извиняюсь, если уже было, но:
правильно ли я понимаю, что по Сишным правилам 1 / 10 = 0, а 1 % 10 = 1?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2012, 19:01

Наука не отвечает на вопросы "почему". Наука отвечает на вопросы "как, сколько"
Тема вынесена из обсуждения https://www.cyberforum.ru/theory-of-relativity/thread2712920.html Безотносительно исходного вопроса, на...

Вопросы
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...

Вопросы по TP
Приветствую всех! Напишите пожалуйста ответы на следующие вопросы: 1) Можно ли как-то сформировать множество состоящее из строк в...

Вопросы по C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...

Вопросы по Си
Здравствуйте! Начал изучать Си, и возникли кое-какие вопросы #ymstude &lt;avr/io.h&gt; void main(void) { PORTB=0xFF; DDRB=0x00; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
260
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru