 |
|

16.07.2018, 23:29
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от Roger571
Пытаюсь разобраться, как работать с boost::regex и в процессе захотелось написать более удобную обертку под свои нужды. Но есть одно но, никак не могу понять почему объект boost::smatch невалидно передается по ссылке.
Вот сам код:
Сообщение от Спойлер
C++:
[CODE]
#include "main.h"
bool
easyRegex
(
std
::
string sString
,
boost
::
regex rRegex
,
boost
::
smatch
&
sResults
,
int
iArg
,
char
*
szRegexName
)
{
if
(
boost
::
regex_search
(
sString
,
sResults
,
rRegex
)
)
{
if
(
sResults
.
size
(
)
А вот результат его выполнения:
Сообщение от Спойлер
C++:
Код:
[
easyRegex
]
Pointer
:
03901658
[
easyRegex
]
Size
:
5
[
easyRegex
]
[
1
]
24
[
easyRegex
]
[
2
]
string
[
easyRegex
]
[
3
]
3452
[
easyRegex
]
[
4
]
43556
aad
[
main
]
Pointer
:
03901658
[
main
]
Size
:
5
И далее идет краш "Expression: string iterators incompatible".
Хотелось бы разобраться, что же все-таки не так
Блед, хватит страдать - Бери STL. А если хочется "easyRegex", то бери SRStrings или целый Qt.
|
|
|

16.07.2018, 23:46
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от SR_team
Блед, хватит страдать - Бери STL. А если хочется "easyRegex", то бери SRStrings или целый Qt.
Да я могу уже взять нормальные решения, но я хочу понять, в чем я конкретно тут проебался.
Просто для себя понять почему вот так случается, что через cout объекты доступны, а любое взаимодействие - краш
|
|
|

17.07.2018, 03:01
|
|
Постоянный
Регистрация: 15.12.2013
Сообщений: 412
С нами:
6530249
Репутация:
133
|
|
Сообщение от Roger571
Просто для себя понять почему вот так случается
Мне кажется, что проблема заключается в том, что std::string sString был инициализирован с помощью конструктора копирования, и его цикл жизни был только в пределеах функции easyRegex().
Операция regex_search была выполнена над строкой, которая, по сути, не имеет ничего общего с sTest (незавимая копия), но к ее элементам все равно хотят достучаться в тот момент, когда их существование явно не гарантировано.
К слову говоря, полученый результат мог бы быть и другим. Точнее, здесь все аналогично тому, как пытаться получить доступ к данным, расположеным в освобожденной памяти - иногда это, возможно, и работает.
В общем, вот этот вектор boostorg/regex(https://github.com/boostorg/regex/blob/5d990fd751a8c149dd47fbaf24eaaffd1bde3bd5/include/boost/regex/v4/match_results.hpp#L577) в результате и ломается
Подводя итоги, следует передать строку тоже по ссылке bool easyRegex(std::string& sString, ... etc ...
Сообщение от SR_team
Бери STL
Так в STL часто переносят то, что хорошо показало себя в boost (конечно с фиксами всякими (напр. filesystem)).
|
|
|

17.07.2018, 06:44
|
|
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами:
4423953
Репутация:
68
|
|
крашится игра когда ввожу /skladoff
C++:
Код:
bool
sliv
;
int
etap
;
void
call_main_func
(
)
{
while
(
sliv
==
true
)
{
stLocalPlayer
*
player
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
;
int
PlayerID
;
PlayerID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
if
(
etap
==
0
)
{
player
->
Say
(
"/getgun 300"
)
;
etap
=
1
;
Sleep
(
1000
)
;
}
else
if
(
etap
==
1
)
{
char
txtfmt
[
20
]
;
sprintf
(
txtfmt
,
"/sellgun m4 100 4 %d"
,
PlayerID
)
;
player
->
Say
(
txtfmt
)
;
etap
=
0
;
Sleep
(
1000
)
;
}
}
}
bool
CALLBACK
inRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
uint32_t
len
,
color
;
char
msg
[
144
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
msg
,
len
)
;
msg
[
len
]
=
'\0'
;
if
(
strstr
(
msg
,
"Не флуди"
)
)
return
false
;
}
return
true
;
}
void
CALLBACK
sliv_activate
(
std
::
string param
)
{
if
(
sliv
==
true
)
sliv
=
false
;
else
{
call_main_func
(
)
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
||
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
||
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
inRPC
)
;
SF
->
getSAMP
(
)
->
registerChatCommand
(
"skladoff"
,
sliv_activate
)
;
init
=
true
;
}
}
|
|
|

17.07.2018, 09:19
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от san0
Мне кажется, что проблема заключается в том, что std::string sString был инициализирован с помощью конструктора копирования, и его цикл жизни был только в пределеах функции easyRegex()....
Благодарю за пояснение, полезно смотреть исходники буста. Правильно ли понимаю, что результаты в smatch являются указателем на объект в котором осуществляется поиск?
|
|
|

17.07.2018, 10:43
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от raymondique
крашится игра когда ввожу /skladoff
Слипы нельзя юзать в командах и коллбеках.
Сообщение от Roger571
Хотелось бы разобраться, что же все-таки не так
Код:
Код:
sResults.str(i).c_str() замени на sResults[i].str().c_str()
|
|
|

17.07.2018, 10:52
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от Roger571
я хочу понять, в чем я конкретно тут проебался.
в выборе boost.
Сообщение от san0
Так в STL часто переносят то, что хорошо показало себя в boost
Вот именно. На кой черт тащить буст, который только замедлит компиляцию и увеличит размер бинаря?
|
|
|

17.07.2018, 11:07
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от SR_team
в выборе boost.
Вот именно. На кой черт тащить буст, который только замедлит компиляцию и увеличит размер бинаря?
Дело в том, что я компилю VS2008 и в STL еще не ввели regex.
Дадада, но на это есть определенные причины
Сообщение от Dark_Knight
Слипы нельзя юзать в командах и коллбеках.
Код:
Код:
sResults.str(i).c_str() замени на sResults[i].str().c_str()
К слову, вчера ночью пробовал и результат не изменился, но проблема и мой вопрос исчерпан благодаря san0
|
|
|

17.07.2018, 11:36
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Roger571
Дело в том, что я компилю VS2008 и в STL еще не ввели regex.
Дадада, но на это есть определенные причины
Лицензионная винда или железо?
|
|
|

17.07.2018, 17:14
|
|
Участник форума
Регистрация: 12.07.2013
Сообщений: 161
С нами:
6755146
Репутация:
78
|
|
Сообщение от Roger571
Дело в том, что я компилю VS2008 и в STL еще не ввели regex.
Дадада, но на это есть определенные причины
Там есть tr1, в котором есть регулярные выражения если я не ошибаюсь.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|