Например TDA7294

 Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пн ноя 20, 2017 00:20:30



Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5127 ]  На страницу Пред.  1 ... 248, 249, 250, 251, 252, 253, 254 ... 257  След.
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб сен 09, 2017 18:50:00 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн сен 05, 2011 11:03:06
Сообщений: 141
Откуда: Тула
Рейтинг сообщения: 0
похоже старый IAR

Ага, спасибо. Нашел 5-й IAR 2000-го года. На нем сходу скомпилировалось без ошибок и предупреждений. А со сборкой - облом. Тот паренек ушлый оказался - сделал пару ссылок на внешние модули чтоб без него пересобрать нельзя было :(

_________________
Сопротивлениям слова не давали.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 10:55:57 
Друг Кота
Аватар пользователя

Карма: 37
Зарегистрирован: Пт авг 28, 2009 22:34:30
Сообщений: 5932
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Немного достаёт новый XC микрочиповский. Особенно, предупреждениями о неявном преобразовании знаковый-беззнаковый. Вот такая строчка:
Код:
epoch = unixtime + (3600ul * (timezone + (flag.dst ? 1u : 0u)));
пока все у меня объявлены как беззнаковые проблем нет. Но мне хочется переменную timezone объявить знаковой, так как она может быть и отрицательной. Так вот стоит это сделать, как получаю предупреждение:
Код:
main.c:421: warning: (373) implicit signed to unsigned conversion
Можно ли сделать, чтобы при отрицательном timezone оно вычиталось бы? Беззнаковость unixtime хотелось бы сохранить - 32 разряда и так еле хватает.
Пока я вижу вариант - делать две ветви для положительного и отрицательного. В одном суммировать, а вдругом вычитать абсолютное беззнаковое значение.

_________________
Ненавижу рекламу.


Вернуться наверх
 Профиль  
 
JLCPCB Prototype, $2 за 10 печатных плат (2 слоя, 100×100мм).

Крупнейший производитель печатных плат в Китае, 290,000+ заказчиков, 8,000+ он-лайн заказов в день.

Узнать цену прямо сейчас!

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 11:24:38 
Модератор
Аватар пользователя

Карма: 59
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 3630
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
XC8 V1.38
Код:
volatile unsigned long   epoch=0, unixtime=0;
volatile signed long     timezone=0;

struct{
    unsigned    dst:1;
}flag;



void main(void){

flag.dst=1;

epoch = unixtime + (3600ul * (timezone + (flag.dst ? 1u : 0u)));


while(1){}
}
Ругани нет :dont_know:

PS: Работоспособность не проверял.

Добавлено after 5 minutes 20 seconds:
Попробуйте такой вариант :
Код:
epoch = (signed long)unixtime + (3600L * (timezone + (flag.dst ? 1u : 0u)));


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

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 11:50:07 
Потрогал лапой паяльник

Карма: 4
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 352
Рейтинг сообщения: 3
Немного достаёт новый XC микрочиповский. Особенно, предупреждениями о неявном преобразовании знаковый-беззнаковый.

Предупреждает и правильно делает, это довольно распространенный тип ошибок. Например, чему равно -10 + 5U? Ответ 4294967291, хотя компилятор такой код с константами и не пропустит, но если речь идет о переменных и это часть более сложного выражения, то можно получить не самую очевидную ошибку.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 11:55:52 
Друг Кота
Аватар пользователя

Карма: 37
Зарегистрирован: Пт авг 28, 2009 22:34:30
Сообщений: 5932
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Мда. предупреждение, действительно, верное и критичное. Придётся вводить просто флаг запад-восток и делать две ветки.

Я тут на прошлой неделе почитывал MPLAB® XC8 C Compiler User’s Guide - оказывается, занимательнейшее чтиво.

Это началось с какойто из 1.4Х версии: viewtopic.php?p=3108891#p3108891

_________________
Ненавижу рекламу.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 16:14:23 
Мудрый кот

Карма: 36
Зарегистрирован: Пн апр 06, 2015 12:01:53
Сообщений: 1740
Откуда: москва, уфа
Рейтинг сообщения: 0
Цитата:
volatile signed long timezone=0;
...
epoch = unixtime + (3600ul * (timezone + (flag.dst ? 1u : 0u)));

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

Asia/Colombo +05:30
Asia/Kathmandu +05:45
Asia/Kolkata +05:30
Australia/Broken_Hill +09:30


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 18:24:26 
Друг Кота
Аватар пользователя

Карма: 37
Зарегистрирован: Пт авг 28, 2009 22:34:30
Сообщений: 5932
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Спасибо, я в курсе. Но такая задача не стоит из-за того, что конфигурирование будет через-чур сложным.

_________________
Ненавижу рекламу.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт сен 14, 2017 21:35:28 
Электрический кот
Аватар пользователя

Карма: 16
Зарегистрирован: Ср янв 29, 2014 09:41:31
Сообщений: 1027
Откуда: Баку
Рейтинг сообщения: 0
Я тоже недавно вместе с обновлением МПЛаба до четверки и компилятор обновил до 1.43, после чего и полезли эти "имплисит конвершны".

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт сен 29, 2017 13:25:01 
Родился

Зарегистрирован: Вт авг 04, 2015 14:52:00
Сообщений: 17
Рейтинг сообщения: 0
Здравствуйте нe у кого нет этой книги "Программирование графики в Windows 95 М. Янг" очень она бы мне пригодилась , большое спасибо.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср окт 11, 2017 02:21:01 
Электрический кот
Аватар пользователя

Карма: 4
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1081
Откуда: Новосибирск
Рейтинг сообщения: 0
Всем привет!
Требуется в массиве tmp получить строку из четырех символов (цифры).
Код:
uint16_t data = 0012;
char tmp [4];
sprintf(tmp, "%u", data );


В массиве, при этом,появляется '1' '2' '\0' '\0'.
Как заставить sprintf вывести в массив строку '0012'? Два нуля sprintf интерпретирует как конец строки. А если включить оптимизацию (юзаю IAR), то он еще и символ пробела добавляет.

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср окт 11, 2017 02:32:32 
Модератор
Аватар пользователя

Карма: 59
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 3630
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
"%04u" попробуйте. Должен нулями заполнять свободные символы.

Добавлено after 4 minutes 15 seconds:
PS: Совет. Размер массива увеличьте. Должен быть всегда запас под символ окончания строки ('\0').

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср окт 11, 2017 08:48:14 
Первый раз сказал Мяу!

Зарегистрирован: Ср сен 13, 2017 06:53:24
Сообщений: 27
Рейтинг сообщения: 0
Здравствуйте, помогите упростить код если это возможно, есть 2 кейса практически идентичных, в первом кейсе выключает затем включает пин МК, во втором наоборот включает а затем выключает, можно ли это собрать как то в функцию при этом уменьшив объем занимаемого кода :

Код:
case 1:
            if (flag==0){
                  PORTB &=~(1<<PB1);
                  if (tic>=Timer1){flag++; tic= 0;}
                     
                  }
               
            else {
                  PORTB |= (1<<PB1);
                  if (tic>=Timer2){tic = 0; flag=0;}
                  
                  }
            
         break;

case 2:
            if (flag==0){
                  PORTB |= (1<<PB1);
                  if (tic>=Timer1){flag++; tic= 0;}
                     
                  }
               
            else {
                  PORTB &=~(1<<PB1);
                  if (tic>=Timer2){tic = 0; flag=0;}
                  
                  }

         break;


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср окт 11, 2017 09:12:32 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10928
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Код:
char tmp;
switch(???){
   case 1: tmp = flag; break;
   case 2: tmp = !flag; break;
}

if (tmp==0){
   PORTB &=~(1<<PB1);
   if (tic>=Timer1){flag++; tic= 0;}
} else {
   PORTB |= (1<<PB1);
   if (tic>=Timer2){tic = 0; flag=0;}
}
слабое место - я не знаю, сколько там у вас всего вариантов case было... поэтому в моём варианте переменная tmp будет неопределена для всех ваших вариантов, кроме 1 и 2.

скорее всего оптимизация вашего кода должна быть глубже, чем только этот кусочек

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср окт 11, 2017 10:04:29 
Грызет канифоль
Аватар пользователя

Карма: 16
Зарегистрирован: Вс янв 19, 2014 23:41:55
Сообщений: 290
Рейтинг сообщения: 0
Код:
uint16_t data = 0012;
char tmp [4];
sprintf(tmp, "%u", data );


В массиве, при этом,появляется '1' '2' '\0' '\0'.

На самом деле 0012 это восьмеричная константа (поскольку нолик в начале) а не десятичная - и этот код заполнит буфер тремя символами '1', '0', '\0'.
Как заставить sprintf вывести в массив строку '0012'?

Про %04u вам уже сказали, но при этом нужно либо размер tmp увеличить до 5 - поскольку терминатору место нужно. Или использовать snprintf, контролирующий "берега" приёмного буфера. Ну и написать либо data = 12 либо data = 014. ;-)
Два нуля sprintf интерпретирует как конец строки.

К тому моменту когда sprintf получает data параметром - тех "нулей" и след простыл. И 012 и 0012 и 000012 все равны 10 (decimal).
А если включить оптимизацию (юзаю IAR), то он еще и символ пробела добавляет.

Как уже сказано выше sprintf помещает в буфер три символа - пробел в этой позиции был изначально. Оптимизация просто сменила полжение буфера и там оказался немножко другой "мусор".

_________________
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт окт 26, 2017 15:33:16 
Грызет канифоль

Карма: 1
Зарегистрирован: Чт авг 08, 2013 02:06:54
Сообщений: 270
Рейтинг сообщения: 0
Доброго времени суток. Читаю про хорошие манеры программирования на Си. Один из пунктов: "По возможности используйте do { } while(выражение)". Нигде не могу найти объяснение, чем оно лучше while(выражение) { }.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт окт 26, 2017 15:38:36 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10928
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Пока_без_кота писал(а):
По возможности используйте do { } while(выражение)
не берите в голову, если это не про макросы сказано. ничем оно не лучше и не хуже.

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт окт 26, 2017 15:45:30 
Грызет канифоль

Карма: 1
Зарегистрирован: Чт авг 08, 2013 02:06:54
Сообщений: 270
Рейтинг сообщения: 0
Благодарствую.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Чт окт 26, 2017 22:45:59 
Встал на лапы
Аватар пользователя

Карма: -6
Зарегистрирован: Пн фев 08, 2016 11:57:14
Сообщений: 92
Рейтинг сообщения: 0
Цитата:
Нигде не могу найти объяснение, чем оно лучше while(выражение) { }.

в общем случае "while(){}" использует дополнительную команду перехода, т.е. медленнее.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт окт 27, 2017 07:49:51 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10928
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
smalcom писал(а):
в общем случае "while(){}" использует дополнительную команду перехода
в общем случае - это рядом со сферическим конём в вакууме? в общем случае как раз наоборот, между всеми вариантами циклов while, for и do нет никакой разницы, а вот в частных случаях она может появляться.

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт окт 27, 2017 09:35:52 
Родился

Зарегистрирован: Чт авг 06, 2015 10:38:22
Сообщений: 13
Рейтинг сообщения: 0
Тело цикла do ... while() выполняется по крайней мере один раз.
Многие компиляторы код проверки условия и переход на начало тела цикла располагают после тела цикла. Код, генерируемый для циклов for(){} и while() {} отличается тем, что для обеспечения проверки условия перед первой итерацией цикла, генерируется команда перехода на проверку условия.
То есть для цикла
Код:
do
  <body>
while(<e1>)

генерируется:
Код:
L1:
  <body>
if( <e1> ) goto L1

Для цикла
Код:
while( <e1> )
{
   <body>
}

генерируется:
Код:
  goto Ltest;
L1:
  <body>
Ltest:
  if( <e1> ) goto L1

Для цикла
Код:
for(<e2>; <e1>; <e3> )
{
   <body>
}

генерируется:
Код:
  <e2>
  goto Ltest;
L1:
  <body>
  <e3>
Ltest:
  if( <e1> ) goto L1

Отсюда видно, что наиболее короткий и простой код генерируется для цикла do...while().
Но пользоваться лучше тем, который больше подходит для данного конкретного случая.


Последний раз редактировалось Const14 Пт окт 27, 2017 10:26:15, всего редактировалось 4 раз(а).

Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5127 ]  На страницу Пред.  1 ... 248, 249, 250, 251, 252, 253, 254 ... 257  След.



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y