purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 4:52 pm

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




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

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

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

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

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


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

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


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

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


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Хотел сделать так
Код:
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
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Это ведь можно сделать проще
Код:
1
2
s.s="Тест"
Debug Left(s, 2)


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


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

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 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
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Благодаря попытке осмыслить по полочкам работы с адресами и указателями и найдя пример в справке "Указатели", который я всегда ищу в разделе "Структуры", удалось переписать пример так как я хотел, то есть не делая копию переменной строки использовать её адрес. То есть передал адрес, в процедуре передал адрес указателя создав структуру из него, но не копируя данные, и уже потом работая с элементом структуры.

Код:
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
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 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
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик писал(а):
А чем моя процедура неустроила? :roll:
Я не разбираюсь в asm, вдруг несовместимость x86/x64 или ещё что.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 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
 
 



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

Зарегистрирован: Вс сен 09, 2012 9:25 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Что-то как-то наворочено вы тут напридумывали.
Вот как обрезать строку так, чтобы получить подстроку ограниченную скобками:
Debug ReverseString( StringField( ReverseString( StringField( "текст со скобками (нужный нам текст) что-то там дальше продолжается", 1, ")" ) ),1,"(" ) )

PS: как раз недавно пришлось решать сходную задачу выделения подстроки из строки текста.


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
BigElectricCat писал(а):
Что-то как-то наворочено вы тут напридумывали.
Вот как обрезать строку так, чтобы получить подстроку ограниченную скобками:
Debug ReverseString( StringField( ReverseString( StringField( "текст со скобками (нужный нам текст) что-то там дальше продолжается", 1, ")" ) ),1,"(" ) )

PS: как раз недавно пришлось решать сходную задачу выделения подстроки из строки текста.


То есть автор темы задал вопрос не соответствующий вашему? А может вы задаёте вопрос не соответствующий теме и надо создать новую тему с вашим вопросом? Проблема то не в обрезке в поиске скобок, обрезка у вас седьмая вода на киселе. Ваша задача решается просто - поиск закрывающей скобки методом подсчёта открытых и закрытых скобок. Сначала ищем кавычки и временно заменяем скобки внутри кавычек левыми символами, например пробелом, далее делаем подсчёт скобок по тексту, если после открывающей скобки идет открывающая то делаем инкремент +1 в некую переменную, когда находим закрывающую, то делаем -1 в переменную, как только переменная равна 0, то найдена парная скобка и записываются позиции открытой и закрывающей скобки. А обрезка = Mid.


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

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 950
Благодарил (а): 103 раз.
Поблагодарили: 32 раз.
Пункты репутации: 5
если только пара скобок
выдрал из проги, если скобок будет больше, сюда не дойдёт, входящая строка специфична и заведомо короткая, так что всё остальное пробрасывается
потратил прорву времени на поиск готового решения вырезки по двум индексам, не нашёл
если нужна скорость, лезем напрямки в память или кланяемся Сергейчик чтобы он на асме сделал :D
Код:
1
2
3
4
5
6
7
 
rn=FindString(s, "(")
gn=FindString(s, ")")
If rn>0 Or gn>0 Or rn<gn; если есть обе скобки и открывающая перед закрывающей
s=Mid(s, rn+1, gn-rn-1); вырезаем между скобок
endif
 



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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
newJS писал(а):
если только пара скобок
выдрал из проги, если скобок будет больше, сюда не дойдёт, входящая строка специфична и заведомо короткая, так что всё остальное пробрасывается
потратил прорву времени на поиск готового решения вырезки по двум индексам, не нашёл
если нужна скорость, лезем напрямки в память или кланяемся Сергейчик чтобы он на асме сделал :D
Код:
1
2
3
4
5
6
7
 
rn=FindString(s, "(")
gn=FindString(s, ")")
If rn>0 Or gn>0 Or rn<gn; если есть обе скобки и открывающая перед закрывающей
s=Mid(s, rn+1, gn-rn-1); вырезаем между скобок
endif
 


Можно так к примеру. :roll:
Код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
s.s="..........(Привет пурик)=========="
 
Procedure.i PoiskSimvola_UTF16(*s,*c);с проверкой завершающего нуля,возврат адрес памяти
!PUSH ecx
!mov eax,DWORD PTR esp+8
!mov ecx,DWORD PTR esp+12
!mov word cx,[ecx]
!hut126v:
!CMP word ptr eax,cx
!Je rr126v
!CMP word ptr eax,0h
!Je bxzv
!add eax,4
!CMP word ptr eax-2,cx
!Jz ht126v
!CMP word ptr eax-2,0h
!Jnz hut126v
!jmp bxzv
!ht126v:
!sub eax,2
!rr126v:
!pop ecx
!retn 8
!bxzv:
!xor eax,eax
!pop ecx
!retn 8
EndProcedure
 
 
 
 
*adres=PoiskSimvola_UTF16(@s,@"(")
*adres2=PoiskSimvola_UTF16(*adres,@")")
Debug PeekS(*adres+2,(*adres2-*adres)/2-1,#PB_Unicode)
 
 
 
;2вариант
Structure podstroka
  adres.i
  kolsimvolov.i
EndStructure
Global podstroka.podstroka
Procedure.i PoiskmejduSkobok_UTF16(*s,*c)
!PUSH ecx
!mov eax,DWORD PTR esp+8
!mov ecx,DWORD PTR esp+12
;
!hut126v2:
!CMP word ptr eax,'('
!Je rr126v2
!CMP word ptr eax,0h
!Je bxzv2
!add eax,4
!CMP word ptr eax-2,'('
!Jz ht126v2
!CMP word ptr eax-2,0h
!Jnz hut126v2
!jmp bxzv2
!ht126v2:
!sub eax,2
!rr126v2:
!add dword eax,2
!mov dword [ecx],eax
;
!hut126v22:
!CMP word ptr eax,')'
!Je rr126v22
!CMP word ptr eax,0h
!Je bxzv2
!add eax,4
!CMP word ptr eax-2,')'
!Jz ht126v22
!CMP word ptr eax-2,0h
!Jnz hut126v22
!jmp bxzv2
!ht126v22:
!sub eax,2
!rr126v22:
!SUB eax,[ecx]
!Sar eax,1
!mov dword [ecx+4],eax
;
!pop ecx
!retn 8
!bxzv2:
!xor eax,eax
!pop ecx
!retn 8
EndProcedure
 
 
If PoiskmejduSkobok_UTF16(@s,@podstroka)
 Debug PeekS(podstroka\adres,podstroka\kolsimvolov,#PB_Unicode)
EndIf
 


Или так
Код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
s.s="..........(Привет пурик)========..(Привет пурик2)==========="
;3вариант
Global stroka.s
Global adrespoiska.i
Procedure.i PoiskmejduSkobok(*s)
!mov eax,DWORD PTR esp+4
;
!hut126v2:
!CMP word ptr eax,'('
!Je rr126v2
!CMP word ptr eax,0h
!Je bxzv2
!add eax,4
!CMP word ptr eax-2,'('
!Jz ht126v2
!CMP word ptr eax-2,0h
!Jnz hut126v2
!jmp bxzv2
!ht126v2:
!sub eax,2
!rr126v2:
!add dword eax,2
!mov dword [v_stroka],eax
;
!hut126v22:
!CMP word ptr eax,')'
!Je rr126v22
!CMP word ptr eax,0h
!Je bxzv2
!add eax,4
!CMP word ptr eax-2,')'
!Jz ht126v22
!CMP word ptr eax-2,0h
!Jnz hut126v22
!jmp bxzv2
!ht126v22:
!sub eax,2
!rr126v22:
 
!mov word [eax],0
;
!retn 4
!bxzv2:
!xor eax,eax
!retn 4
EndProcedure
 
Macro PoiskmejduSkobok_UTF16(s,stroka2)
PoiskmejduSkobok(s)
!cmp dword eax,0  
!je @F
!mov dword [v_adrespoiska],eax
!push eax
!
Debug stroka
  stroka2=stroka
!pop eax
!mov word [eax],')'
!@@:
EndMacro
 
 
Global stroca2.s
 
PoiskmejduSkobok_UTF16(@s,stroca2)
 
Debug stroca2
Debug s
 
If adrespoiska<>0
 PoiskmejduSkobok_UTF16(adrespoiska,stroca2)
EndIf
 
Debug stroca2
Debug s
 



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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 4


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

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