Сравнение двух массивов.

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Сравнение двух массивов.

Сообщение redcat » 02 фев 2009, 02:34

Чтото я не понимаю... тупой наверное...

Нарисуйте плиз другой вариант данной функции... тоже без проверок, чтоб как можно меньше переменных использовалось.
Аватара пользователя
redcat
 
Сообщения: 26
Зарегистрирован: 27 янв 2009, 23:39
Откуда: K-Jarve, Estonia
прог. языки: PHP, C.
ФИО: Alex Po

Re: Сравнение двух массивов.

Сообщение Vooon » 02 фев 2009, 02:36

redcat писал(а):Так иначе не будет перебора массива по символам, и while зациклится... Если я всё правильно понял...


Невнимательно читаешь, и невнимательно работаешь с указателями.
Указатели не простят.

А если понятней: ты инкреметируешь первый символ, а не указатель.

ПС: форум не злой, просто мы настойчиво рекомендуем не терять время на написание своего libc (без бж и ш)

Добавлено спустя 1 минуту 37 секунд:
zubr писал(а):инкремент раньше разыменовывания сработал.


Забыл об этом, однако парсер сломало :)
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Сравнение двух массивов.

Сообщение Сергей » 02 фев 2009, 02:45

redcat писал(а):1 - заведомо извесно, что сравниваемые строки не будут пустыми;
2 - Эта функции будет работать быстрее, займёт меньше процессорного времени и памяти (опять-же из-за отсутствия проверки)

Самый большие и глупые ЗАБЛУЖДЕНИЯ, уж извини.

Добавлено спустя 7 минут 42 секунды:
Эх, молодежжж, вот смотрите и учитесь. Взял откудато из инета, еще добавил просто проверку вначале

Код: Выделить всё
int my_strcmp( const char* s1, const char *s2 )
{
    if( !s1 || !s2 )
        return 0;

    while( *s1 == *s2++ )
        if( *s1++ == 0 )
            return 0;

    return ( *( const unsigned char * )s1 - *( const unsigned char * )( s2 - 1 ) );
}
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: Сравнение двух массивов.

Сообщение redcat » 02 фев 2009, 03:03

ООО Спасибо вам великие мастера!!! Не принимайте меня в серьёз! ЫЫЫЫ


Vooon писал(а):Невнимательно читаешь, и невнимательно работаешь с указателями.
Указатели не простят.

А если понятней: ты инкреметируешь первый символ, а не указатель.



char array[] = "AbCd";
char *s;
*s = &array[];

т.е. при *s++ *s равно 'B' , а не 'b' ????
помоему при *s++ я указываю на текущий адрес в котором записан символ 'B' (предположим 0хАА) и инкриминирую адрес, послечего указатель указывает на адрес в котором содержится 'b' (теперь 0хАВ)

Извиняюсь за возможно кривое обьяснение...

...да, и в таком случае(...ты инкреметируешь первый символ, а не указатель) моя функция не увидит разницу между строками "OK" и "OZ" т.к. мы увеличим первый символ каждой строки на один и получим 'P' Но это не так, и функция фунцыклирует, как говорится.
Аватара пользователя
redcat
 
Сообщения: 26
Зарегистрирован: 27 янв 2009, 23:39
Откуда: K-Jarve, Estonia
прог. языки: PHP, C.
ФИО: Alex Po

Re: Сравнение двух массивов.

Сообщение Vooon » 02 фев 2009, 03:20

Инкремент работает раньше, чем обращение по адресу.
Из-за этого твой вариант работает. Но при беглом осмотре запись *p++; заставляет подумать о *p+1;

Вот тебе маленький тест:
Код: Выделить всё
vovan@vovan-book:/tmp$ cat test.c
#include <stdio.h>

int main()
{
        char a[]="array";
        char * p;
        char c;

        p=a;

        c = *p;
        printf("c = '%c'\n", c);

        c = *p++;
        printf("c = '%c'\n", c);

        c = *p++;
        printf("c = '%c'\n", c);

        return 0;
}
vovan@vovan-book:/tmp$ gcc test.c
vovan@vovan-book:/tmp$ ./a.out
c = 'a'
c = 'a'
c = 'r'
vovan@vovan-book:/tmp$
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Сравнение двух массивов.

Сообщение redcat » 02 фев 2009, 03:44

Vooon писал(а):Инкремент работает раньше, чем обращение по адресу.
Из-за этого твой вариант работает. Но при беглом осмотре запись *p++; заставляет подумать о *p+1;


ХМ... оочень согласен по поводу того, что *p++; заставляет подумать о *p+1;
но в своей функции сравнения я не случайно инкремент делал....

Вот кстати немного модернизировал -
(я понимаю что изобретаю велосипед, но всё-же так нагляднее и понятнее для новичка)

Код: Выделить всё
int StrCompare(const char *str1,const char *str2){
        if(!*str1 || !*str2)return 0;
        while(*str1){
          if(*str1++!=*str2++)return 0;
        }
   return 1;
}
Аватара пользователя
redcat
 
Сообщения: 26
Зарегистрирован: 27 янв 2009, 23:39
Откуда: K-Jarve, Estonia
прог. языки: PHP, C.
ФИО: Alex Po

Re: Сравнение двух массивов.

Сообщение blindman » 02 фев 2009, 05:40

Совет: не надо пытаться все записать в одну строку. Проще читать, меньше задумываться над приоритетами

Код: Выделить всё
if (*str1 != *str2) {
    return 0;
}
str1++; str2++;


Компилятор сгенерирует абсолютно такой же машинный код, зато куда понятнее, что делаем, меньше возможностей допустить ошибку.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Сравнение двух массивов.

Сообщение redcat » 03 фев 2009, 13:00

Меня это не смущает.)))
Аватара пользователя
redcat
 
Сообщения: 26
Зарегистрирован: 27 янв 2009, 23:39
Откуда: K-Jarve, Estonia
прог. языки: PHP, C.
ФИО: Alex Po

Пред.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron