purebasic.info

PureBasic forum
Текущее время: Вт фев 25, 2020 4:38 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Ср мар 06, 2019 1:41 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6597
Благодарил (а): 32 раз.
Поблагодарили: 228 раз.
Пункты репутации: 59
AZJIO писал(а):
И в чём смысл их совать в шаблоны? Разве не проще поиском найти? Шаблоны поиск не поддерживает.

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

А кодопомойка лежит в отдельной папке, вернее даже в разных, в зависимости от версии Пурика.
И поиск производится при помощи Total Commander, который это делает очень быстро, и по любым критериям.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Ср мар 06, 2019 2:24 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Недавно мы переводили winapi_library и там имена файлов более нормальные. Я сделал импорт в шаблоны. Но на скорую руку с двууровневым вложением. Я хотел сначала сделать многоуровневый вариант, я когда-то делал импорт в трейвью и экспорт трейвью в текст, но проблема в которой я завяз в тех функциях нет завершения каталога CloseDirectory и попытка его туда встроить вычисляя текущий уровень и момент закрытия привела в тупик, я бросил и сделал двухуровневый чтобы захватить winapi_library и забыть про мозговой напряг. В общем при желании можно сделать папку скриптов и легко сделать импорт.


Вложения:
TemplatesRU.7z [135.11 KiB]
Скачиваний: 57
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Ср мар 06, 2019 9:09 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Если кому интересно, выкладываю доделанный EXE с исходником AU3 для преобразования двухуровнего каталога в шаблоны IDE PureBasic. Скрипт читает исходники в утф с бом, сохраняет в Templates.prefs утф без бом, без каких либо доработок сразу работает. Не стал добавлять чистку тегов редактора IDE. При желании можно захватить несколько код-архивов и потом их соединить в одном, но только у winapi_library размер 1 мег, у остальных то 5 то 14, в общем огромные.
До кучи я положил winapi_library так как перевёл папки и где-то 100 файлов в именах и содержимом, например в разделах Диск, Диалоги, Диалоги Запрос, Гаджет Tree, Дата и время, немного в Гаджет Editor. Планирую и дальше переводить, интересные примеры.


Вложения:
В шаблон PureBasic 2 уровня.7z [584.36 KiB]
Скачиваний: 69
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 15, 2020 12:50 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Хотел сделать так
Код:
1
2
3
4
5
6
7
Procedure.s TrimRight(*p.string, n)
        *p\s = Left(*p\s, Len(*p\s) - n)
EndProcedure
 
x.string\s="Тест"
TrimRight(@x, 2)
Debug x\s


но все строки тогда надо в структуре хранить. Хотел избавиться от выделения памяти при операциях со строками, ведь внутри функции создаётся копия переменной.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 15, 2020 2:22 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11588
Благодарил (а): 4 раз.
Поблагодарили: 486 раз.
Это ведь можно сделать проще
Код:
1
2
s.s="Тест"
Debug Left(s, 2)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 15, 2020 3:21 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Пётр писал(а):
Это ведь можно сделать проще
если слово "Тест", но если слово большим количеством букв, то результаты будут разные. Да и суть я хотел сэкономить недавно понадобилось красиво обрезать, я передал переменную (строку) в функцию/процедуру, но ведь если текст длинный то создаётся копия занимает лишнюю память, а если в цикле то ещё и тормозится копированием, а мне можно и оригинал кромсать, зачем копию создавать. Но теряется простота записи.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 15, 2020 9:51 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 941
Благодарил (а): 2 раз.
Поблагодарили: 51 раз.
Пункты репутации: 9
AZJIO писал(а):
Пётр писал(а):
Это ведь можно сделать проще
если слово "Тест", но если слово большим количеством букв, то результаты будут разные. Да и суть я хотел сэкономить недавно понадобилось красиво обрезать, я передал переменную (строку) в функцию/процедуру, но ведь если текст длинный то создаётся копия занимает лишнюю память, а если в цикле то ещё и тормозится копированием, а мне можно и оригинал кромсать, зачем копию создавать. Но теряется простота записи.

Только кромсать,можно заранее выделить объём памяти под строку после её удалить,будет всяко быстрее но можно и подругому заморочиться :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
Procedure.i TrimRight(*s,n)
!mov eax,DWORD PTR esp+4
!hut1:
!CMP word ptr eax,0h
!Je rr1
!add eax,4
!CMP word ptr eax-2,0h
!Jnz hut1
!sub eax,2
!rr1:
!cikl:
!cmp dword ptr esp+8,0
!jz ess
!sub dword ptr esp+8,1
!sub eax,2
!jmp cikl
!ess:
!mov word ptr eax,0h
!retn 8
EndProcedure
x.string\s="Тест"
TrimRight(@x\s, 2)
Debug x\s
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 22, 2020 7:56 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Благодаря попытке осмыслить по полочкам работы с адресами и указателями и найдя пример в справке "Указатели", который я всегда ищу в разделе "Структуры", удалось переписать пример так как я хотел, то есть не делая копию переменной строки использовать её адрес. То есть передал адрес, в процедуре передал адрес указателя создав структуру из него, но не копируя данные, и уже потом работая с элементом структуры.

Код:
1
2
3
4
5
6
7
8
9
10
EnableExplicit
 
Procedure.s TrimRight(*a, n)
        Protected *p.string = @*a
        *p\s = Left(*p\s, Len(*p\s) - n)
EndProcedure
 
Define x.s = "Привет"
TrimRight(@x, 2)
Debug x


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 22, 2020 9:31 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 941
Благодарил (а): 2 раз.
Поблагодарили: 51 раз.
Пункты репутации: 9
AZJIO писал(а):
Благодаря попытке осмыслить по полочкам работы с адресами и указателями и найдя пример в справке "Указатели", который я всегда ищу в разделе "Структуры", удалось переписать пример так как я хотел, то есть не делая копию переменной строки использовать её адрес. То есть передал адрес, в процедуре передал адрес указателя создав структуру из него, но не копируя данные, и уже потом работая с элементом структуры.

Код:
1
2
3
4
5
6
7
8
9
10
EnableExplicit
 
Procedure.s TrimRight(*a, n)
        Protected *p.string = @*a
        *p\s = Left(*p\s, Len(*p\s) - n)
EndProcedure
 
Define x.s = "Привет"
TrimRight(@x, 2)
Debug x


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

А чем моя процедура неустроила? :roll:
Ps:Еще и другую выложил обрезка на этапе конкатенации x.s = "Привет"
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
 
 Procedure.i TrimRight(*s,n)
!cmp dword ptr esp+8,0
!jz ess
!mov eax,DWORD PTR esp+4
!hut1:
!CMP word ptr eax,0h
!Je rr1
!add eax,4
!CMP word ptr eax-2,0h
!Jnz hut1
!sub eax,2
!rr1:
!cikl:
!sub dword eax,[esp+8]
!sub dword eax,[esp+8]
!mov word ptr eax,0h
!ess:
!retn 8
EndProcedure
x.s="ТПривет"
TrimRight(@x, 2)
Debug x
 



Последний раз редактировалось Сергейчик Сб фев 22, 2020 10:03 pm, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 22, 2020 9:39 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 522
Благодарил (а): 36 раз.
Поблагодарили: 64 раз.
Пункты репутации: 0
Сергейчик писал(а):
А чем моя процедура неустроила? :roll:
Я не разбираюсь в asm, вдруг несовместимость x86/x64 или ещё что.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Сб фев 22, 2020 11:17 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 941
Благодарил (а): 2 раз.
Поблагодарили: 51 раз.
Пункты репутации: 9
AZJIO писал(а):
Сергейчик писал(а):
А чем моя процедура неустроила? :roll:
Я не разбираюсь в asm, вдруг несовместимость x86/x64 или ещё что.

То что на асме. :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
EnableExplicit
Structure strokautf16
   simvolutf16.u
 EndStructure
 
 Global x.s="Привет ZOLO vs Puric"
 Global bufer.s=Space(1000)
Procedure concatenaciy_v_bufer_s_obrezkoi(*adresbufera,*adresstroki,n)
  Protected *adressimvolautf16.strokautf16 = *adresstroki
  If *adressimvolautf16\simvolutf16<>#Null;если строка не пустая то делаем конкатенацию
    Protected *adressimvolautf162.strokautf16 = *adresbufera
  Repeat
    *adressimvolautf162\simvolutf16=*adressimvolautf16\simvolutf16
   
   If *adressimvolautf16\simvolutf16<>#Null;если не конец строки идём дальше по символам
     *adressimvolautf16+2
     *adressimvolautf162+2
   Else
     ;дошли до конца строки
     Break
   EndIf
   ForEver
   *adressimvolautf162-n
   *adressimvolautf162-n
   *adressimvolautf162\simvolutf16=#Null
 
 EndIf
EndProcedure
Procedure TrimRight(a, n)
  Protected *adressimvolautf16.strokautf16 = a
  If Not n=0
  Repeat  
   If *adressimvolautf16\simvolutf16<>#Null;если не конец строки идём дальше по символам
     *adressimvolautf16+2
    ;Debug *adressimvolautf16\simvolutf16
   Else
     ;дошли до конца строки
     Break
   EndIf
   ForEver
   *adressimvolautf16-n
   *adressimvolautf16-n
   *adressimvolautf16\simvolutf16=#Null
 EndIf  
EndProcedure
 
 
TrimRight(@x, 2)
Debug x
concatenaciy_v_bufer_s_obrezkoi(@bufer,@x,7)
Debug bufer
 
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB