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

 
 
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

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

 


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


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