Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
unsigned long int i;
i = read_adc();
lcd_gotoxy ( 5, 1);
lcd_putc(( (i/100)%10) +0x30);
lcd_putc(( (i/10 )%10) +0x30);
lcd_putc(( (i/1 )%10) +0x30);
delay_ms ( 10);
вот так получилось, спасибо за ответ
буду дальше разбираться
i = read_adc();
lcd_gotoxy ( 5, 1);
lcd_putc(( (i/100)%10) +0x30);
lcd_putc(( (i/10 )%10) +0x30);
lcd_putc(( (i/1 )%10) +0x30);
delay_ms ( 10);
вот так получилось, спасибо за ответ
буду дальше разбираться
I=U/R 
- Реклама
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Эх.... Бывают и похлеще записи.
В аргументы метода класса, (динамический массив объектов класса), засовываются элементы структуры (динамический массив структур). Плюс, прикручивание инкремента\декремента на фиксированный шаг.

Код: Выделить всё
if(keys[VK_UP])
{
tst[qd].set_pos(qd_s[qd].qd_x, qd_s[qd].qd_y+=0.1f);
}
if(keys[VK_DOWN])
{
tst[qd].set_pos(qd_s[qd].qd_x, qd_s[qd].qd_y-=0.1f);
}
if(keys[VK_LEFT])
{
tst[qd].set_pos(qd_s[qd].qd_x-=0.1f, qd_s[qd].qd_y);
}
if(keys[VK_RIGHT])
{
tst[qd].set_pos(qd_s[qd].qd_x+=0.1f, qd_s[qd].qd_y);
}
if(keys[VK_F2])
{
qd -= 1;
}
if(keys[VK_F3])
{
qd += 1;
}
I am DX168B and this is my favourite forum on internet!
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
имхо, плохой код. бессмысленное дублирование кучи операций. нечитаемость полная. опять же, имхо, надо было бы завести локальные переменные для приращения координат, присвоить им значение в switch-е, а затем единожды изменить координаты и передать их в метод. как-то так...DX168B писал(а):Эх.... Бывают и похлеще записи.
битва с дураками проиграна, победители торжествуют. слава победителям!
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А как тогда переключаться между несколькими одинаковыми объектами, координаты которых хранятся во множестве одинаковых структур, да ещё и обрабатываются в отдельном потоке (основной занят другими делами) А так, у меня выбор объектов ссылается на значение в переменной qd.
Имеем класс QUAD qd[x].
Имеем структуру qd_s[x].
В классе несколько функций, одна из них QUAD::set_pos(float x, float y)
В структуре хранятся переменные struct qd_s {float qd_x, qd_y;}; которые хранят данные по положению элементов на координатных осях. В дальнейшем, данные будут загружаться в структуры из внешнего файла.
Встроенные в класс переменные нужны для прорисовки объекта и активно участвуют в просчётах. Всё разнесено на отдельные потоки, по этому пока использую объявление структуры, как глобальной. (она ещё юзается в других функциях) switch \ case тут не поможет, так как каждый элемент массива bool keys[256] может принимать только два вида значений, это true и false.
Читаемость - это кому как: Я для себя принял так: qd - префикс, который указывает на то, что элемент имеет прямое или косвенное отношение к классу QUAD.
qd_x - понятно, что координата X объекта QUAD. qd_y - Y координата того же объекта. qd_s - структура. qd - индекс (лучше было бы написать qd_i)
Операции не бессмысленны, так как процедуры должны отрабатываться постоянно, пока зажаты соответствующие клавиши.
Кому-то может и неудобно, но мне проще.
Там у меня ещё есть куча других самописных классов (Button, Widget, CheckBox, ProgressBar, Grid, Edit, Table, Terminal, Graphic и прочее)
Пока всё это написано так-же, через *опу, но потом, как закончу, начну думать об оптимизации и грамотном оформлении.
Имеем класс QUAD qd[x].
Имеем структуру qd_s[x].
В классе несколько функций, одна из них QUAD::set_pos(float x, float y)
В структуре хранятся переменные struct qd_s {float qd_x, qd_y;}; которые хранят данные по положению элементов на координатных осях. В дальнейшем, данные будут загружаться в структуры из внешнего файла.
Встроенные в класс переменные нужны для прорисовки объекта и активно участвуют в просчётах. Всё разнесено на отдельные потоки, по этому пока использую объявление структуры, как глобальной. (она ещё юзается в других функциях) switch \ case тут не поможет, так как каждый элемент массива bool keys[256] может принимать только два вида значений, это true и false.
Читаемость - это кому как: Я для себя принял так: qd - префикс, который указывает на то, что элемент имеет прямое или косвенное отношение к классу QUAD.
qd_x - понятно, что координата X объекта QUAD. qd_y - Y координата того же объекта. qd_s - структура. qd - индекс (лучше было бы написать qd_i)
Операции не бессмысленны, так как процедуры должны отрабатываться постоянно, пока зажаты соответствующие клавиши.
Кому-то может и неудобно, но мне проще.
Там у меня ещё есть куча других самописных классов (Button, Widget, CheckBox, ProgressBar, Grid, Edit, Table, Terminal, Graphic и прочее)
Пока всё это написано так-же, через *опу, но потом, как закончу, начну думать об оптимизации и грамотном оформлении.
I am DX168B and this is my favourite forum on internet!
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
писать красиво и правильно лучше сразу, потому что потом переделывать будет крайне трудоемко.
я, честно говоря, не очень понял вашу задачу, но сдается мне, у вас немного логически неверный подход - поправьте, если я не прав.
любой отображаемый объект должен сам знать свои координаты и иметь метод для их изменения. так же он сам себя должен уметь отрисовывать в контексте графического дисплея, т.е. еще и метод для отрисовки должен иметь.
тогда не придется хранить координаты объектов в отдельных массивах и структурах, т.е. во многих местах. достаточно будет иметь коллекцию графических объектов, и при необходимости что-то сделать использовать перебор коллекции и обращение к нужным методам.
изменять состояние переменных класса напрямую - это плохой стиль.
в общем, сумбурно написал, как и вы - не уверен, донес ли свою мысль
я, честно говоря, не очень понял вашу задачу, но сдается мне, у вас немного логически неверный подход - поправьте, если я не прав.
любой отображаемый объект должен сам знать свои координаты и иметь метод для их изменения. так же он сам себя должен уметь отрисовывать в контексте графического дисплея, т.е. еще и метод для отрисовки должен иметь.
тогда не придется хранить координаты объектов в отдельных массивах и структурах, т.е. во многих местах. достаточно будет иметь коллекцию графических объектов, и при необходимости что-то сделать использовать перебор коллекции и обращение к нужным методам.
изменять состояние переменных класса напрямую - это плохой стиль.
в общем, сумбурно написал, как и вы - не уверен, донес ли свою мысль
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так всё правильно
Этим циклом я веду отрисовку. В классе есть метод для этого:
Так же, в классе есть и переменные, хранящие расположение\размер\цвет и прочие параметры объекта. Переменные класса занесены в область private. Трогать их я не могу.
Для изменения каждого параметра существуют свои методы класса. Каждый объект помнит свои параметры.
Структура внешняя, нужна была только для того, чтобы, когда я переключаюсь между объектами, положение каждого элемента на оси не сбрасывалось к координатам предыдущего объекта.
Можно было бы добавить метод QUAD::get_pos(float *x, float *y) передав методу адресА внешних переменных. Потом изменить и пхнуть обратно через QUAD::set_pos(x, y)
Так мы избавимся от внешней структуры и сэкономим место в ОЗУ, но не процессорное время.
Код у меня сырой ещё. Ещё многое надо будет до ума доводить. Так, что пока всё временно, чтобы проверить, что работает. Возможно, некоторые классы надо будет полностью переделывать, чтобы реализовать всё изящно и красиво. А так, это пока эскизы (быдлокод).
Этим циклом я веду отрисовку. В классе есть метод для этого:
Код: Выделить всё
for(int j = 0 ; j < sizeof(tst)/sizeof(*tst) ; j++) //на примере массива со статическим размером.
{
tst[j].qd_view(); //Перебираем элементы
}
Для изменения каждого параметра существуют свои методы класса. Каждый объект помнит свои параметры.
Структура внешняя, нужна была только для того, чтобы, когда я переключаюсь между объектами, положение каждого элемента на оси не сбрасывалось к координатам предыдущего объекта.
Можно было бы добавить метод QUAD::get_pos(float *x, float *y) передав методу адресА внешних переменных. Потом изменить и пхнуть обратно через QUAD::set_pos(x, y)
Так мы избавимся от внешней структуры и сэкономим место в ОЗУ, но не процессорное время.
Код у меня сырой ещё. Ещё многое надо будет до ума доводить. Так, что пока всё временно, чтобы проверить, что работает. Возможно, некоторые классы надо будет полностью переделывать, чтобы реализовать всё изящно и красиво. А так, это пока эскизы (быдлокод).
I am DX168B and this is my favourite forum on internet!
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
я тоже ничего не понял. Есть объекты, разнесенные по потокам - и глобальный массив, код обращения к которому не защищен хотя бы критической секцией ? А что будет , если обращение будет приходить в массив от 2 объектов одновременно? Падение ?
И причем здесь статический массив, если говорим о динамическом ?
Я бы не изобретал велосипед, а использовал при создании объекта класса MyObject карты, куда бы заносил номер создаваемого объекта и указатель на созданный класс.
И причем здесь статический массив, если говорим о динамическом ?
Я бы не изобретал велосипед, а использовал при создании объекта класса MyObject карты, куда бы заносил номер создаваемого объекта и указатель на созданный класс.
Код: Выделить всё
InterlockedIncrement(&CountObjekt);
pMyClass =new CMyClass();
pMyClass->Create(bla bla bla
pMyClass->m_num=CountObjekt;
Map_My.SetAt(CountObjekt,pMyClass);
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Нет, Есть массив объектов, созданный в основном потоке и есть обращения к объектам через их встроенные методы из других потоков. Никаких падений не происходит.urry писал(а):я тоже ничего не понял. Есть объекты, разнесенные по потокам - и глобальный массив, код обращения к которому не защищен хотя бы критической секцией ? А что будет , если обращение будет приходить в массив от 2 объектов одновременно? Падение ?
Массив структур создан отдельно (вне класса) и хранит изначальные свойства объектов. В коде выше, я просто достаю данные из структуры, изменяю (инкремент\декремент), и скармливаю методу quad::set_pos(x,y)
В итоге, я изменяю данные в структуре и параллельно меняю параметры объекта. Если заметили, то у меня выбор объекта и структуры происходят через единый индекс qd. С его помощью, я переключаюсь между элементами и структурами. Сделал так для того, чтобы, если я в следующий раз обращусь к объекту, у меня инкремент\декремент продолжится, а не сбросится.
Я говорил о динамическом массиве объектов и о массиве структур. Пока сделано статически, так как пока кручусь между std::vector и class MyClass a; a *ps = new a;urry писал(а):И причем здесь статический массив, если говорим о динамическом ?
Попробую и так. Пока перебираю варианты.urry писал(а): Я бы не изобретал велосипед, а использовал при создании объекта класса MyObject карты, куда бы заносил номер создаваемого объекта и указатель на созданный класс.Код: Выделить всё
CountObjekt++; pMyClass =new CMyClass(); pMyClass->Create(bla bla bla pMyClass->m_num=CountObjekt; Map_My.SetAt(CountObjekt,pMyClass);
I am DX168B and this is my favourite forum on internet!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
levaclaus писал(а): скидывайте конечно)
Код: Выделить всё
void f_Clk(void) {
PORT_OUT|=_BV(Clk_pin);
PORT_OUT&=~_BV(Clk_pin);
}
void f_strobe(void) {
PORT_OUT|=_BV(Strobe_pin);
PORT_OUT&=~_BV(Strobe_pin);
}
void f_shift_reg(unsigned char gear) {
for (char i=0;i<=7;i++){
(gear&0x01)? PORT_OUT|=_BV(D_pin): PORT_OUT&=~_BV(D_pin);
f_Clk();
gear>>=1;
};//for
f_strobe();
}//f_shift_reg Недоделанный проект переключения передач для пятой студии и рабочий проект функции в протеусе.
десять рублей в моем магазинеlevaclaus писал(а):Но регистр стоит денег,
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
написал прогу которая будет выводить числа от 0 до 99 и обратно но при кампиляции выдается ошибка
вроде же все верно............
компилятор указывает вот на эту строчку впрогеError: C:\Documents and Settings\User\Рабочий стол\6\6.c(25): missing '('
с чем это может быть связано ?var = MIN_VAL; // начальное значение числа пусть будет минимальным
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define PC4 4
#define PC5 5
#define DIG1 (1<<PC4)
#define DIG2 (1<<PC5)
#define DELTA 1
#define MAX_VAL 99
#define MIN_VAL 0
char index;
char number[2];
int delta_value, var;
var = MIN_VAL; // начальное значение числа пусть будет минимальным
delta_value = DELTA; // приращение по умолчанию
void output(int var)
{
number[0]=var%10;
number[1]=var/10;
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTC=0;
PORTC = number[index & 1]; // вывели в дешифратор нужный код
PORTC |= index & 1 ? DIG2 : DIG1; // включили нужный индикатор
index++; // готовим номер разряда/индикатора для следующего прерывания
}
void main(void)
{
PORTC=0x00;
DDRC=0x7F;
PORTD=0xFF;
DDRD=0x00;
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
while (1)
{
output(var); // вывели текущее значение числа
delay_ms(1000);
if((var >= MAX_VAL)||(var<= MIN_VAL)) {delta_val = - delta_val;};
var += delta_val; // изменяем число
};
}
Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Инициализация глобальных и статических переменных должна быть при объявлении:FreshMan писал(а):компилятор указывает вот на эту строчку впрогеvar = MIN_VAL; // начальное значение числа пусть будет минимальным
Код: Выделить всё
...
int var = MIN_VAL; // начальное значение числа пусть будет минимальным
int delta_value = DELTA; // приращение по умолчанию
...
Re: Вопросы по С/С++ (СИ)
BorisSPB, я не понял вас
у меня же и так там все обявлено...........
Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Объявлены в одном месте, проинициализированы в другом...FreshMan писал(а):BorisSPB, я не понял васу меня же и так там все обявлено...........
Код: Выделить всё
//
//Это обявление
//
int delta_value, var;
//
//Это инициализация
//
var = MIN_VAL; // начальное значение числа пусть будет минимальным
delta_value = DELTA; // приращение по умолчанию
Последний раз редактировалось BorisSPB Вт мар 20, 2012 21:29:53, всего редактировалось 1 раз.
Re: Вопросы по С/С++ (СИ)
вот так ?
Код: Выделить всё
#define DIG1 (1<<PC4)
#define DIG2 (1<<PC5)
#define DELTA 1
#define MAX_VAL 99
#define MIN_VAL 0
char index;
char number[2];
int var = MIN_VAL; // начальное значение числа пусть будет минимальным
int delta_value = DELTA; // приращение по умолчанию
Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Да. Я подкорректировал предыдущий ответ чтоб было понятнееFreshMan писал(а):вот так ?
Re: Вопросы по С/С++ (СИ)
Какие?FreshMan писал(а):но в таком случае при компиляции выдается 2 ошибки
Re: Вопросы по С/С++ (СИ)
первая
и вторая
с указанием на вот эту строчкуError: C:\Documents and Settings\User\Рабочий стол\6\6.c(75): undefined symbol 'delta_val'
Код: Выделить всё
if((var >= MAX_VAL)||(var<= MIN_VAL)) {delta_val = - delta_val;};
с указанием на этуError: C:\Documents and Settings\User\Рабочий стол\6\6.c(77): undefined symbol 'delta_val'
Код: Выделить всё
var += delta_val; // изменяем число Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Объявлено delta_value , а используется delta_valError: C:\Documents and Settings\User\Рабочий стол\6\6.c(75): undefined symbol 'delta_val'
Re: Вопросы по С/С++ (СИ)
спешка.............., едрит ее через коромысло ....!!
thanks !!!
thanks !!!
Tell Me The Truth


