Перекодировщик неправильной раскладки...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Перекодировщик неправильной раскладки...

Сообщение Maitris » 22.06.2005 (Ср) 20:06

Вот, сбацал прогу для перекодирования текста набранного или прешедшего в другой раскладке... (Dfcz вместо Вася к примеру)...

Нашел в инете аналог, а он в 10 раз быстрее работает :evil: почему-то
Вроде все оптимально сделал
гляньте кто-нить в аттаче что не так plz
8)
Вложения
ReCoder.rar
(2.6 Кб) Скачиваний: 40
----

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.06.2005 (Ср) 20:20

Вот моя старая программа на эту тему...
Делай выводы.

Код: Выделить всё
Option Explicit

Private Sub mnuRead_Click()
    On Error GoTo Error:
    Dim i As Long
    Dim strTmp As String, strFullString As String, strReplace As String, strSrc As String
    strFullString = txtCode.Text
    For i = 1 To Len(strFullString)
        strTmp = Mid$(strFullString, i, 1)
        'Debug.Print strTmp
        Select Case strTmp
            Case "~": strReplace = "Ё": Case "`": strReplace = "ё"
            Case "Q": strReplace = "Й": Case "q": strReplace = "й"
            Case "W": strReplace = "Ц": Case "w": strReplace = "ц"
            Case "E": strReplace = "У": Case "e": strReplace = "у"
            Case "R": strReplace = "К": Case "r": strReplace = "к"
            Case "T": strReplace = "Е": Case "t": strReplace = "е"
            Case "Y": strReplace = "Н": Case "y": strReplace = "н"
            Case "U": strReplace = "Г": Case "u": strReplace = "г"
            Case "I": strReplace = "Ш": Case "i": strReplace = "ш"
            Case "O": strReplace = "Щ": Case "o": strReplace = "щ"
            Case "P": strReplace = "З": Case "p": strReplace = "з"
            Case "{": strReplace = "Х": Case "[": strReplace = "х"
            Case "}": strReplace = "Ъ": Case "]": strReplace = "ъ"
            Case "A": strReplace = "Ф": Case "a": strReplace = "ф"
            Case "S": strReplace = "Ы": Case "s": strReplace = "ы"
            Case "D": strReplace = "В": Case "d": strReplace = "в"
            Case "F": strReplace = "А": Case "f": strReplace = "а"
            Case "G": strReplace = "П": Case "g": strReplace = "п"
            Case "H": strReplace = "Р": Case "h": strReplace = "р"
            Case "J": strReplace = "О": Case "j": strReplace = "о"
            Case "K": strReplace = "Л": Case "k": strReplace = "л"
            Case "L": strReplace = "Д": Case "l": strReplace = "д"
            Case ":": strReplace = "Ж": Case ";": strReplace = "ж"
            Case Chr$(34): strReplace = "Э": Case "'": strReplace = "э"
            Case "Z": strReplace = "Я": Case "z": strReplace = "я"
            Case "X": strReplace = "Ч": Case "x": strReplace = "ч"
            Case "C": strReplace = "С": Case "c": strReplace = "с"
            Case "V": strReplace = "М": Case "v": strReplace = "м"
            Case "B": strReplace = "И": Case "b": strReplace = "и"
            Case "N": strReplace = "Т": Case "n": strReplace = "т"
            Case "M": strReplace = "Ь": Case "m": strReplace = "ь"
            Case "<": strReplace = "Б": Case ",": strReplace = "б"
            Case ">": strReplace = "Ю": Case ".": strReplace = "ю"
            Case "/": strReplace = "."
            Case "?": strReplace = ","
            Case "@": strReplace = Chr$(34)
            Case "#": strReplace = "№"
            Case "$": strReplace = ";"
            Case "^": strReplace = ":"
            Case "&": strReplace = "?"
            Case Else: strReplace = strTmp
        End Select
        strSrc = strSrc & strReplace
    Next i
    txtResult.Text = strSrc
Error:
    If CBool(Err) Then
        MsgBox "Error:" & Chr$(32) & Err.Number & vbCrLf & vbCrLf & _
            "Description:" & Chr$(32) & Err.Description, _
            vbOKOnly Or vbCritical Or vbApplicationModal, "Error"
    End If
End Sub
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.06.2005 (Ср) 20:25

BV
А регистр не сохраняется у тебя ж :)
Я имел в виду не размер, а быстродействие
оно у этих двух прог (твоей и моей) на проверку почти одинаковое
----

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.06.2005 (Ср) 20:40

1. Приведи код более быстрой программы (без API).
2. Ты уверен, что регистр у меня не сохраняется?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.06.2005 (Ср) 20:46

BV
Ой ей не заметил :D
Реализовано немного другим способом.
На vb нигде не встречал такое, только готовая инсталляшка не известно на каком языке... Но работает реально очень быстро, мне кажется там вообще другой принцип используется

Сам посмотри error.rar
Вложения
Error.rar
(11.84 Кб) Скачиваний: 22
----

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.06.2005 (Ср) 21:03

Код: Выделить всё
DeleteCriticalSection   LeaveCriticalSection    EnterCriticalSection    InitializeCriticalSection   VirtualFree   VirtualAlloc    LocalFree   LocalAlloc    TlsSetValue   TlsGetValue   GetModuleHandleA    GetLastError    GetCommandLineA   WriteFile   SetFilePointer    SetEndOfFile    RtlUnwind   ReadFile    RaiseException    GetStdHandle    GetFileSize   GetFileType   ExitProcess   CreateFileA   CloseHandle    MessageBoxA    WriteFile   ReadFile    MultiByteToWideChar   GlobalUnlock    GlobalLock    GlobalAlloc   GetVersionExA   GetModuleFileNameA    GetLastError    CreateFileA   CloseHandle    keybd_event   TrackPopupMenu    SetWindowPos    SetClipboardViewer    SetClipboardData    SendMessageA    RegisterHotKey    RegisterClassA    PostQuitMessage   OpenClipboard   MessageBoxA   LoadIconA   GetMessageA   GetCursorPos    GetClipboardData    FindWindowA   EmptyClipboard    DispatchMessageA    DestroyMenu   DefWindowProcA    CreateWindowExA   CreatePopupMenu   CloseClipboard    ChangeClipboardChain    AppendMenuA   ActivateKeyboardLayout    ShellAboutA   Shell_NotifyIconA


Снова подумай, глядя на использованные в этой программе API.
Да, и совет на будущее: перед копированием в буфер пиши Clipboard.Clear
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.06.2005 (Ср) 22:16

BV
Мда... Неслабо для такой маленькой программулины %)
Уж лучше медленней, но не карпеть над апи мне кажется...
Насчет клипборда сенк, буду знать
----

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 22.06.2005 (Ср) 22:32

У данной программы время --- n^2 из-за строки strSrc = strSrc & strReplace. Хотите убыстрить? делаёте массив байт длинной со строку. Пишите символы туда, ну аж если нужна строка, то сделайте copymemory и всё. Тогда время будет n, быстрей не получится
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.06.2005 (Ср) 22:48

Maitris писал(а):Неслабо для такой маленькой программулины


Гы! Ты думаешь, что это вызовы? Это - язык ;)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.06.2005 (Ср) 22:59

BV
C?
----

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.06.2005 (Ср) 23:08

Похоже - да.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 23.06.2005 (Чт) 10:19

GoGosha, программу не смотрел :) , но есть у меня подозрение, что здесь это не главная причина торможения. Строки обычно бывают не слишком длинными, и разница между n и n^2 не слишком велика. Все дело, ИМХО, в АПЯх.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 23.06.2005 (Чт) 10:22

uhm писал(а):GoGosha, программу не смотрел :) , но есть у меня подозрение, что здесь это не главная причина торможения. Строки обычно бывают не слишком длинными, и разница между n и n^2 не слишком велика. Все дело, ИМХО, в АПЯх.


На не очень длинных строках работа этой программы --- несколько милисеккунд, и отличие нельзя заметить, если конечно автор не прибегал к точному измерению времени, а вообще, я имел ввиду программу г-на BV. Представленные программы очень похожи. На программе Maitris сразу видно замедление к концу работы --- значит время больше n. Объясняется это тем, что когда вы приплюсовываете к строке один символ, Бейсик выделяет пямять для строки (~ за n), копирует строку на новое место и удаляет старую: всё за n. Делается это в программе n раз. Отсюда и время. В том алгоритме, который предложил я, память выделяетс один раз пожтому время должно уменьшаться.
Последний раз редактировалось GoGosha 23.06.2005 (Чт) 10:27, всего редактировалось 1 раз.
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 23.06.2005 (Чт) 10:24

Да, может быть. Я, скорее, исходил из области применения - вряд ли кому-то придет в голову набирать в неправильной раскладке мегабайты текста :)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 23.06.2005 (Чт) 14:52

2 GoGosha

Если ты внимательно читал мои посты, то:

Я писал(а):без API


Т.е. я именно указывал, что без RtlMoveMemory и пр.
Следовательно мой алгоритм вполне подходит под такую задачу. И вряд ли другие способы без API смогут работать заметно быстрее.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 157

    TopList