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

Профессионал
    
Группа: Свой
Сообщений: 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). Эта часть кода работает. Подскажите, как сравнить номер "таблетки" с неким заданным значением, которое можно будет определить в начале программы, или с несколькими значениями. Вот собственно вопрос мой... Еще приветствуются указание моих косяков в программе и в комментариях
--------------------
Андрей Смирнов
|
|
|
|
|
 |
Ответов
|
May 26 2006, 07:04
|

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

|
Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву
--------------------
Андрей Смирнов
|
|
|
|
|
May 26 2006, 07:34
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04)  Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву  Код 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
|
|
|
|
|
May 26 2006, 12:41
|

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

|
Цитата(_Bill @ May 26 2006, 15:34)  Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04)  Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву Код 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(); // :-(
--------------------
|
|
|
|
|
May 26 2006, 13:06
|
Местный
  
Группа: Участник
Сообщений: 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. В сумме будет ноль, хотя не совпадают два байта.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|