реклама на сайте
подробности

 
 
> Сравнение больших чисел, 64 бита и больше, на языке С, сильно не пинать:)
Pyku_He_oTTyda
сообщение May 26 2006, 04:34
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



#include <mega8535.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>

#include <stdio.h> // Standard Input/Output functions

#define MAX_DEVICES 1 //определяем максимальное количество устройств на шине

unsigned char rom_codes[MAX_DEVICES][9]; //выделяет память (9 бит умноженное на кол-во устройств)

void main(void)
{
unsigned char i=0;
unsigned char j;
unsigned char devices;

// USART initialization
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;

// Analog Comparator: Off
ACSR=0x80;

w1_init(); // 1 Wire Bus initialization

// Watchdog Timer initialization
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;

#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

//ищем устройство командой 0xf0, в rom_codes ложится 9 байт (family-1,serial-6,CRC8-1,некоторые устройства возвращают 9 байт)
devices=w1_search(0xf0,rom_codes);

/* display the ROM codes for each detected device */
printf("%-u DEVICE(S) DETECTED\n\r",devices); // выводим количество подключенных устройств

for (j=0;j<9;j++) // задаем, какую часть кода выводить
{
printf("%-X",rom_codes[i][j]);
}
printf("\n\r");

}



На основе примера из CVAVR програмка, которая в сом-порт сбрасывает номер подключенного 1-wire устройства (DS1990). Эта часть кода работает.
Подскажите, как сравнить номер "таблетки" с неким заданным значением, которое можно будет определить в начале программы, или с несколькими значениями. Вот собственно вопрос мой...
Еще приветствуются указание моих косяков в программе и в комментариях


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Pyku_He_oTTyda
сообщение May 26 2006, 07:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Цитата
GetSmart


Простите за назойливость, а не могли бы черкнуть пример на моем частном случае,
определить вот это значение: 11E6CAC00701
а то я плывуsad.gif


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 26 2006, 07:34
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04) *
Цитата
GetSmart


Простите за назойливость, а не могли бы черкнуть пример на моем частном случае,
определить вот это значение: 11E6CAC00701
а то я плывуsad.gif

Код
flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01};   // Код "таблетки"
char         buffer[9];

char Match(char flash *pat, char *bp, char n)
         {
         while (n--)
               {
               if (*pat++ != *bp++)    // байты не совпали
                       return FAIL;          // - выход по ошибке
               }
          return OK;                        // Успешный выход
          }
...................
// -- Вызов
         if (Match(pattern, buffer, sizeof pattern) == OK) // Наш код!
                     Smile();                                  // :-)
         else                                              // Ерунда какая-то
                     Cry();                                    // :-(


Сообщение отредактировал _Bill - May 26 2006, 07:35
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 26 2006, 12:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(_Bill @ May 26 2006, 15:34) *
Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04) *

Цитата
GetSmart


Простите за назойливость, а не могли бы черкнуть пример на моем частном случае,
определить вот это значение: 11E6CAC00701
а то я плыву sad.gif

Код
flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01};   // Код "таблетки"
char         buffer[9];

char Match(char flash *pat, char *bp, char n)
         {
         while (n--)
               {
               if (*pat++ != *bp++)    // байты не совпали
                       return FAIL;          // - выход по ошибке
               }
          return OK;                        // Успешный выход
          }
...................
// -- Вызов
         if (Match(pattern, buffer, sizeof pattern) == OK) // Наш код!
                     Smile();                                  // :-)
         else                                              // Ерунда какая-то
                     Cry();                                    // :-(




Привет всем. Код хорош но я бы выполнил его немного по другому) Можно делать не сравнение в цикле, а просто вычитание одного разрядного байта из другого, а результат хранить в общей сумме. В итоге если сумма не равна нулю, число не совпало, если равно нулю - число совпало с эталоном. Выйгрыш - меньше переходов при равенстве чисел и стабильность по времени исполнения кода, т.е. код всегда будет выполняться одинаковое число команд, что не мало-важно при работе с 1Ware. Конечно, мелочь, но нагляднее и приятнее))) :



Код


flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01};   // Код "таблетки"
char         buffer[9];

/********************************************************************************
************

функция сравнения двух n-байтных чисел

********************************************************************************
************/



BOOL  Match(char flash *pat, char *bp, char n)
{      

       char sum = 0;


        while (n)
        {       sum += *pat++  - *bp++;

                n--;

        }



        return sum;

}



// ИМХО на мой вкус код более нагляден и эффективен)))
...................
// -- Вызов
         if (Match(pattern, buffer, sizeof pattern) == 0) // Наш код!
                     Smile();                                  // :-)
         else                                              // Ерунда какая-то
                     Cry();                                    // :-(


--------------------
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 26 2006, 13:06
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(prottoss @ May 26 2006, 15:41) *
Привет всем. Код хорош но я бы выполнил его немного по другому) Можно делать не сравнение в цикле, а просто вычитание одного разрядного байта из другого, а результат хранить в общей сумме. В итоге если сумма не равна нулю, число не совпало, если равно нулю - число совпало с эталоном. Выйгрыш - меньше переходов при равенстве чисел и стабильность по времени исполнения кода, т.е. код всегда будет выполняться одинаковое число команд, что не мало-важно при работе с 1Ware. Конечно, мелочь, но нагляднее и приятнее))) :



Код


flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01};   // Код "таблетки"
char         buffer[9];

/************************************************************************

функция сравнения двух n-байтных чисел

*************************************************************************/



BOOL  Match(char flash *pat, char *bp, char n)
{      

       char sum = 0;


        while (n)
        {       sum += *pat++  - *bp++;

                n--;

        }



        return sum;

}



// ИМХО на мой вкус код более нагляден и эффективен)))
...................
// -- Вызов
         if (Match(pattern, buffer, sizeof pattern) == 0) // Наш код!
                     Smile();                                  // :-)
         else                                              // Ерунда какая-то
                     Cry();                                    // :-(

Ну, тогда уж лучше так
Код
flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01};   // Код "таблетки"
char         buffer[9];

/****************************************************************

функция сравнения двух n-байтных чисел

****************************************************************/

BOOL  Match(char flash *pat, char *bp, char n)
        {      
         char sum = 0;

         while (n)
                {
                sum |= *pat++ ^ *bp++;
                n--;
                }
         return sum;
        }

Вычитание не всегда даст корректный результат. Допустим, в одном случае разность будет +1, в другом - -1. В сумме будет ноль, хотя не совпадают два байта.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 13:39
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(_Bill @ May 26 2006, 16:06) *
Вычитание не всегда даст корректный результат.

И так тоже не всегда! И это принципиальное ограничение. Заодно Вы всегда будете сравнивать ВСЮ память, хотя достаточно первого несравнения. Если хочется ускорять - переходите на сравнение (в зависимости от платформы) 32-16-и потом уже байтовых значений. В некоторых случах типа описанного, ускорение для несовпадающих значений даст сравнение с 'конца'.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pyku_He_oTTyda   Сравнение больших чисел, 64 бита и больше   May 26 2006, 04:34
- - Pyku_He_oTTyda   Попробую, я еще только взялся за С, так что для ме...   May 26 2006, 05:07
- - vet   #include <string.h> if (memcmp(rom_codes[i]...   May 26 2006, 05:16
- - GetSmart   Цитатаunsigned int test = array[0] * array[1] * ar...   May 26 2006, 06:25
|- - haker_fox   Цитата(GetSmart @ May 26 2006, 15:25) Цит...   May 26 2006, 06:56
- - Pyku_He_oTTyda   Цитата#include <string.h> if (memcmp(rom_co...   May 26 2006, 06:30
- - Pyku_He_oTTyda   А как мне определить такой большой my_code ? Напри...   May 26 2006, 06:41
- - GetSmart   ЦитатаА как мне определить такой большой my_code ?...   May 26 2006, 06:51
- - BVU   Цитата(Pyku_He_oTTyda @ May 26 2006, 08:3...   May 26 2006, 06:57
- - Pyku_He_oTTyda   Вообще запутался, сосвоим кодом было не разобратся...   May 26 2006, 07:49
|- - haker_fox   Цитата(Pyku_He_oTTyda @ May 26 2006, 16:4...   May 26 2006, 07:56
|- - _Bill   Цитата(Pyku_He_oTTyda @ May 26 2006, 10:4...   May 26 2006, 08:07
- - GetSmart   2 Pyku_He_oTTyda По-моему _Bill написал хороший к...   May 26 2006, 08:31
- - Pyku_He_oTTyda   Я и не обижаюсь, понимаю, что много непонятного......   May 26 2006, 08:57
|- - _Bill   Цитата(Pyku_He_oTTyda @ May 26 2006, 11:5...   May 26 2006, 09:06
|- - otrog   Цитата(_Bill @ May 26 2006, 13:06) Може...   May 26 2006, 10:05
|- - zltigo   Цитата(_Bill @ May 26 2006, 12:06) Може...   May 26 2006, 12:27
- - GetSmart   ЦитатаСовершенно верно, индетификатор содержит шес...   May 26 2006, 09:16
- - Pyku_He_oTTyda   11E6CAC00701 - это 9 кодов, строка printf(...   May 26 2006, 09:56
- - Pyku_He_oTTyda   01 равен 1 и в двоичной, и в десятичной, и в шестн...   May 26 2006, 10:14
|- - otrog   А дошло! У Вас изначально было "0x01, 0x1...   May 26 2006, 10:31
- - defunct   Код#define FALSE 0 #define TRUE 1 char Match...   May 26 2006, 13:39
|- - zltigo   Цитата(defunct @ May 26 2006, 16:39) Код ...   May 26 2006, 13:44
|- - defunct   Цитата(zltigo @ May 26 2006, 16:44) Цитат...   May 26 2006, 13:55
- - GetSmart   2 prottoss Можно и по-вашему. Иногда так бывает уд...   May 26 2006, 13:53
|- - prottoss   Цитата(GetSmart @ May 26 2006, 21:53) 2 p...   May 26 2006, 16:51
- - ps1x   2 Pyku_He_oTTyda Раз уж такая тема, Вы случаем не...   May 26 2006, 17:29
- - Pyku_He_oTTyda   Цитатаunsigned char my_code[6] = {0x01,0x07,0xc0,0...   May 29 2006, 04:44


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016