SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 21/02/2017, 09:11 PM   #71
MIASO
Big Clucker
 
MIASO's Avatar
 
Join Date: Dec 2011
Posts: 56
Reputation: 9
Default Re: Написание плагинов

После шаманства моя функция заработала нормально и на скорость это не повлияло
PHP Code:
int UpperToLower_miaso(char *str)
{
    
int len 0;
    
char ch;
    while (
true)
    {
        
ch = *str;
        if (
ch == 0) break;
        if (
ch 'A' && ch 'Z'ch += 32;
        else if (
ch 'А' && ch 'Я'ch += 32;
        else if (
ch == 'Ё'ch 184;
        *
str ch;
        
len++;
        
str++;
    }
    return 
len;

Если вместо букв написать ascii коды - работает только c латиницой, WTF
MIASO is offline   Reply With Quote
Old 21/02/2017, 09:46 PM   #72
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 437
Reputation: 22
Default Re: Написание плагинов

Попробуй при старте плагина вставить setlocale(LC_ALL, "");
Diman777 is online now   Reply With Quote
Old 21/02/2017, 10:41 PM   #73
MIASO
Big Clucker
 
MIASO's Avatar
 
Join Date: Dec 2011
Posts: 56
Reputation: 9
Default Re: Написание плагинов

Diman777,Не помогло.
Функция StringToLowerByTable_ASCII - по логике должна работать, но почему то не хочет.
Quote:
Originally Posted by NarutoUA View Post
Проверяйте.
Code:
void UpperToLower(char *str)
{
    for (unsigned char ch = *str; ch; str++)
    {
        ch = *str;
        if ((ch >= 'A' && ch <= 'Z') || (ch > 191 /*А*/ && ch < 224 /*Я*/))
            *str += 32;
        else if (ch == 168 /*Ё*/)
            *str = 184;
    }
}
Проверил и вот что получилось:


Добавлена функция от NarutoUA, внесены изменения от Diman777, фикс моей ф-ии.
Attached Files
File Type: rar testmode-0.0.6.rar (1,021.4 KB, 2 views)
MIASO is offline   Reply With Quote
Old 22/02/2017, 09:42 AM   #74
DartfoL
Gangsta
 
DartfoL's Avatar
 
Join Date: Apr 2012
Posts: 764
Reputation: 38
Default Re: Написание плагинов

Quote:
Originally Posted by MIASO View Post
Если вместо букв написать ascii коды - работает только c латиницой, WTF
Потому что ты берёшь и сравниваешь тип char (который от -128 до 127), с числами от 191 до 224. В этом случае проверки никогда не будут истинными. Поэтому необходимо привести указатель к unsigned char (ну или "вписать буквы"). Так что ничего WTF-шного.
__________________
DartfoL is offline   Reply With Quote
Old 23/02/2017, 08:24 PM   #75
Mutha_X
Gangsta
 
Join Date: Sep 2009
Location: recursion
Posts: 642
Reputation: 28
Default Re: Написание плагинов

Короче ставлю это на стол
Code:
inline unsigned int UpperToLower_Mutha2(unsigned char *str) { //Mutha_X
	unsigned char *s = str;
	while(*str) {
		if( unsigned(*str - 65) < 26 ) { // en
			*str += 32;
		} else if( unsigned(*str - 192) < 32) { // ru
			*str += 32;
		} else if(*str == 168) { // ru Ё
			*str =  184;
		}
		++str;
	}
	return ((unsigned char *)str - s) + 1;
}
...

я победил... почти...
Нет, просто около 65% времени занимает "прослойка" связанная с дублированиями строки. Надеюсь вы поняли на что намекаю)
через пару минут в это сообщение догружу архив.
Attached Files
File Type: zip testmode-0.0.7.zip (1.39 MB, 5 views)
__________________
Russian forums: asking question - taking grammar notations.
Учитесь задавать вопросы по существу и изучать матчасть: иначе приобретайте лекарство "НИБОМБИН".
Mutha_X is online now   Reply With Quote
Old 23/02/2017, 08:35 PM   #76
MIASO
Big Clucker
 
MIASO's Avatar
 
Join Date: Dec 2011
Posts: 56
Reputation: 9
Default Re: Написание плагинов

Quote:
Originally Posted by Mutha_X View Post
Нет, просто около 65% времени занимает "прослойка" связанная с дублированиями строки. Надеюсь вы поняли на что намекаю)
Много времени занимает
PHP Code:
amx_StrParam(amxparams[1], string);
amx_SetString(addrstring00len 1); 
MIASO is offline   Reply With Quote
Old 23/02/2017, 08:58 PM   #77
Mutha_X
Gangsta
 
Join Date: Sep 2009
Location: recursion
Posts: 642
Reputation: 28
Default Re: Написание плагинов

Я к тому, что стоило бы попробовать как-то получить более прямой доступ к данным из амх-машины, нежели реализованный в этих функциях, тогда и JIT начнёт сдавать свои позиции.
PS именно эти...:
Code:
amx_GetString(...)
amx_SetString(...)
__________________
Russian forums: asking question - taking grammar notations.
Учитесь задавать вопросы по существу и изучать матчасть: иначе приобретайте лекарство "НИБОМБИН".
Mutha_X is online now   Reply With Quote
Old 24/02/2017, 06:32 AM   #78
DartfoL
Gangsta
 
DartfoL's Avatar
 
Join Date: Apr 2012
Posts: 764
Reputation: 38
Default Re: Написание плагинов


JIT нервно курит в сторонке. Кто сможет быстрее?
http://pastebin.com/rKqQgaPC
__________________
DartfoL is offline   Reply With Quote
Old 24/02/2017, 07:13 AM   #79
Mutha_X
Gangsta
 
Join Date: Sep 2009
Location: recursion
Posts: 642
Reputation: 28
Default Re: Написание плагинов

Да, конечно

PHP Code:
static cell AMX_NATIVE_CALL TP_ToLowerString_MuthaX2(AMX *amxcell *params) {
    
cell *str;
    
amx_GetAddr(amxparams[1], &str);
    while(*
str) {
        if( 
unsigned(*str 65) < 26 ) { // en
            
*str += 32;
        } else if( 
unsigned(*str 192) < 32) { // ru
            
*str += 32;
        } else if(*
str == 168) { // ru Ё
            
*str =  184;
        }
        ++
str;
    }
    return 
1;

Забыл дописать: проц Intel Pentium G3258
__________________
Russian forums: asking question - taking grammar notations.
Учитесь задавать вопросы по существу и изучать матчасть: иначе приобретайте лекарство "НИБОМБИН".
Mutha_X is online now   Reply With Quote
Old 24/02/2017, 07:30 AM   #80
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,724
Reputation: 334
Default Re: Написание плагинов

Я не понимаю, зачем убрали UpperToLower_Mutha_X, но очевидно, что это будет самый быстрый вариант. Я его немного оптимизировал, вот:
PHP Code:
unsigned char chars_lower_ascii[] = {
    
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F,
    
0x100x110x120x130x140x150x160x170x180x190x1A0x1B0x1C0x1D0x1E0x1F,
    
0x200x210x220x230x240x250x260x270x280x290x2A0x2B0x2C0x2D0x2E0x2F,
    
0x300x310x320x330x340x350x360x370x380x390x3A0x3B0x3C0x3D0x3E0x3F,
    
0x400x610x620x630x640x650x660x670x680x690x6A0x6B0x6C0x6D0x6E0x6F,
    
0x700x710x720x730x740x750x760x770x780x790x7A0x5B0x5C0x5D0x5E0x5F,
    
0x600x610x620x630x640x650x660x670x680x690x6A0x6B0x6C0x6D0x6E0x6F,
    
0x700x710x720x730x740x750x760x770x780x790x7A0x7B0x7C0x7D0x7E0x7F,
    
0x800x810x820x830x840x850x860x870x880x890x8A0x8B0x8C0x8D0x8E0x8F,
    
0x900x910x920x930x940x950x960x970x980x990x9A0x9B0x9C0x9D0x9E0x9F,
    
0xA00xA10xA20xA30xA40xA50xA60xA70xB80xA90xAA0xAB0xAC0xAD0xAE0xAF,
    
0xB00xB10xB20xB30xB40xB50xB60xB70xB80xB90xBA0xBB0xBC0xBD0xBE0xBF,
    
0xE00xE10xE20xE30xE40xE50xE60xE70xE80xE90xEA0xEB0xEC0xED0xEE0xEF,
    
0xF00xF10xF20xF30xF40xF50xF60xF70xF80xF90xFA0xFB0xFC0xFD0xFE0xFF,
    
0xE00xE10xE20xE30xE40xE50xE60xE70xE80xE90xEA0xEB0xEC0xED0xEE0xEF,
    
0xF00xF10xF20xF30xF40xF50xF60xF70xF80xF90xFA0xFB0xFC0xFD0xFE0xFF
};

static 
cell AMX_NATIVE_CALL TP_StringToLowerByTable_ASCII(AMX *amxcell *params)
{
    
cell *pAddress NULL;
    
amx_GetAddr(amxparams[1], &pAddress);
    while (*
pAddress) {
        *
pAddress chars_lower_ascii[*pAddress];
        
pAddress++;
    }
    return 
1;

PHP Code:
UpperToLower_orig     результат974 ms
UpperToLower_miaso     результат
628 ms
UpperToLower_dartfol     результат
422 ms
UpperToLower_Mutha_X     результат
200 ms
UpperToLower_narutoua     результат
658 ms
UpperToLower_Mutha_X2     результат
226 ms
PAWN_UTL_White_116     результат
579 ms
PAWN_UTL_White_116_MACR результат
677 ms
PAWN_ToLowerString     результат
1594 ms
Original String
ЛОЛ Heh мда РОФЛ Ёпта
UpperToLower_orig
лол heh мда рофл ёпта
UpperToLower_miaso
лол heh мда рофл ёпта
UpperToLower_dartfol
лол heh мда рофл ёпта
UpperToLower_Mutha_X
лол heh мда рофл ёпта
UpperToLower_narutoua
лол heh мда рофл ёпта
UpperToLower_Mutha_X2 String
лол heh мда рофл ёпта
UpperToLower_White_116
ЛОЛ heh мда РОФЛ Ёпта
UpperToLower_White_116_MACRO
ЛОЛ heh мда РОФЛ Ёпта
PAWN_ToLowerString String
лол heh мда рофл ёпта 
Тестировал на Linux + Pentium 2020m.
Во вложениях исходники с последними изменениями (и исправленным Makefile), плюс Windows сервер.

P.S. И да, варианты от White_116 не работают под Linux.
Attached Files
File Type: zip testmode-0.0.8.zip (1.50 MB, 7 views)
ZiGGi is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Разработка плагинов - как достать адресс функции? therainycat Русский/Russian 6 18/09/2013 08:45 PM


All times are GMT. The time now is 04:49 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.