Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Задача 9-го класса


Автор: bass 23.9.2012, 14:51
Что то я немного запутался..... Есть два графика, описаны массивом short (массив : значение графика1;значение графика2;значение графика1;значение графика2 ) Все значение через определленнй интервал.....
Задача вычеслить разницу между двумя граффиками и записать в массив......

Код


                short BufferStart=0;
                short BufferStart2=0;
                CopyMemory(&BufferStart,lpData+I,2) ;
                CopyMemory(&BufferStart2,lpData+I+2,2) ;



                        if((BufferStart>=0 && BufferStart2>=0)||(BufferStart<=0 && BufferStart2<=0))
                        {
                        BufferStart =BufferStart-(BufferStart2);
                        }else
                        {
                        BufferStart =BufferStart+(BufferStart2);
                        }
здесь запись в массив.
 

Что то какойто бред получаеться .......

Все перебераеться в цикле ..... Цикл работает если первый график установить в постоянное значение 0 то все Ок, если в -1 то какойто бред.......

Заранее спасибо....

Автор: feodorv 23.9.2012, 15:12
Цитата(bass @  23.9.2012,  15:51 Найти цитируемый пост)
вычеслить разницу между двумя граффиками

Как определяется "разница между двумя граффиками"?
Код

delta = mod( val1 - val2 )
???


Цитата(bass @  23.9.2012,  15:51 Найти цитируемый пост)
                short BufferStart=0;
                short BufferStart2=0;
                CopyMemory(&BufferStart,lpData+I,2) ;
                CopyMemory(&BufferStart2,lpData+I+2,2) ;

Это безобразие(((
Код

short *buffer = (short *) lpData;
short val1 = buffer[2*pointNum];
short val2 = buffer[2*pointNum+1];
pointNum++;

Автор: bass 23.9.2012, 15:38
Код

delta = mod( val1 - val2 )


Чет не пашет Builder...... Говорит нет такой функции.....А случайно Mod не за деление отвечает????





Автор: feodorv 23.9.2012, 19:31
Цитата(bass @  23.9.2012,  16:38 Найти цитируемый пост)
Говорит нет такой функции.....

Да нет, это был не реальный код. Просто, хотелось бы понять, что это за зверь: "разница между двумя графиками".
mod - имелось в виду взятие по модулю:
Код

#define mod(x) ((x) < 0 ? -(x) : (x))

(ну или через inline). Может, взятие по модулю тут и не причём...

Автор: 586 23.9.2012, 19:54
Цитата(feodorv @  23.9.2012,  20:31 Найти цитируемый пост)
mod - имелось в виду взятие по модулю

Это abs а не mod, и он уже есть в <math.h>.
А mod'ом обозначается остаток от деления.

Автор: feodorv 23.9.2012, 20:33
Цитата(586 @  23.9.2012,  20:54 Найти цитируемый пост)
Это abs

Ок. Но abs - для double, не для short.
Самое простое:
Код

if( (delta = (val1 - val2)) < 0 ) delta = -delta;

Но опять-таки, нужен ли short abs или нет?

Автор: 586 23.9.2012, 22:18
Поскольку используется тип short, то в целях оптимизации можно и свой макрос написать, т.к. функция abs() есть только для типа int. 
Для типа double - функция fabs.

Автор: bass 23.9.2012, 22:33
Мужики abs и для short будет работать...... Привидет к нормальному числу...... Макрос я выше попытался написать, что - то не получилось.... 

Автор: feodorv 23.9.2012, 23:46
Да ладно, забудьте про макрос. Чем Вас 
Код

if( (delta = (val1 - val2)) < 0 ) delta = -delta;
 не устраивает?
Правда, тогда и delta, и элементы массива разницы должны иметь тип int, а то возможно переполнение при вычитании двух short'ов.

Автор: bass 24.9.2012, 08:18
Цитата(feodorv @ 23.9.2012,  23:46)
Да ладно, забудьте про макрос. Чем Вас 
Код

if( (delta = (val1 - val2)) < 0 ) delta = -delta;
 не устраивает?
Правда, тогда и delta, и элементы массива разницы должны иметь тип int, а то возможно переполнение при вычитании двух short'ов.

user posted image

Есть два графика надо один из другова вычесть ..... Например возмем первый и третий..... Если в низу мы их вычтем то он наоборот увиличеться в низ...... 


вот и пытался код написать но где то просчитался......
Код

                        if((BufferStart>=0 && BufferStart2>=0)||(BufferStart<=0 && BufferStart2<=0))
                        {
                        BufferStart =BufferStart-(BufferStart2);
                        }else
                        {
                        BufferStart =BufferStart+(BufferStart2);
                        }

Автор: feodorv 24.9.2012, 09:22
Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
Если в низу мы их вычтем то он наоборот увиличеться в низ......

Ну не знаю. Там, где у первого графика есть "низ", у второго - ноль. Что там может увеличиваться "в низ"?

А что, при вычитании графиков ничего увеличиваться не должно?


Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
где то просчитался

Ну, думаю, потому что это 
Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
BufferStart =BufferStart+(BufferStart2);
 не вычитание, а сложение...

Автор: bass 24.9.2012, 10:55
Цитата(feodorv @ 24.9.2012,  09:22)
Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
Если в низу мы их вычтем то он наоборот увиличеться в низ......

Ну не знаю. Там, где у первого графика есть "низ", у второго - ноль. Что там может увеличиваться "в низ"?

А что, при вычитании графиков ничего увеличиваться не должно?


Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
где то просчитался

Ну, думаю, потому что это 
Цитата(bass @  24.9.2012,  09:18 Найти цитируемый пост)
BufferStart =BufferStart+(BufferStart2);
 не вычитание, а сложение...

Ага прав спасибо что то перемудрил нужно во всех ситуациях минус.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)