Функции по работе со строками
Запись от Nexi99 размещена 03.06.2021 в 01:04
Показов 4182
Комментарии 4
|
Некоторые функции описаны по причине того что могут встречаться в моих темах, чтобы не подумали что взял функцию из воздуха ну а также будет возможность проверить исправность работы кода выставленного там, просьба не судите строго. Макросы для сокращения текста кода смотрите здесь https://www.cyberforum.ru/blog... g7146.html
cmd_ соединяет несколько строк из 2ого массива comand в массив str и получается одна длинная строка. Сама функция по большей степени процедурная, но он возвращает общую длину строки. Пример выложу позже.Функция для поиска символа в строке, будут разные модификации пока выставляю что есть. Требование библиотека по ссылке выше.
str строка. size длина строки, указывайте диапазон если просматривается не вся строка, в противном случае может быть выход за пределы массива потому что с++ не контролирует массивы, да и к тому же вы можете поместить несколько строк в одну большую, т.е. контроль строки нужен в любом случае. sm смещение, если оно у вас есть можете сместить строку на несколько байт. sh -в какую сторону крутить цикл 0-в низ/1-в верх.Возвращаемое значение смещение до искомого символа включительно. Максимальная длина строки не может быть больше ter[0]/2-1, т.е. максимального значения char(127). Пример использования функции.
brave.exe. Поиск производится с конца строки. В качестве критерия у нас отсекающий символ, в с++ символ \ записывается как '\\'. Стартовым символом будет e, т.е. функция работает с учётом 0го индекса. Проходим строку до нужного символа. Далее если изменить значение на единицу то можем записать название строки в отдельный буфер.Функции по сравниванию байт(опциональны по типам). Данный модуль изначально собирался через класс на данный момент он доработан, но будут и другие изменения. Функции описанные ниже не работают со строками, несмотря на заголовок в блоге, они воспринимают всё как байтовую последовательность. Требования статическая библиотека Nexi99_ ссылка выше, а также вызов и инициализация функции Maks_Znah(будет в архиве вместе с примером кода).Есть класс ComparisonBytes(переводится Сравнение байт), находится в заголовочном файле klas. Функции.
Описание аргументов. size размер массиваtip тип массива. Укажите любое значение от 1го до 8и. Если вы используете нестандартные типы: например по 3 5 6 байт, то ваш массив должен быть упакован так. К примеру ваше значение занимает 3 байта, но записано в int, то оно будет воспринято как 4 байтовое, т.е. вы должны правильно упаковать данные.... 3ий и 4ый элементы могут быть любого типа и должны под собой хранить указатель.Пример использования функции смотрите в архиве, файл называется ТестированиеКлассаStroka_lib.Как работают функции и возвращаемые ими значения. Функции имеют общие модули инициализации. Первые 2 логические. Если есть искажение и байты не равны то возвращается 0 и происходит выход из обоих функций. Функция ComparisonBytLog1 получает аргументы и сохраняет все данные внутри объекта класса. Функция ComparisonBytLog2 делает то же самое используя готовые данные, тем самым пропускаются проверки и расчёты. Если байты в массиве меняются то функции реагируют по разному т.е. как и должно быть.Последние 2 возвращают индекс в котором произошло искажение, если с массивом всё нормально и все байты равны то возвращается size. В качестве альтернативы можно использовать memcmp. Эта функция работает в 1.5-3 раза быстрее(последняя сборка на Release поэтому результат уже будет лучше т.к. статья уже правится не 1ый раз) моих из редка медленнее моей.
ComparByte переключён на 2ой объект. Чтобы переключить его на 1ый базовый объект нужно вызвать StrokaPoint0(). Чтобы переключить указатель на другой объект достаточно обратиться к методу класса.Т.е. как вы уже поняли вам не нужно постоянно использовать методы класса, после создания объекта класса можно использовать уже функции. Методы класса имеют похожие названия с функциями описывать их нет смысла.
Функция StrPointNew() выделяет память и возвращает целое число и как вы уже догадываетесь вам придётся вручную следить за таким объектом.Функция StrPointDynamic(StrPointNew()(это будет переменная)) сохранит в базовый указатель ваш созданный объект чтобы обеспечить удалённое управление.Функция StrPointDelete(StrPointNew()(это будет переменная)) разрушит объект и доступ к участку будет потерян.Если название методов класса совпадает с названиями функций то их можно использовать, все остальные элементы класса выполняют служебную функцию и не могут быть вызваны для использования. | ||||||||||||||||||||||||||||||||||||||||
Размещено в Строки
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 4
Комментарии
-
Функции стандартной библиотеки компилятор имеет право реализовать не так, как обычные функции, или вообще не как функции.
Простые стандартные функцииstrcpy(),memcmp()в неучебные неотладочные компиляторы обычно встроены (intrinsic). Т.е. компилятор вставляет на место вызова функции код, результат работы которого совпадет с результатом вызова библиотечной функции.
Так, например, gcc для x64 заменил
на что-то вродеC 1 2 3 4
#include <memory.h> int square(int num) { return memcmp( "abra","q'adabra", 4); }
https://godbolt.org/z/h4b6Mx5jYC 1 2 3
int square (int num) { return _eax |= -1; }
Запись от politoto размещена 03.06.2021 в 14:34
-
Ну вот я про это и подумал. Возможно функцию
Сообщение от politoto
strcpyя и перееду а вотmemcmpне удалось. Интересно что там за алгоритмы скрываются. Что можно почитать по этому поводу? Я не много урывками видел какие-то записи на форумах, но в целом про это ничего не знаю.Запись от Nexi99 размещена 03.06.2021 в 18:55
-
Почитал я про Intrinsic функции, я частично прав там и в правду функция разработчиков заранее может определить где произошло изменение и не тратить время на обработку массива мои же функции рассчитаны на спонтанные данные. так что с точки зрения тактики мозг развит у меня хорошо а вот с точки зрения знаний и доступа конечно нет. Ну знания конечно приходят с опытом а вот доступ со временем могут ограничить в новых ОС и можно бесконечно пытаться ломать это дело.Запись от Nexi99 размещена 03.06.2021 в 19:08
-
Intrinsic функцииэто функции идея которых составлены людьми а реализация пишется машинами. Т.е. эти инструкции порождают машины а не люди поэтому с ними тягаться невозможно если не знать их назначение. Машины могут подобрать всё: и буфера и типы данных и доступ к данным, вот так вот. Так что в целом все мои выводы описанные выше верны, а функциюmemcmpя тестировал системно, компилятор заранее мог знать что там изменена 1 ячейка, потому что если данные поданы спонтанно то без перебора цикла тут не обойтись.Запись от Nexi99 размещена 03.06.2021 в 22:03


