HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #2661  
Старый 16.07.2018, 23:29
SR_team
Флудер
Регистрация: 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.
 
Ответить с цитированием

  #2662  
Старый 16.07.2018, 23:46
Roger571
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами: 5689694

Репутация: 68
По умолчанию

Цитата:
Сообщение от SR_team  

Блед, хватит страдать - Бери STL. А если хочется "easyRegex", то бери SRStrings или целый Qt.
Да я могу уже взять нормальные решения, но я хочу понять, в чем я конкретно тут проебался.

Просто для себя понять почему вот так случается, что через cout объекты доступны, а любое взаимодействие - краш
 
Ответить с цитированием

  #2663  
Старый 17.07.2018, 03:01
san0
Постоянный
Регистрация: 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)).
 
Ответить с цитированием

  #2664  
Старый 17.07.2018, 06:44
-raymond-
Участник форума
Регистрация: 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
;
}
}
 
Ответить с цитированием

  #2665  
Старый 17.07.2018, 09:19
Roger571
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами: 5689694

Репутация: 68
По умолчанию

Цитата:
Сообщение от san0  

Мне кажется, что проблема заключается в том, что std::string sString был инициализирован с помощью конструктора копирования, и его цикл жизни был только в пределеах функции easyRegex()....
Благодарю за пояснение, полезно смотреть исходники буста. Правильно ли понимаю, что результаты в smatch являются указателем на объект в котором осуществляется поиск?
 
Ответить с цитированием

  #2666  
Старый 17.07.2018, 10:43
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Цитата:
Сообщение от raymondique  

крашится игра когда ввожу /skladoff
Слипы нельзя юзать в командах и коллбеках.

Цитата:
Сообщение от Roger571  

Хотелось бы разобраться, что же все-таки не так
Код:





Код:
sResults.str(i).c_str() замени на sResults[i].str().c_str()


Цитата:
Сообщение от Спойлер  




 
Ответить с цитированием

  #2667  
Старый 17.07.2018, 10:52
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Цитата:
Сообщение от Roger571  

я хочу понять, в чем я конкретно тут проебался.
в выборе boost.

Цитата:
Сообщение от san0  

Так в STL часто переносят то, что хорошо показало себя в boost
Вот именно. На кой черт тащить буст, который только замедлит компиляцию и увеличит размер бинаря?
 
Ответить с цитированием

  #2668  
Старый 17.07.2018, 11:07
Roger571
Познающий
Регистрация: 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
 
Ответить с цитированием

  #2669  
Старый 17.07.2018, 11:36
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Цитата:
Сообщение от Roger571  

Дело в том, что я компилю VS2008 и в STL еще не ввели regex.
Дадада, но на это есть определенные причины
Лицензионная винда или железо?
 
Ответить с цитированием

  #2670  
Старый 17.07.2018, 17:14
CarLCas
Участник форума
Регистрация: 12.07.2013
Сообщений: 161
С нами: 6755146

Репутация: 78
По умолчанию

Цитата:
Сообщение от Roger571  

Дело в том, что я компилю VS2008 и в STL еще не ввели regex.
Дадада, но на это есть определенные причины
Там есть tr1, в котором есть регулярные выражения если я не ошибаюсь.
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Внести депозит

Введите сумму USDT:

Принимается только USDT TRC20. Fake/Flash USDT не засчитывается.

×

Вывести депозит

Сумма USDT:

Ваш USDT TRC20 кошелек:

Заявка будет отправлена администратору.