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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Сравнение больших чисел, 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
Pyku_He_oTTyda
сообщение May 26 2006, 05:07
Сообщение #2


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

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



Попробую, я еще только взялся за С, так что для меня не все еще прозрачно.


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


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



#include <string.h>

if (memcmp(rom_codes[i], my_code, 9)==0) {
//совпадение с блоком в SRAM
}

if (memcmpf(rom_codes[i], my_flash_code, 9)==0) {
//совпадение с блоком во FLASH
}


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 06:25
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
unsigned int test = array[0] * array[1] * array[2] * array[3] * array[4] * array[5] * array[6] * array[7];

Не делайте так низачто! Ерунда какая-то. Человек не понял, что сам написал. Уж лучше сравнивать побайтно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 06:30
Сообщение #5


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

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



Цитата
#include <string.h>

if (memcmp(rom_codes[i], my_code, 9)==0) {
//совпадение с блоком в SRAM
}


Буду пробовать, мне знак не нужен, только равно или нет.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 06:41
Сообщение #6


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

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



А как мне определить такой большой my_code ? Например такой: 11E6CAC00701
unsigned char array[9]; - так будет корректно?


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 06:51
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
А как мне определить такой большой my_code ?
unsigned char array[9]; - так будет корректно?

Да. Лишь бы было в RAM.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 26 2006, 06:56
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(GetSmart @ May 26 2006, 15:25) *
Цитата
unsigned int test = array[0] * array[1] * array[2] * array[3] * array[4] * array[5] * array[6] * array[7];

Не делайте так низачто! Ерунда какая-то. Человек не понял, что сам написал. Уж лучше сравнивать побайтно.


Елки-палки... Я прошу прощения... Я действительно написал большую ерунду, я удалил свое сообщение. Просто что-то жарко сегодня в моем городе и я сильно устал. Поэтому не подумал и написап эту дрянь. Сори!!! bb-offtopic.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
BVU
сообщение May 26 2006, 06:57
Сообщение #9


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



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

При считывании номера переведите его в строку ASCII символов (s1) и делайте сравнение с шаблонной строкой (s2) оператором - strcmp(s1, s2), где char *s1, s2; Можно написать свою функцию для сравнения строк, если нехотите или не т возможности использовать библиотчную.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 07:04
Сообщение #10


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

Группа: Свой
Сообщений: 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
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 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
Pyku_He_oTTyda
сообщение May 26 2006, 07:49
Сообщение #12


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

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



Вообще запуталсяsad.gif, сосвоим кодом было не разобратся, а тут еще новый


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


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(Pyku_He_oTTyda @ May 26 2006, 16:49) *
Вообще запуталсяsad.gif, сосвоим кодом было не разобратся, а тут еще новый


Вы только не обижайтесь smile.gif но может Вам лучше сначала язык немного подучить? Опыть в программировании, как я понимаю, у Вас имеется. Максимум 1 - 1,5 недели хватит для начала. А так, вряд ли что дельно выйдет.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 26 2006, 08:07
Сообщение #14


Местный
***

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



Цитата(Pyku_He_oTTyda @ May 26 2006, 10:49) *
Вообще запуталсяsad.gif, сосвоим кодом было не разобратся, а тут еще новый

"То ли еще будет..., то ли еще будет... Ой ёй ёй..."
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 08:31
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



2 Pyku_He_oTTyda

По-моему _Bill написал хороший код. Без использования каких-либо библиотек. Он точно будет самым компактным. Советую. Если его чуть-чуть подправить. (уточнить)
____________________

Но если не нравится, то может этот:

unsigned char my_code[6] = {0x01,0x07,0xc0,0xca,0xe6,0x11};

for (j=0;j<9;j++)
{
if (memcmp(rom_codes[j][1], my_code, sizeof(my_code))==0) {
// выполнить что-то и выйти из цикла
break;
}
}

Я написал в обратном порядке байты (как в Интел-формате). Если подразумевалось не так, то переставьте их наоборот. Сам идентификатор как я понял содержит только 6 байт.

Сообщение отредактировал GetSmart - May 26 2006, 08:52


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 08:57
Сообщение #16


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

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



Я и не обижаюсьsmile.gif, понимаю, что много непонятного... Вот я и учусь, мне удобнее учится на примерах, чем просто книгу читать.
Буду сейчас разбиратся на примере ваших кодов.
Всем спасибо! Отдельное спасибо _Bill и GetSmart.
Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.


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


Местный
***

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



Цитата(Pyku_He_oTTyda @ May 26 2006, 11:57) *
Я и не обижаюсьsmile.gif, понимаю, что много непонятного... Вот я и учусь, мне удобнее учится на примерах, чем просто книгу читать.
Буду сейчас разбиратся на примере ваших кодов.
Всем спасибо! Отдельное спасибо _Bill и GetSmart.
Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.

smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 09:16
Сообщение #18


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.

Конечно. Если у Вас есть эти 9 кодов. Вы привели только 6 байт. Главное не запутаться относительно чего сравнивать эти 6 или 9 байт.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 09:56
Сообщение #19


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

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



11E6CAC00701 - это 9 кодов, строка printf("%-X",rom_codes[i][j]); выводит их в таком виде, то есть опускает незначащие нули, в нормальном виде выглядит так:
0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
otrog
сообщение May 26 2006, 10:05
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(_Bill @ May 26 2006, 13:06) *
smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики

a14.gif Сам постоянно пользуюсь "//" а "/*" и "*/" по возможности убираю из немоих исходников.
А в DEC, судя по всему, работают люди от искусства - все бы так строили свои процессоры (это я про систему команд PDP-11) wink.gif .

Цитата(Pyku_He_oTTyda @ May 26 2006, 13:56) *
11E6CAC00701 - это 9 кодов, строка printf("%-X",rom_codes[i][j]); выводит их в таком виде, то есть опускает незначащие нули, в нормальном виде выглядит так:
0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01

Что еще за незначащие нули? По логике 11E6CAC00701 это
0x11, 0xE6, 0xCA, 0xC0, 0x07, 0x01.
Т.е. 6 байт(кодов). А незначащих нулей в данных нет smile.gif . Любой ноль что-нибудь да значит wink.gif .


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 10:14
Сообщение #21


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

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



01 равен 1 и в двоичной, и в десятичной, и в шестнадцатиричной


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
otrog
сообщение May 26 2006, 10:31
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



А дошло! У Вас изначально было "0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01",
А printf("%-X",rom_codes[i][j]); выдал "11E6CAC00701". Так? А я подумал, что наоборот - извиняйте blush.gif .


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 12:27
Сообщение #23


Гуру
******

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



Цитата(_Bill @ May 26 2006, 12:06) *
smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики

B.W.Kernighan, R.Pike "The Practice of Programming"
С моими размышлениями по выработке стиля совпало очень много, по этому :-)
может и понравилась очень :-)
Русский перевод ~ в 2000 году тоже был.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 26 2006, 12:41
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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
defunct
сообщение May 26 2006, 13:39
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Код
#define FALSE 0
#define TRUE 1

char Match(char __flash *pattern, char *str, char size)
{
  for(char i=0; i < size; i++){
     if (pattern[i] != str[i])
         return FALSE;
  }
  return TRUE;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 13:44
Сообщение #28


Гуру
******

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



Цитата(defunct @ May 26 2006, 16:39) *
Код
     if (pattern[i] != str[size])
}

Что это было?

Да и зачем было заменять естественные для 'C' указатели?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 13:53
Сообщение #29


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



2 prottoss
Можно и по-вашему. Иногда так бывает удобнее. Но со сложением разности Вы конечно сглючили. Как уже сказали лучше объединять через OR. В самом крайнем случае сумму объявить как INT, а разность байт специально обрезать до CHAR. Но всё-равно OR лучше.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2006, 13:55
Сообщение #30


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zltigo @ May 26 2006, 16:44) *
Цитата(defunct @ May 26 2006, 16:39) *

Код
     if (pattern[i] != str[size])
}

Что это было?


Опечатка?

Цитата
Да и зачем было заменять естественные для 'C' указатели?

только для наглядности.
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 26 2006, 16:51
Сообщение #31


Гуру
******

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



Цитата(GetSmart @ May 26 2006, 21:53) *
2 prottoss
Можно и по-вашему. Иногда так бывает удобнее. Но со сложением разности Вы конечно сглючили. Как уже сказали лучше объединять через OR. В самом крайнем случае сумму объявить как INT, а разность байт специально обрезать до CHAR. Но всё-равно OR лучше.




Согласен, сглючил. Конечно по OR !



Цитата(zltigo @ May 26 2006, 21:39) *
Цитата(_Bill @ May 26 2006, 16:06) *

Вычитание не всегда даст корректный результат.

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






Я не говорил, что код быстрый, я говорил, что он стабильный по времени, т.е. всегда выполняется одинаковое количество тактов МК, что иногда не маловажно)


--------------------
Go to the top of the page
 
+Quote Post
ps1x
сообщение May 26 2006, 17:29
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



bb-offtopic.gif

2 Pyku_He_oTTyda

Раз уж такая тема, Вы случаем не знаете как симулировать саму таблетку? (код на С, желательно CVAVR)
bb-offtopic.gif
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 29 2006, 04:44
Сообщение #33


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

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



Цитата
unsigned char my_code[6] = {0x01,0x07,0xc0,0xca,0xe6,0x11};

for (j=0;j<9;j++)
{
if (memcmp(rom_codes[j][1], my_code, sizeof(my_code))==0) {
// выполнить что-то и выйти из цикла
break;
}
}



Сделал пока так, работаетsmile.gif
С другим приведенным кодом буду разбиратся, я еще новичек.
Эмулировать не пробовал, так как не было необходимости. Дома есть описание эмулятора на асм 51 семейства и на PICе. Могу конечно вам скинуть, но ссылки на это есть в этом форуме и вы наверное их видели.
В любом случае, алгоритм открытый, а программных наработок нет у меня.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post

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

 


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


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