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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

Можно конечно, но я IAR полюбил в последнее время. В AVR студии я кодил только на асме, там еще компилятор сишный нормальный надо искать и т. д.
Прогу пишу для работы, так что возиться хочется по минимуму.
А что, с портированием сильно замучаюсь? Вот статью нашел:
http://we.easyelectronics.ru/Yanichar/p ... stm8l.html
Щас пытаюсь повторить то же, но для АВР.
Что-то вообще примеров мало как библиотекой пользоваться... Я думал такая вещь распространенная должна быть, чуть ли не единственная нормальная библиотека...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Здравствуйте, что-то не как с компилятором(IAR) не могу разобраться.
Есть у меня гигантский массив что бы он не мозолил глаза (и не только он делается автоматически) я его запихал и отдельный файл romfile.c
и добавил в проект #include <romfile.c> но вот все типы переменные типа u_char и структуры он там(в файле romfile.c) перестаёт понимать. Хотя выше стройкой стоит #include <types.h> в котором всё объявлено. Если вытащить всё из файла то всё нормально работает.
Как с этим быть?
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Доброго времени суток! :) Такое дело, МК ATmega32, пишу в Atmel Studio 6.0, на СИ (при создании проекта выбираю С++). Опытным путём получается, что будь то:

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

unsigned int
unsigned long int
unsigned long

В любом случае диапазон значения переменной -32768 ... 32767.

А как сделать больше?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

Мikа писал(а):А как сделать больше?

long long
pokk писал(а):Как с этим быть?

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

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

Сообщение ploop »

Мikа, какой там компилятор в этом Atmel Studio?
По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

ploop, пишут, что GCC (пост №6).

Щас попробовал так:

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

uint32_t S=0;
   uint32_t t=0;

Правильно написал? результат отрицательный, диапазон значений t и S -32768 ... 32767.

Вот ещё нашёл, щас попробую...

UPD:

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

uint32_t t EEMEM;
uint32_t S EEMEM;


На выходе получается трижды треш О_о

UPD: А ведь при написании кода на си можно делать ассемблерные вставки. А может быть можно сделать вставку, в которой объявить нужную переменную нужного размера, и указать где в памяти выделить под неё место? Если можно, можете дать пример кода? Ассемблер я сейчас соооовсем не помню :(

UPD:

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

asm("t:   .byte 32");

Не сработало :))
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

ploop писал(а):По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
Эти типы в avr-lib определены в stdint.h.
Мikа писал(а):Опытным путём получается
Каким именно путём вы это получили?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

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

#include <stdint.h>

uint32_t t=0;
uint32_t S=0;


Это не работает.

Kavka, работаю с часами. Храню время в секундах. Опытным путём выяснил, что хранится нормально 09 часов, 06 минут (секунды не подсчитывал - они в программе считаются, но на индикаторе только ЧЧ:ММ). Итак, 09 часов и 06 минут это:

09 * 3600 = 32400 сек
06 * 60 = 360 сек
32400 + 360 = 32760 сек.

16 битная переменная со знаком находится в -32768 ... 32767

32760 сек и 32767 очень похожи.

На индикаторе я вижу нормально отображение до времени 09:06, после чего абракадабру.
Отсюда я делаю вывод, что в Atmel Studio с GCC любые

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

unsigned int =0;
unsigned long int =0;
unsigned long =0;
uint32_t =0;


Фактически получают 16 бит, причём число там хранится со знаком. То есть unsigned копмпилятор тоже игнорирует.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Мikа писал(а):На индикаторе я вижу нормально отображение до времени 09:06, после чего абракадабру

Так проверяйте функцию вывода на индикатор.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Функция в порядке.

Пересчёт секунд в ЧЧ:ММ:СС и вычисление значений, которые должен показать индикатор
Спойлер

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

void SEC(void)
{
   // --- Вычисление часов, минут и секунд из секунд
   h=(t/3600);//Вычисление часов
   m=((t-(h*3600))/60);//Вычисление минут
   s=((t-(h*3600))-(m*60));//Вычисление секунд
   // --- END Вычисление часов, минут и секунд из секунд
   
   // --- Вычисление старшего разряда часов
   hh=0; //Это обнуление нужно для того, чтобы каждый новый пересчёт (который ниже) прибавление было с 0
   while (h>9)//Если часы больше 9
   {
      h=(h-10);//Часы минус 10
      hh++;      //Увеличить старший разряд часов на 1
   }
   // --- END Вычисление старшего разряда часов
   
   hl=0;
   // --- Вычисление младшего разряда часов
   while (h>0)//Если часы больше 9
   {
      h--;//Часы минус 10
      hl++;      //Увеличить младший разряд минут на 1
   }
   // --- END Вычисление младшего разряда часов
   
   
   mh=0;
   // --- Вычисление старшего разряда минут
   while (m>9)
   {
      m=(m-10);
      mh++;
   }
   // --- END Вычисление старшего разряда минут
   
   ml=0;
   // --- Вычисление старшего разряда минут
   while (m>0)
   {
      m--;
      ml++;
   }
   // --- END Вычисление младшего разряда часов
   
   
   sh=0;
   // --- Вычисление старшего разряда секунд
   while (s>9)
   {
      s=(s-10);
      sh++;
   }
   // --- END Вычисление старшего разряда секунд
   
   sl=0;
   // --- Вычисление старшего разряда минут
   while (s>0)
   {
      s--;
      sl++;
   }
   // --- END Вычисление младшего разряда секунд


ФУнкция динамической индикации
Спойлер

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

void DICHM(void)
{
   //Цикл динамической индикации
   
   PORT_SEG=digits[hh]; //Часы старший
   PORT_DIGITS ^= (1 << PINA4);//Инвертирую только один бит, потому что на порту кроме индикатора есть другие устройства
   _delay_us(100);
   PORT_DIGITS ^= (1 << PINA4);
   
   if (d)//Это мигание двоеточием ЧЧ : ММ, d инвертируется в прерывании оп таймеру
   {
      PORT_SEG=digits[hl]; //Часы Младший - тут : не будет гореть
   }
   else
   {
      PORT_SEG=digitsd[hl]; //Часы Младший - тут : будет гореть
   }
   PORT_DIGITS ^= (1 << PINA5);
   _delay_us(100);
   PORT_DIGITS ^= (1 << PINA5);
   
   PORT_SEG=digits[mh]; //Минуты старший
   PORT_DIGITS ^= (1 << PINA6);
   _delay_us(100);
   PORT_DIGITS ^= (1 << PINA6);
   
   PORT_SEG=digits[ml]; //Минуты младший
   PORT_DIGITS ^= (1 << PINA7);
   _delay_us(100);
   PORT_DIGITS ^= (1 << PINA7);
}


Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

так вроде проще:

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

 // --- Вычисление старшего разряда часов
   hh=0; //Это обнуление нужно для того, чтобы каждый новый пересчёт (который ниже) прибавление было с 0
   while (h>9)//Если часы больше 9
   {
      h=(h-10);//Часы минус 10
      hh++;      //Увеличить старший разряд часов на 1
   }
   // --- END Вычисление старшего разряда часов
   // --- Вычисление младшего разряда часов
   hl=h;
  // --- END Вычисление младшего разряда часов

и т.д.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Да, проще. Но суть вопроса не в этом. Эти 2 функции работают нормально, а компилятор не даёт мне 32 бита под беззнакоове число :( Что делать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

так попробовать
h=(uint8_t)(t/3600U);//Вычисление часов
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

бррр.... в код не полезу, и так уже глаза враскось...

Мikа, если прямо в коде задать константу, выводит нормально?
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

ploop, я щас пытаюсь понять чё он там компилирует в disassembly. Я не совсем понял ваш вопрос. Вы имеете ввиду объявить переменную в теле int main(void) ?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Вы имеете ввиду объявить переменную в теле int main(void) ?

Нет, просто там, где используется переменная, заместо неё просто впишите число заведомо положительное, например 35000.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

35000 - сработал правильно, 65000 - начал показывать абра-кадабры. Причём начал их показывать почти сразу (не уходя далеко от 35000). Щас переделаю программу, чтобы работала с 16 бит переменными, но, бле, вопрос, всё-таки, интересный О_о
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Так это и есть 16 бит :)
Надо на 32 переделывать.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

У мння убеждённость, что компилятор выдаёт мне знаковые переменные из 16 бит. 65000 - это беззнаковые 16 бит :)
Ещё одна идея есть. Щас напишу простую программку, которая будет работать так:

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

unsigned long i = 1000000000; (МИЛЛИАРД!!!11)

if(i == 1000000000)
{
включить лампочку!!!
}
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Щас напишу простую программку, которая будет работать так:

Правильно. Только не забудь оптимизатор отключить или обмануть :)
А то вся программа превратится в

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

// включить лампочку!!!
Ответить

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