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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
UA0QQE
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср янв 12, 2011 13:10:37
Откуда: Якутск

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

Сообщение UA0QQE »

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=U/R :)))
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Эх.... Бывают и похлеще записи. :)

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

			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;
			}
В аргументы метода класса, (динамический массив объектов класса), засовываются элементы структуры (динамический массив структур). Плюс, прикручивание инкремента\декремента на фиксированный шаг. :shock: :))) :))) :)))
I am DX168B and this is my favourite forum on internet!
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

DX168B писал(а):Эх.... Бывают и похлеще записи. :)
имхо, плохой код. бессмысленное дублирование кучи операций. нечитаемость полная. опять же, имхо, надо было бы завести локальные переменные для приращения координат, присвоить им значение в switch-е, а затем единожды изменить координаты и передать их в метод. как-то так...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

А как тогда переключаться между несколькими одинаковыми объектами, координаты которых хранятся во множестве одинаковых структур, да ещё и обрабатываются в отдельном потоке (основной занят другими делами) А так, у меня выбор объектов ссылается на значение в переменной 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 и прочее)
Пока всё это написано так-же, через *опу, но потом, как закончу, начну думать об оптимизации и грамотном оформлении.
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: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Так всё правильно
Этим циклом я веду отрисовку. В классе есть метод для этого:

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

	for(int j = 0 ; j < sizeof(tst)/sizeof(*tst) ; j++) //на примере массива со статическим размером.
	{
		tst[j].qd_view(); //Перебираем элементы
	}
Так же, в классе есть и переменные, хранящие расположение\размер\цвет и прочие параметры объекта. Переменные класса занесены в область private. Трогать их я не могу.
Для изменения каждого параметра существуют свои методы класса. Каждый объект помнит свои параметры.
Структура внешняя, нужна была только для того, чтобы, когда я переключаюсь между объектами, положение каждого элемента на оси не сбрасывалось к координатам предыдущего объекта.
Можно было бы добавить метод 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: Вопросы по С/С++ (СИ)

Сообщение urry »

я тоже ничего не понял. Есть объекты, разнесенные по потокам - и глобальный массив, код обращения к которому не защищен хотя бы критической секцией ? А что будет , если обращение будет приходить в массив от 2 объектов одновременно? Падение ?
И причем здесь статический массив, если говорим о динамическом ?
Я бы не изобретал велосипед, а использовал при создании объекта класса 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: Вопросы по С/С++ (СИ)

Сообщение DX168B »

urry писал(а):я тоже ничего не понял. Есть объекты, разнесенные по потокам - и глобальный массив, код обращения к которому не защищен хотя бы критической секцией ? А что будет , если обращение будет приходить в массив от 2 объектов одновременно? Падение ?
Нет, Есть массив объектов, созданный в основном потоке и есть обращения к объектам через их встроенные методы из других потоков. Никаких падений не происходит.
Массив структур создан отдельно (вне класса) и хранит изначальные свойства объектов. В коде выше, я просто достаю данные из структуры, изменяю (инкремент\декремент), и скармливаю методу quad::set_pos(x,y)
В итоге, я изменяю данные в структуре и параллельно меняю параметры объекта. Если заметили, то у меня выбор объекта и структуры происходят через единый индекс qd. С его помощью, я переключаюсь между элементами и структурами. Сделал так для того, чтобы, если я в следующий раз обращусь к объекту, у меня инкремент\декремент продолжится, а не сбросится.
urry писал(а):И причем здесь статический массив, если говорим о динамическом ?
Я говорил о динамическом массиве объектов и о массиве структур. Пока сделано статически, так как пока кручусь между std::vector и class MyClass a; a *ps = new a;
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: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

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    
Функции f_strobe и f_Clk можно прописать в виде макроса.

Недоделанный проект переключения передач для пятой студии и рабочий проект функции в протеусе.
Gear_shift_auto.rar
(75.61 КБ) 130 скачиваний
levaclaus писал(а):Но регистр стоит денег,
десять рублей в моем магазине
В поисках истины человек развивается.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

написал прогу которая будет выводить числа от 0 до 99 и обратно но при кампиляции выдается ошибка
Error: C:\Documents and Settings\User\Рабочий стол\6\6.c(25): missing '('
компилятор указывает вот на эту строчку впроге
var = MIN_VAL; // начальное значение числа пусть будет минимальным
с чем это может быть связано ? :dont_know: вроде же все верно............

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

#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
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

FreshMan писал(а):компилятор указывает вот на эту строчку впроге
var = MIN_VAL; // начальное значение числа пусть будет минимальным
Инициализация глобальных и статических переменных должна быть при объявлении:

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

...
int var = MIN_VAL; // начальное значение числа пусть будет минимальным
int delta_value = DELTA; // приращение по умолчанию
...
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

BorisSPB, я не понял вас :dont_know: у меня же и так там все обявлено...........
Tell Me The Truth
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

FreshMan писал(а):BorisSPB, я не понял вас :dont_know: у меня же и так там все обявлено...........
Объявлены в одном месте, проинициализированы в другом...

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

//
//Это обявление
//
int delta_value, var;

//
//Это инициализация
//
var = MIN_VAL; // начальное значение числа пусть будет минимальным
delta_value = DELTA; // приращение по умолчанию
Объявление и инициализация должны быть совмещены, а то компилятор считает, что надо генерить код инициализации, но код вне функции невозможен. Значения статических переменных копируются из ROMа в RAM перед запуском main (код для этого на совести компилятора)
Последний раз редактировалось BorisSPB Вт мар 20, 2012 21:29:53, всего редактировалось 1 раз.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

вот так ?

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

#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
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

FreshMan писал(а):вот так ?
Да. Я подкорректировал предыдущий ответ чтоб было понятнее :)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

но в таком случае при компиляции выдается 2 ошибки :(
Tell Me The Truth
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

FreshMan писал(а):но в таком случае при компиляции выдается 2 ошибки :(
Какие?
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

первая
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
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

Error: C:\Documents and Settings\User\Рабочий стол\6\6.c(75): undefined symbol 'delta_val'
Объявлено delta_value , а используется delta_val :?
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

спешка.............., едрит ее через коромысло ....!!
thanks !!! :beer:
Tell Me The Truth
Ответить

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