roboforum.ru

Технический форум по робототехнике.

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

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

redcat » 02 фев 2009, 02:34

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

Нарисуйте плиз другой вариант данной функции... тоже без проверок, чтоб как можно меньше переменных использовалось.

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

Vooon » 02 фев 2009, 02:36

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


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

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

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

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


Забыл об этом, однако парсер сломало :)

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 ) );
}

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' Но это не так, и функция фунцыклирует, как говорится.

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$

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;
}

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

blindman » 02 фев 2009, 05:40

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

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


Компилятор сгенерирует абсолютно такой же машинный код, зато куда понятнее, что делаем, меньше возможностей допустить ошибку.

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

redcat » 03 фев 2009, 13:00

Меня это не смущает.)))


Rambler\'s Top100 Mail.ru counter