Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поднять русский char в верхний регистр, Borland C++Builder 6 
:(
    Опции темы
Gen
Дата 7.5.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2006

Репутация: нет
Всего: 1



Доброго времени суток!

Целый час копался в Билдере, но так и не смог найти процедуры, способной поднять мой русский char в верхний регистр. В результате процедуру пришлось писать самому что, разумеется, мне не нравится. Стандартный toupper поддерживает только английский.
PM MAIL   Вверх
Greeen
Дата 7.5.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Код

#include <locale>
#include <iostream>
using namespace std;

void main()
{
char ch = 'а';
locale loc("Russian_Russia");
char up = toupper(ch, loc);
cout << up;
}



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Gen
Дата 7.5.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2006

Репутация: нет
Всего: 1



Ух ты!! Попробовал - работает, но только вот одна беда - слишком медленно.(

В рамках моей программы - неприемлимо. Время поиска по серьезной папке с 7ми секунд увеличивается аж до 25!!

Добавлено @ 14:59
ЗЫ. Или может это я чего то делаю не так?? Сначала я создаю loacle loc. Затем пишу loc=locale(""Russian_Russia"). Затем - использую toupper(c,loc) в своей проге.

Добавлено @ 15:01
А вообще - получается, что мой toupper в предложенном варианте вынужден перестраиваться при каждом его вызове?!

Кошмар! Цена за универсальность - вот как это называется. Все же, судя по всему - в данном случае действительно целесообразно писать свой.(

Это сообщение отредактировал(а) Gen - 7.5.2007, 15:05
PM MAIL   Вверх
Daevaorn
Дата 7.5.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Gen, создавать locale надо один раз.
PM MAIL WWW   Вверх
Gen
Дата 9.5.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2006

Репутация: нет
Всего: 1



Цитата(Daevaorn @ 7.5.2007,  15:32)
Gen, создавать locale надо один раз.

Проблема не в этом. Определяется он в .h, а инициализируется - сразу же после запуска программы и только один раз - вот что я имел в ввиду.

Это сообщение отредактировал(а) Gen - 9.5.2007, 00:02
PM MAIL   Вверх
W4FhLF
Дата 9.5.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Код

for (int i = 0; i < lstrlen(str); i++)
        str[i] |= 0x20;



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 9.5.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



ежели говорим о CP1251.....
W4FhLF тогда уж так (у тебя напротив в нижний регистр переведет)
Код

void upcase(char* lpstr){
    while(*lpstr++ &= 0xDF);
}

(ежели нигде не ошибся я)
-----
ну и границы неслабобы проверить (а то малоли это вообще не буква нужная...).... для DOS866 там разрывно получается... но идея таже))


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
W4FhLF
Дата 9.5.2007, 11:33 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(jonie @  9.5.2007,  11:16 Найти цитируемый пост)
у тебя напротив в нижний регистр переведет


Правда? Чудеса, пойду всем расскажу. 
И что, что в нижний? Трудно два символа изменить? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 9.5.2007, 12:11 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

И что, что в нижний?
subj, чтоже еще.

Цитата

Правда? Чудеса, пойду всем расскажу. 
сходи... не споткнись по дороге.
символ 'ж' в cp1251 имеет код = 0xE6
0xE6 | 0x20 = 0xE6
странный перевод в ВЕРХНИЙ РЕГИСТР.
когда как
0xE6 & 0xDF = 0xC6 == 'Ж' (что и надо)
Цитата

Трудно два символа изменить? 
три. и мне лично не нравится вызов еще одной функции (что даст немало потери времени....)
Код

 000000C0:  C0 C1 C2 C3-C4 C5 C6 C7-C8 C9 CA CB-CC CD CE CF  АБВГДЕЖЗИЙКЛМНОП
 000000D0:  D0 D1 D2 D3-D4 D5 D6 D7-D8 D9 DA DB-DC DD DE DF  РСТУФХЦЧШЩЪЫЬЭЮЯ
 000000E0:  E0 E1 E2 E3-E4 E5 E6 E7-E8 E9 EA EB-EC ED EE EF  абвгдежзийклмноп
 000000F0:  F0 F1 F2 F3-F4 F5 F6 F7-F8 F9 FA FB-FC FD FE FF  рстуфхцчшщъыьэюя



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ama_kid
Дата 9.5.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Gen, я конечно понимаю, что пост в разделе "Общие вопросы С++", но судя по тому, что ты
Цитата(Gen @  7.5.2007,  14:23 Найти цитируемый пост)
копался в Билдере
то возникает естесственный вопрос: в нём есть функция AnsiUpperCase. Чем она не устраивает?
Код
 char m = 'а';
 ShowMessage(AnsiUpperCase(m));




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
W4FhLF
Дата 9.5.2007, 14:21 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(jonie @  9.5.2007,  12:11 Найти цитируемый пост)

сходи... не споткнись по дороге.
символ 'ж' в cp1251 имеет код = 0xE6
0xE6 | 0x20 = 0xE6
странный перевод в ВЕРХНИЙ РЕГИСТР.
когда как0xE6 & 0xDF = 0xC6 == 'Ж' (что и надо)


Ты сейчас что хотел этим сказать? По-твоему я утверждаю, что мой код это перевод в верхний регистр? Где ж об этом было сказано? Это была основуа алгоритма, так, что не напрягайся, я прекрасно всё понимаю и в твоих объяснениях не нуждаюсь. 

Цитата(jonie @  9.5.2007,  12:11 Найти цитируемый пост)
и мне лично не нравится вызов еще одной функции (что даст немало потери времени....)


Ты обкурился чтоли? 

Код

int dwLen = strlen(str);
for (int i = 0; i < dwLen; i++)
...


Круто, да? Или тебе не нравится использование дополнительных 4х байт памяти? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 9.5.2007, 17:39 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

Ты обкурился чтоли? 

пока что нет.

нафиг вызывать strlen (который будет пробегать по всему массиву вплоть до 0, когда мы будем заниматься темже самым ? неужели нельзя у себя же и сравнивать) ?
попробуй сделай прогони на 40 метровых массивах и засеки время.... в общем IntelVTune не посчитает тот код правильным по быстродействию.....

Цитата

Это была основа алгоритма
куда нам ламирам... мыж не догадаемся что по всему массиву надо пробежаться и что-то арифметическое сделать с каждым элементом.... вот int main(){....} вот это правильный алгоритм... а ты както мелко берешь...

Цитата

Или тебе не нравится использование дополнительных 4х байт памяти? 
а кто тебе сказал что sizeof(int)==4 , и кто тебе сказал что dwLen попадет в стек, а не в регистр? расскажешь потом как ты это узнаешь....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Gen
Дата 9.5.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2006

Репутация: нет
Всего: 1



ama_kid, AnsiUpperCase почему то у меня не катит. Скорость обработки уменшается примерно раз в 5. Что интересно: у некоторых моих товарищей он работает со скоростью нормальной, у некоторых с ним вообще, по их словам, наблюдаются какие то проблемы. exe-файл с AnsiUpperCase, полученный от товарища (у него он обрабатывает папку примерно секунд за 10) у меня ее же обрабатывал 30! Процессор мой быстрее, чем у него.

jonie, а не будет ли предложенный подход, кстати, машинно-зависимым?

Это сообщение отредактировал(а) Gen - 9.5.2007, 20:12
PM MAIL   Вверх
W4FhLF
Дата 11.5.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



jonie, хехе... Ну ладно, давай такsmile


Цитата(jonie @  9.5.2007,  17:39 Найти цитируемый пост)
куда нам ламирам... мыж не догадаемся что по всему массиву надо пробежаться и что-то арифметическое сделать с каждым элементом.... вот int main(){....} вот это правильный алгоритм... а ты както мелко берешь...


Своим примером я только лишь хотел сказать, что нужно работать с пятым битом, что для более или менее средней руки программиста было очевидно, но ты начал лезть со своими поправками, мол пацан ты чё дал-то? Ты чё дурак? Да у тебя не  так работает и здечь медленно будет. Смари как надо... 
Вот так вот это всё выглядело.

Цитата(jonie @  9.5.2007,  17:39 Найти цитируемый пост)
нафиг вызывать strlen (который будет пробегать по всему массиву вплоть до 0, когда мы будем заниматься темже самым ? неужели нельзя у себя же и сравнивать) ?попробуй сделай прогони на 40 метровых массивах и засеки время.... в общем IntelVTune не посчитает тот код правильным по быстродействию.....


Я про скорость и быстродействие именно того кода, что я привёл не сказал ни слова, поэтому все твои наезды это всего-лишь попытка обратить внимание на себя и свой код, о котором я тоже в целом нислова не сказал. 
А если ты хочешь посорвероваться в скорости, то давай сделаем это. Предлагай свой оптимизированный вариант. 


Цитата(jonie @  9.5.2007,  17:39 Найти цитируемый пост)
а кто тебе сказал что sizeof(int)==4 , и кто тебе сказал что dwLen попадет в стек, а не в регистр? расскажешь потом как ты это узнаешь....


Ну давай попридераемся к словам. Когда стоящих аргументов нет, то надо же как-то выезжать smile
Куда попадает dwLen ты можешь сам посмотреть, когда продизассемблируешь программу, а регистр - это сверхбыстрая ПАМЯТЬ находящаяся внутри процессора. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1083 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.