Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неправильно работает функция сравнения, Неправильно работает функция сравнения 
:(
    Опции темы
GQU
Дата 24.10.2015, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Язык PAWN
В файле записана фраза:
Бан по Нику
в кодировке utf- без BOM без пробелов и переносов строк
Почему выдает
НЕ равны...buffer1 = Бан по Нику..., buffer2 = Бан по Нику...
т.е значение в переменных одинаковые, а функция equal() работает, как будто бы значения разные, если просто взять 2 одинаковых массива(не считывать с файла в массив), то equal работает правильно, говорит, что массивы равны
Код

#include <amxmodx>
#include <amxmisc>
#define FILE "addons/amxmodx/data/tratrata.txt"
 
public bunList(id){
        buffer1[255], buffer2[255]
        buffer2 = "Бан по Нику"
        new iFiled = fopen(FILE,"rt")                                    //открываем текстовый файл для чтения и записи
        while(!feof(iFiled)){                                                 //пока не считает весь файл
                fgets(iFiled,buffer1,charsmax(buffer1))          //считываю строку файла в buffer1, charsmax() - размер массива
                if(equal(buffer1,buffer2)) {                            //если buffer1 и buffer2 равны
                        client_print(id,print_console,"Равны...buffer1 = %s..., buffer2 = %s...",buffer1,buffer2 )    //выводим сообщение
                }
                else {
                        client_print(id,print_console,"НЕ равны...buffer1 = %s..., buffer2 = %s...",buffer1,buffer2 )
                }
        }
        fclose(iFiled)
        return PLUGIN_HANDLED
}


Это сообщение отредактировал(а) GQU - 24.10.2015, 01:11
PM MAIL   Вверх
feodorv
Дата 24.10.2015, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Всё-таки, это не C, это другой язык. Поэтому Бог его знает, каковы причины такого поведения smile 


Может, equal учитывает кодировки сравниваемых строк, и если они не совпадают, то и строки не совпадают, кто знает?
Цитата(GQU @  24.10.2015,  00:47 Найти цитируемый пост)
переносов строк
Это точно проверено? Какова длина buffer1 в символах? А buffer2?


PS В документации от August, 2007 нет функций fgets, equal, client_print. Что и как они делают, неясно совершенно.
PPS В качестве теста можно записать в новый файл строку "Бан по Нику" в utf-8 и сравнить оба файла.





--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GQU
Дата 25.10.2015, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Сделал посимвольный вывод buffer2, не пойму, откуда такие цифры, хотя все врубился, эта ж таблица UTF-8, а я аски смотрю
Посимвольный вывод buffer2 = Бан по Нику
d0, 208
91, 145
d0, 208
b0, 176
d0, 208
bd, 189
20, 32
d0, 208
bf, 191
d0, 208
be, 190
20, 32
d0, 208
9d, 157
d0, 208
b8, 184
d0, 208
ba, 186
d1, 209
83, 131


А вот тут не понятно откуда берутся
Посимвольный вывод buffer1 = Бан по Нику
ffffffd0, -48
ffffff91, -111
ffffffd0, -48
ffffffb0, -80
ffffffd0, -48
ffffffbd, -67
20, 32
ffffffd0, -48
ffffffbf, -65
ffffffd0, -48
ffffffbe, -66
20, 32
ffffffd0, -48
ffffff9d, -99
ffffffd0, -48
ffffffb8, -72
ffffffd0, -48
ffffffba, -70
ffffffd1, -47
ffffff83, -125


Это сообщение отредактировал(а) GQU - 25.10.2015, 00:44
PM MAIL   Вверх
GQU
Дата 25.10.2015, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Получается символы кодируются таблицей UTF-8
Б кодируется:
в buffer2  символами do и 91 в шестнад системе, 2 байта
в buffer1 символами ffffffdo и ffffff91, 8 байт, что за бред, зачем так много

В самом файле каждый символ кодируется 2-мя байтами, кроме пробела

Это сообщение отредактировал(а) GQU - 25.10.2015, 01:25
PM MAIL   Вверх
feodorv
Дата 25.10.2015, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Может, всё же
Код
        new buffer1{255}, buffer2{255}
???

Добавлено через 2 минуты и 57 секунд
Цитата(GQU @  25.10.2015,  01:14 Найти цитируемый пост)
в buffer1 символами ffffffdo и ffffff91

Вот сразу вопрос к fgets'у. Что она делает?


Цитата(GQU @  25.10.2015,  01:14 Найти цитируемый пост)
8 байт, что за бред, зачем так много

Потому что это целочисленные значения, не символы.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GQU
Дата 25.10.2015, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

???

да new забыл
fgets считывает строку Бан по Нику из файла, т.е первую строку, еще раз вызовишь, считает вторую
Цитата

Потому что это целочисленные значения, не символы

не понимаю что то

Это сообщение отредактировал(а) GQU - 25.10.2015, 03:50
PM MAIL   Вверх
feodorv
Дата 25.10.2015, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(GQU @  25.10.2015,  03:27 Найти цитируемый пост)
fgets считывает строку Бан по Нику из файла

Нет, не просто считывает, а ещё преобразует знаковый символ в знаковый интегер. В результате там, где значения в buffer2 положительны, в buffer1 они отрицательны.


Цитата(GQU @  25.10.2015,  03:27 Найти цитируемый пост)
не понимаю что то

Массив символов в Вашем языке записывается как 
Цитата(feodorv @  25.10.2015,  03:17 Найти цитируемый пост)
buffer1{255}
, а не как
Цитата(GQU @  24.10.2015,  00:47 Найти цитируемый пост)
buffer1[255]



Цитата(GQU @  25.10.2015,  03:27 Найти цитируемый пост)
да new забыл

Дело не в new (я, честно говоря, даже не знаю, как у Вас без new работало, но если работало, то new не так важно). Дело в фигурных скобках (в отличии от квадратных).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GQU
Дата 25.10.2015, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

Дело не в new (я, честно говоря, даже не знаю, как у Вас без new работало, но если работало, то new не так важно). Дело в фигурных скобках (в отличии от квадратных)


без new не компилируется, c фигурными скобками вместо квадратных тоже

Это сообщение отредактировал(а) GQU - 25.10.2015, 04:19
PM MAIL   Вверх
feodorv
Дата 25.10.2015, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(GQU @  25.10.2015,  04:19 Найти цитируемый пост)
c фигурными скобками вместо квадратных тоже

И где затык? При вызове fgets?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GQU
Дата 25.10.2015, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

И где затык? При вызове fgets? 

да, вообще я уже решил проблему
после fgets добавить
Код

for (new i = 0; buffer[i] != EOS; i++) buffer[i] &= 0xFF

EOS что то вроде '\0' в СИ

Это сообщение отредактировал(а) GQU - 25.10.2015, 04:31
PM MAIL   Вверх
feodorv
Дата 25.10.2015, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(GQU @  25.10.2015,  04:29 Найти цитируемый пост)
да, вообще я уже решил проблему

Ну и отлично)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1330 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.