Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2009, 11:31   #1
MrKarapuz
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 4
Вопрос шаблонные строковые функции

решил написать несколько строковых функций, так чтоб работали со строками разных типов
вот одна из них
делает поиск символа в строке, возвращает индекс или -1 если не найден
Код:
template<class TYPE>
inline SIZE_T   str_find_symn(const TYPE* pSrc,TYPE Symbol,SIZE_T Count){
        SIZE_T  Index;
        switch(sizeof TYPE){
                case 1:
                        __asm__("repne; scasb; cmovnel %2,%%ecx":"=c"(Index),"=D"(pSrc):"rm"(Count),"D"(pSrc),"c"(Count),"a"(Symbol));
		break;
                case 2:
                        __asm__("repne; scasw; cmovnel %2,%%ecx":"=c"(Index),"=D"(pSrc):"rm"(Count),"D"(pSrc),"c"(Count),"a"(Symbol));
		break;
                case 4:
                        __asm__("repne; scasl; cmovnel %2,%%ecx":"=c"(Index),"=D"(pSrc):"rm"(Count),"D"(pSrc),"c"(Count),"a"(Symbol));
		break;
                default:
                        return 0;
        }
        return Count-Index-1;
}
проблема состоит в том что при вызове например так

Код:
 
str_find_symn("asdasd",123,6);
не компилит и выводит следущую ошибку
error: no instance of function template "str_find_symn_" matches the argument list
1> argument types are: (const char [7], int, int)
1> str_find_symn("asdasd",123,6);

то есть как я понял компилятор не преобразовывает 123 к типу char
если написать так

Код:
 
str_find_symn("asdasd",(char)123,6);
то все нормально

теперь вопросы
1. как сделать так чтоб при каждом вызове мне не приходилось преобразовывать типы
2. как проверку на размер типа сделать через условную компиляцию. (при оптимизации он конечно обрубает лишние case, но хотелось бы чтоб на стадии отладки их тоже не было)

компидятор Intel 10

Последний раз редактировалось MrKarapuz; 09.11.2009 в 12:53.
MrKarapuz вне форума Ответить с цитированием
Старый 09.11.2009, 12:43   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Компидятор :)

Можно попробовать сделать TYPE1 и TYPE2 и привести типы в функции. Возможно, придётся использовать dynamic_cast, или какой-нибудь другой каст.
ds.Dante вне форума Ответить с цитированием
Старый 09.11.2009, 13:02   #3
MrKarapuz
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 4
По умолчанию

чтото не понял как к описанию функции каст прикрутить
MrKarapuz вне форума Ответить с цитированием
Старый 09.11.2009, 13:05   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

передавать char, а не int?
str_find_symn("asdasd",'\x7B',6); где 7B - 123 в 16-ричной системе
pu4koff вне форума Ответить с цитированием
Старый 09.11.2009, 13:13   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Примерно так:

Код:
template <class TYPE_STR, class TYPE_CHR>
SIZE_T str_find_symn (const TYPE_STR* pSrc, TYPE_CHR Symbol, SIZE_T Count)
{
...
    (TYPE_STR) Symbol;
...
}
pu4koff, вопрос в другом.
ds.Dante вне форума Ответить с цитированием
Старый 09.11.2009, 13:19   #6
MrKarapuz
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 4
По умолчанию

так не пойдет, тут явно указываеться char
а еслибы было так
Код:
typedef struct COLOR{
  char r,g,b,a;
}

COLOR color[10];
str_find_symn(color,0xffffff,10);
на этом компилятор споткнеться так что думаю TYPE1 и TYPE2 пока лучший выход

ну с 1 вопросом разобрались, теперь хотелось бы узнать как сделать условную компиляцию по размеру типа

Последний раз редактировалось Stilet; 09.11.2009 в 14:45.
MrKarapuz вне форума Ответить с цитированием
Старый 09.11.2009, 13:35   #7
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Мне это не представляется возможным, так как компилятор генерирует 3 экземпляра шаблона, каждый из которых нужно оптимизировать по-своему.

Для большей оптимизации можно сделать в функции int tmp = sizeof TYPE_STR; а остальное сделать на ассемблере.
ds.Dante вне форума Ответить с цитированием
Старый 09.11.2009, 15:07   #8
MrKarapuz
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 4
По умолчанию

то есть чтото типа

#if sizeof TYPE == 1
....
#endif

непрокатит?

я может неправильно пишу, но размер типа вычисляеться на этапе компиляции. так как же тогда эту проверку сделать через #if?

функция и так на асме почти полностью, счас выглядит так

Код:
template<class TYPE1,class TYPE2>
inline UINTPTR	str_find_symn(const TYPE1* pSrc,TYPE2 Symbol,SIZE_T Count){
	SIZE_T	Index;
	switch(sizeof TYPE1){
		case 1:
			__asm__("movl %%ecx,%0; repne; scasb; cmovnel %0,%%ecx; negl %%ecx; leal -1(%0,%%ecx),%0;":
			"=r"(Index),"=D"(pSrc):
			"c"(Count),"D"(pSrc),"a"(Symbol));
			break;
		case 2:
			__asm__("movl %%ecx,%0; repne; scasw; cmovnel %0,%%ecx; negl %%ecx; leal -1(%0,%%ecx),%0;":
			"=r"(Index),"=D"(pSrc):
			"c"(Count),"D"(pSrc),"a"(Symbol));
			break;
		case 4:
			__asm__("movl %%ecx,%0; repne; scasl; cmovnel %0,%%ecx; negl %%ecx; leal -1(%0,%%ecx),%0;":
			"=r"(Index),"=D"(pSrc):
			"c"(Count),"D"(pSrc),"a"(Symbol));
			break;
		default:
			return -1;
	}
	return Index;
}
компилиться так

Код:
004063D7     push           6    
004063D9     pop            ecx  
004063DA     mov           edi,offset string "asdasd" (40181Ch) 
004063DF     push          7Bh  
004063E1     pop            eax  
004063E2     mov           ebx,ecx 
004063E4     repne scas  byte ptr es:[edi] 
004063E6     cmovne      ecx,ebx 
004063E9     neg           ecx  
004063EB     lea            ebx,[ebx+ecx-1]
еще не пойму как сделать Clobber list на интеловском компиляторе
и откуда беруться 3 шаблона
MrKarapuz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковые Маруська Помощь студентам 3 21.06.2009 17:31
Строковые переменные NightFire Помощь студентам 1 23.03.2009 06:20
Задача на строковые функции в Delphi... Leprechaun Помощь студентам 2 24.12.2008 18:01
Задачи на Паскале. Строковые процедуры и функции Мент Паскаль, Turbo Pascal, PascalABC.NET 3 25.06.2008 13:24
Строковые процедуры Cannibal Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2008 12:42