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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

ploop писал(а):
Короче подскажите функцию смещения одного бита из числа)
Надо поменять местами 2 бита в числе?
Вот кратко охарактеризовал мою проблемму ,надо 9 бит записать в 15 - как это сделать, чтобы остальное число неменялось)
или точнее надо чтобы 15 бит был такойже как и 9.
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Спасибо разобрался) получилось както так:
if(x&256)
x |= (1<<13);
else
x &= ~(1<<13);
if(x&512)
x |= (1<<14);
else
x &= ~(1<<14);

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

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

Сообщение ploop »

Опять ничего непонятно :)))
Но от else можно избавиться так:

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

x = (x&256) ? x |= (1<<13) : x &= ~(1<<13);
x = (x&512) ? x |= (1<<14) : x &= ~(1<<14);
Они абсолютно равнозначны, только ваша запись для некоторых понятнее.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

Короче подскажите функцию смещения одного бита из числа)
Давайте я Вам покажу методику установки отдельных битов в массиве.

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


//устанавливает бит с номером N в массиве ARR
#define set_bit_by_number(ARR,N)                ((ARR)[(N) / 8]|=(1<<((N) % 8)))
//очищает бит с номером N в массиве ARR
#define clear_bit_by_number(ARR,N)                ((ARR)[(N) / 8]&=~(1<<((N) % 8)))

...

uint8_t array[10];

...


set_bit_by_number(array,12); //устанавливает двенадцатый бит в массиве; то есть, во втором (12 / 8) байте будет записано 0x10 (пятый бит, 12 % 8)

...

clear_bit_by_number(array,70); //снимает семидесятый бит в массиве; то есть, в восьмом (70 / 8) байте будет снят шестой (70 % 8) бит

Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

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

Сообщение FeCat »

Я правильно понимаю, что если пользоваться «typedef unsigned char u08», то
unsigned char
и
u08
для компилятора всё равно не одно и то же (варнингами ругается на несоответствие типов)?
Реклама
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

правильно понимаете. Это какбэ то же самое, но не одно и то же :)
Все будет только лучше, в крайнем случае - хуже.
Реклама
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

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

Сообщение FeCat »

Пишу:

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

u08 Time[12];

Time[1]='д'; // русская ‘д’
Если это написано в основном цикле программы, то всё нормально.
Если же выношу в функцию на отдельном листе, то компилятор ругается на это:
«Warning 1 multi-character character constant [-Wmultichar]»
«Warning 5 large integer implicitly truncated to unsigned type [-Woverflow]»
В Time[1] попадает мусор, впечатление будто начинает используется какая то другая кодировка.
Atmel Studio 6.1
Я что то делаю не так?
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

Проблема в юникоде - русская буква занимает 2 байта. Варианта решения 2: либо включить CP1251 в редакторе (если возможно), либо записывать строки в виде HEX.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет! У меня один вопрос: "Как уйти от быдлокодинга?"
Надо писать прошивку для контроллера. Пишу на сях. Задействованы два UART, ADC, DAC, PWM (до шести каналов). Проблема в том, что опыта мало. До этого делал всякую мелочь типа термометров, вольтметров и прочей мелочи. Сейчас продумываю структуру программы. Думал заюзать FreeRTOS, но кажется не встанет. У контроллера 16к флешки и 4к срама.
Читал статьи ДиХалта о структуре программ. Решил остановиться идее межзадачного взаимодействия посредством флагового автомата. Естественно всё (в идеале) будет крутиться в прерываниях... . Еще грамотно приоритеты расставить. Но кажется такая структура будет неповоротливая и может рухнуть под собственным весом. Можете посоветовать какую нить статью про структуру программ? Какой структуры придерживаетесь вы, когда работаете над серьёзным проектом?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Вы не назвали ни контроллер ни компилятор, который юзаете. Трудно что-то посоветовать Вам, не зная этих данных.
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

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

Сообщение blackx »

Chip115 писал(а):Всем привет! У меня один вопрос: "Как уйти от быдлокодинга?"
Если абстрактно, то:

0. Сначала - пишете понятный код - и только потом - оптимизируете (если вообще нужно!!). Не надо переносить в Си стиль написания программ на ассемблере.
1. Пишите понятный код. Если вас разбудить на следующее утро после кодирования, вы должны быть в состоянии ответить что делает случайно взятая строчка из кода. Это значит
а) давайте переменным, функциям и макросам понятные имена
б) если из-за требований получается непонятно, даже после попытки рефакторинга - пишите подробные комментарии
2. Не торопитесь. Делайте программу последовательно, проверяя каждый шаг.
3. Каждая функция должна фокусироваться на строго одной задаче.
4. не забывайте о KISS и DRY.

Какую структуру программы бы вы ни выбрали, всегда можно написать хороший код.
Последний раз редактировалось blackx Вт окт 15, 2013 07:11:24, всего редактировалось 1 раз.
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

FreeRTOS замечательная вещь. Используем активно, но на контроллере с 512кб флеш и 32кб рам.
Не зная задачи, трудно говорить о необходимости и адекватности использования ОС. И что будет крутиться в прерываниях? В ОС этого как раз я бы избегал. Если речь не идет о драйверной части. Был бы контроллер пожирнее, я бы рекомендовал С++ для большого проекта. Но если нет опыта, все же нужно начинаться с Си.
Все же, чуть конкретнее о задаче и контроллере, тогда можно будет что-то посоветовать
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Спасибо за ответы! Камень: STM32F100RB; среда разработки: IAR; Язык: С
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

В этом МК, если я не ошибаюсь 128кБ флэш и 8кБ ОЗУ. Звучали другие цифры ранее :) На этом МК вполне можно запустить freertos.
PS: А о проекте так и не сказали. Клещами тащить надо ? :)))
Но в общем-то, дело хозяйское
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Доброго времени суток, господа!
Тут такое дело. Хочется заюзать printf для вывода отладочной инфы й UART.
Так вот он работает только с настройками формата printf Tyny, выводя целые числа. Как мне заставить работать printf в формате Full, что бы вывести не целое число?
При других настройках формата выводится только первый символ.
Вот код для отладки отладочной функциональности О_о Замеряю напругу на входе АЦП и хочу вывести величину измеренного напряжения в UART.
Среда разработки IAR 6.40.2
Камень: STM32F100C4T6B

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

#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include <stdio.h>

int putchar(int c)
{
    while(( USART1->SR & USART_SR_TXE) == 0);
    if (c == '\n')
      c = '\r';
    USART1->DR = c;
    return 0;
}

void main(void)
{
  Sys_Clock_Config ();
  USART_Config ();
  GPIO_Config ();
  ADC_config ();

  int a = 0;
  double ADC_resoult;
  a = ADC1->DR;
  ADC_resoult = 3.3*a/4095;
  printf ("ADC convert = %f\n", a);
  
  
  while(1) 
  {
   
  }
}
Все. Разобрался. Нашел решение проблемы в статье тут
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

вроде текст программы на английском а ADC_resoult это какое то новое слово. Может лучше ADC_result ?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

И сколько, интересно, printf отгрызла памяти. Если уж double, то может так будет правильнее:
ADC_resoult = 3.3*(double)a/4095.0;
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

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

Сообщение blackx »

Нашли к чему придраться и сразу накинулись :facepalm:
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

кто ж придирался то. В двух верхних постах присутствует слово "может" - это вводное слово, указывает на вероятность события вероятно, по-видимому. Насчет printf мне интересно, когда то начинал с LPC2101 возиться - применил printf, то отгрызло чуть ли не пол памяти, а как сейчас - может лучше стало. Интересно какой компилятор.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

oleg110592 писал(а): применил printf, то отгрызло чуть ли не пол памяти
жрет дофига, 1.5-2кб ОЗУ :)
Так вот он работает только с настройками формата printf Tyny
В настройках проекта в IAR это настраивается

упс тока заметил что уже решили )
Ответить

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