Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > с ansi в unicode


Автор: pycha 7.8.2008, 15:14
драсте. Мне надо сделать функцию которая принимает строку char , a возвращает LPCWSTR (Всмысле юникоде строку). эту функцию кинул в заголовочный файл. 

Вот что я набросал


Код


#ifndef _KUNIK_H_
#define _KUNIK_H_
#include "stdafx.h"
#include <windows.h>
#include <cstring>

LPCWSTR kUnik (char *);

LPCWSTR kUnik (char * astring)
{
    wchar_t tempw= 'a';
    char tempa ='a';
    wchar_t * wstring;
    int raznica; 
    raznica = (int) tempw - (int ) tempa;
    int len = strlen(astring);
    char * mas = new char[len];
    mas = astring;

    for(int i=0; i <len; i++)
    {
        tempw = (int) mas[i] + raznica;
        _tcscat (wstring, tempw);
    }
    return wstring;
}

#endif


не знаю иль работает правильно но задум вродебы красивый. Проблема вот какая : _tcscat не хочет склеивать - говорит что второй параметр должен быть типа const wchar_t * . Что не думал никак не получается выйти из этой ситуации.

Автор: mrbrooks 7.8.2008, 15:20
Чем тебя родная не устраивает
Код

int MultiBytoToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cchMultiByte,
PWSTR pWideCharStr,
int cchWideChar);


Добавлено @ 15:21
или так
Код

WCHAR szW[100]; // строковый буфер в Unicode
swprintf(szW, L"%S", "ANSI Str");

Автор: mes 7.8.2008, 15:23
Цитата(pycha @  7.8.2008,  15:14 Найти цитируемый пост)
_tcscat не хочет склеивать - говорит что второй параметр должен быть типа const wchar_t * .

весь код не смотрел, но вот что бросилось в глаза 
Цитата(pycha @  7.8.2008,  15:14 Найти цитируемый пост)
  wchar_t tempw= 'a';

тебе нужна строка , а определен символ  ..  
можно определить его как массив из двух символов, где второй будет 0 , а с первым работать как нужно
или написать свою  _tcscat   smile 

Автор: pycha 7.8.2008, 16:21
Цитата(mrbrooks @  7.8.2008,  15:20 Найти цитируемый пост)
Чем тебя родная не устраивает

- Я про нее узнал только што от тебя.

Немного подумав сотворил вотэто


 
Код


#ifndef _KUNIK_H_
#define _KUNIK_H_
#include "stdafx.h"
#include <windows.h>
#include <cstring>

LPCWSTR kUnik (char *);

LPCWSTR kUnik (char * astring)
{
    wchar_t tempw[2]= L"a";
    char tempa ='a';
    wchar_t mastemp[500] = L" ";
    wchar_t * wstring = mastemp;
    int raznica; 
    raznica = (int) tempw[0] - (int ) tempa;
    int len = strlen(astring);
    char * mas = new char[len];
    mas = astring;

    for(int i=0; i <len; i++)
    {
        tempw[0] = (int) mas[i] + raznica;
        _tcscat (wstring, tempw);
    }
    return wstring;
}

#endif


Работает smile 

а нужно оно мне для  http://forum.vingrad.ru/index.php?showtopic=62459&view=findpost&p=1602326

Автор: pycha 7.8.2008, 16:42
Блин как ни одно то другое. Работает на одной проге , где передаётся char. На той что по ссылке мне  нужно чтобы функция принимала  аргумент const char *
Я функцию переписал вот так:


Код


#ifndef _KUNIK_H_
#define _KUNIK_H_
#include "stdafx.h"
#include <windows.h>
#include <cstring>

LPCWSTR kUnik (const char *);

LPCWSTR kUnik (const char * astring)
{
    wchar_t tempw[2]= L"a";
    char tempa ='a';
    wchar_t mastemp[500] = L" ";
    wchar_t * wstring = mastemp;
    int raznica; 
    raznica = (int) tempw[0] - (int ) tempa;
    int len = strlen(astring);
    const char * mas = new  char[len];
    mas = astring;

    for(int i=0; i <len; i++)
    {
        tempw[0] = (int) mas[i] + raznica;
        _tcscat (wstring, tempw);
    }
    return wstring;
}

#endif


но появилать ошибка на процесе линковки.
Цитата


Linking...
textviver.obj : error LNK2019: unresolved external symbol "public: __thiscall KWnd::KWnd(wchar_t const *,struct HINSTANCE__ *,int,long (__stdcall*)(struct HWND__ *,unsigned int,unsigned int,long),wchar_t const *,int,int,int,int,unsigned int,unsigned long,struct HWND__ *)" (??0KWnd@@QAE@PB_WPAUHINSTANCE__@@HP6GJPAUHWND__@@IIJ@Z0HHHHIK2@Z) referenced in function _WinMain@16
G:\Documents and Settings\pycha.PYCHA-1366613\Мои документы\Visual Studio 2008\Projects\Project2\textviver\Debug\textviver.exe : fatal error LNK1120: 1 unresolved externals


что с этим делать? Я в этой ошибке чтото вообще ничего не пойму.




------ забыл добавить файл в проект. Удалите ктото это сообщение

Автор: xvr 8.8.2008, 11:32
Цитата(pycha @ 7.8.2008,  16:42)
Блин как ни одно то другое. Работает на одной проге , где передаётся char. На той что по ссылке мне  нужно чтобы функция принимала  аргумент const char *
Я функцию переписал вот так:

Да уж функция у тебя что надо  smile 
Код


#ifndef _KUNIK_H_
#define _KUNIK_H_
#include "stdafx.h"
#include <windows.h>
#include <cstring>

LPCWSTR kUnik (const char *);

LPCWSTR kUnik (const char * astring)
{
    wchar_t tempw[2]= L"a";
    char tempa ='a';
    wchar_t mastemp[500] = L" ";
// Прибавлять будем к пробелу?
    wchar_t * wstring = mastemp;
// А это зачем? Чем исходный mastemp не понравился?
    int raznica; 
    raznica = (int) tempw[0] - (int ) tempa;
// Твоя raznica равна 0
    int len = strlen(astring);
    const char * mas = new  char[len];
// Выделили массив (зачем)???
    mas = astring;
// И тут же про него забыли!!! Чистая потерянная память

    for(int i=0; i <len; i++)
    {
        tempw[0] = (int) mas[i] + raznica;
// Это будет работать ТОЛЬКО для английских букв, цифр и знаков из нижней половины таблицы символов ASCII (для русских букв работать не будет)
        _tcscat (wstring, tempw);
    }
    return wstring;
// Вернули указатель на локальный буфер, что из него прочтет тот, кто вызывал это творение - одному богу известно
}

#endif
Вывод - распечатать, повесить на стенку под надписью 'ТАК ПИСАТЬ НЕЛЬЗЯ!'


Автор: pycha 8.8.2008, 15:37
Я работал с англ. символами и поэтому разницы не заметил . Сейчас перепишу. Мою логику обьяснять не буду ибо как я понял смеха тут будет много

Добавлено @ 15:41
Я пока только развиваюсь. Таких граблей будет еще много

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)