Войти
ПрограммированиеФорумОбщее

Проблемы с строками (2 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#15
8:05, 17 мая 2012

Smothik
> LPCWSTR str1=(LPCWSTR)"Sample string";

Так перекодировать строки нельзя. Я пользуюсь функцией надстройкой над winapi:

 

  


 
std::string convertWstringToAstringWinapi(const  std::wstring& src  )   throw (std::runtime_error)
{
  if( src.length() < 1024 )
  {
    char temp[1048];
    temp[0] = '\0';

    int winapires = WideCharToMultiByte( CP_ACP, 0, src.c_str(), -1, temp, 1048, NULL, NULL );
    if(winapires==0)
    {
      throw std::runtime_error("Error call WideCharToMultiByte");
    }    
    
  
    return std::string(temp);
  }

  
  char* temp = new char [ src.length() + 16 ];

  int winapires = WideCharToMultiByte( CP_ACP, 0, src.c_str(), -1, temp, (int)(src.length() + 8), NULL, NULL );
  if(winapires == 0)
  {
    delete [] temp;
    throw std::runtime_error("Error call WideCharToMultiByte");
  }

  std::string res(temp);
  delete [] temp;
  return res;
}






 
std::wstring convertAstringToWstringWinapi( const std::string& src )    throw (std::runtime_error) 
{
  if( src.length() < 1024 )
  {
    wchar_t temp[1048];
    temp[0] = L'\0';

    int winapires = MultiByteToWideChar( CP_ACP, 0, src.c_str(), (int)(src.length()+1), temp,  1048 );
    if(winapires==0)
    {
      throw std::runtime_error("Error call MultiByteToWideChar");
    }

    return std::wstring(temp);
  }

  wchar_t* temp = new wchar_t [ src.length() + 32 ];
                                         
    int winapires = MultiByteToWideChar( CP_ACP, 0, src.c_str(), (int)(1 + (int)src.length() ),  temp,  (int)(src.length() + 16)  );
  if(winapires==0)
  {
    delete [] temp;
    throw std::runtime_error("Error call MultiByteToWideChar");
  }

  std::wstring res (temp);
  delete [] temp;
  return res;
}
#16
8:09, 17 мая 2012

Smothik
> И чем меня студия бесит надо приводить const char к char , Char[5] к char.Doble
> int к DWORD
> LPCWSTR к LPCWSTR.Бред не правдо ли

Ололо. Нет не бред. Результаты таких приведений ты можешь увидеть легко в нулевом посте этой самой темы же.

Вообще учебник C/C++ в зубы - и вперед на взятие крутых вершин мозгового серого вещества.

P.S.

Всё более склоняюсь к мнению что нормальные программисты получаются легче всего когда на самом раннем уровне развития прогер хорошо знакомится с машинной архитектурой и асмом. Т.е. сперва что то бейсикоподобное для закрепления базовых интуитивных понятий, потом асм для закрепления сути дела и уже потом компилируемые в машкод языки типа C/C++/Pascal и так далее. Иначе вот такие темы будут. К сожалению такая натуральная цепочка в современном мире нарушена, то ли дело в 8-ми и 16-битные времена...

#17
8:53, 17 мая 2012

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

#18
9:02, 17 мая 2012

igo
> но он интересный, да... кому-то прям - понравится... всеж это близко к
> брутальным истокам...

Он не просто интересный. Он вправляет мозги. Даже в паскале знать что такое var в параметрах функции - прекрасно себе представлять что это скрытый указатель и не делать глупостей вроде var x: char или наоборот x: giperstruct. Теоретику вопроса знать на зубок - это же нормально. Глядя на толстые спеки самого языка в чистом виде как синтаксического инструментария это можно далеко не всегда понять, если не знаешь в чём дело изнутри.

#19
9:42, 17 мая 2012

Smothik
> LPCWSTR str1=(LPCWSTR)"Sample string";

Так перекодировать строки нельзя. Я пользуюсь функцией надстройкой над winapi:

 



std::string convertWstringToAstringWinapi(const  std::wstring& src  )  throw (std::runtime_error)
{
  if( src.length() < 1024 )
  {
    char temp[1048];
    temp[0] = '\0';

    int winapires = WideCharToMultiByte( CP_ACP, 0, src.c_str(), -1, temp, 1048, NULL, NULL );
    if(winapires==0)
    {
      throw std::runtime_error("Error call WideCharToMultiByte");
    }   
   
 
    return std::string(temp);
  }

 
  char* temp = new char [ src.length() + 16 ];

  int winapires = WideCharToMultiByte( CP_ACP, 0, src.c_str(), -1, temp, (int)(src.length() + 8), NULL, NULL );
  if(winapires == 0)
  {
    delete [] temp;
    throw std::runtime_error("Error call WideCharToMultiByte");
  }

  std::string res(temp);
  delete [] temp;
  return res;
}



std::wstring convertAstringToWstringWinapi( const std::string& src )    throw (std::runtime_error)
{
  if( src.length() < 1024 )
  {
    wchar_t temp[1048];
    temp[0] = L'\0';

    int winapires = MultiByteToWideChar( CP_ACP, 0, src.c_str(), (int)(src.length()+1), temp,  1048 );
    if(winapires==0)
    {
      throw std::runtime_error("Error call MultiByteToWideChar");
    }

    return std::wstring(temp);
  }

  wchar_t* temp = new wchar_t [ src.length() + 32 ];
                                       
    int winapires = MultiByteToWideChar( CP_ACP, 0, src.c_str(), (int)(1 + (int)src.length() ),  temp,  (int)(src.length() + 16)  );
  if(winapires==0)
  {
    delete [] temp;
    throw std::runtime_error("Error call MultiByteToWideChar");
  }

  std::wstring res (temp);
  delete [] temp;
  return res;
}

convertWstringToAstringWinapi(  )
Пишет несовместим const char с string[5]
Опять приводить. Может нафиг отключить юникод

Он не просто интересный. Он вправляет мозги. Даже в паскале знать что такое var в параметрах функции - прекрасно себе представлять что это скрытый указатель и не делать глупостей вроде var x: char или наоборот x: giperstruct. Теоретику вопроса знать на зубок - это же нормально. Глядя на толстые спеки самого языка в чистом виде как синтаксического инструментария это можно далеко не всегда понять, если не знаешь в чём дело изнутри.

Я читал книгу C++ за 21 день там насчет скрытых указателей ничего не сказано.Может посоветуйте  нормальную книгу ,где о C++ сказано всё (о синтаксисе).

#20
9:50, 17 мая 2012

Smothik
> Я читал книгу C++ за 21 день там насчет скрытых указателей ничего не
> сказано.Может посоветуйте  нормальную книгу посоветуйте ,где о C++ сказано всё
> (о синтаксисе).

Сверху справа поле поиска, набираешь "посоветуйте книгу по С++" и в будущем всегда прежде чем задавать вопросы ищешь очевидными словами там.

#21
11:01, 17 мая 2012

=A=L=X=
ну... пожалуй... не могу выступить объективно против, так как он мне нравиться... хотя изучал я его не вперед паскалей... да и не изучал толком, просто применил когда понадобился, книжку в зубы и вперед... не поворачивается язык назвать его сложным, он прямой как рельса...
правда я еще машинные коды застал как метод программления)))...

#22
11:49, 17 мая 2012

igo
> язык

Дело не в языке. Дело в том как раз в машинном уровне. Знать что такое память и с чем её едят. Знать что такое локация в памяти и указатель на эту локацию. Понимать принцип работы стека и переменных на нём. Иметь картинку что есть машинные инструкции и как они работают. Сложность операции. В принципе этого достаточно. Сам синтаксис ассемблера вообще не нужен для формирования этой базы. Теперь вот к чему мы приходим - человек понятия не имеет что есть char а что есть wchar_t и как они в памяти вообще представлены. Это же крах.

> правда я еще машинные коды застал как метод программления)))...

Ну вот, это очень хороший ход.

#23
13:53, 17 мая 2012

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

#24
11:44, 8 июня 2012

Все  сделал как надо юникодная строка к юникодной.Люди помогите что неправильно в этом коде.

LPWSTR GetName()
{
  wchar_t* buffer[UNLEN+1];    // буфер
  DWORD size;      // размер
  size=sizeof(buffer);    // размер буфера
  if (GetUserName((LPWSTR)buffer,&size)==0)
    throw "Error GetUserName";  // при ошибке функция вернет 0
  return (LPWSTR)buffer;      // вернуть результат
}

MessageBoxW(NULL,Get(),L"Имя",MB_OK);

Выдает абракадабру опять.

#25
11:55, 8 июня 2012

Smothik
> Выдает абракадабру опять.

Мне вот просто из любопытства интересно - за конец мая и начало июня ты так и не последовал совету почитать учебники по С++? Чем ты это время занимался?

#26
12:01, 8 июня 2012

Я уже прочитал учебник давно но там на счет этих строк ничего не сказано.

#27
12:17, 8 июня 2012

что я делаю не правильно?.И есть где нибудь понятное обьснение строк.

#28
12:21, 8 июня 2012

Smothik
> что я делаю не правильно?.И есть где нибудь понятное обьснение строк.

Тебе надо серьезно и тщательно изучать С/C++. Объяснять частные случаи тебе почему и зачем тот или иной конкретный участок кода не работает - не имеет смысла. То что ты за 2 месяца не смог при наличии нескольких советов ничего сделать - лишнее тому подтверждение. Тебе тупо надо брать и изучать от корней и до волос язык C++. Без пропусков, без лени и без вариантов.

> Я уже прочитал учебник давно но там на счет этих строк ничего не сказано.

Не верю. ЧТо то тут не так. Или дурной учебник тебе попался (см. советы выше) или ты лжешь.

#29
12:30, 8 июня 2012

Я чител во эту книгу http://iguania.ru/knigi-po-programmirovaniiu/dzhess-liberti-osvoy… -21-den.html/.
wchar_t* указатель на юникодную строку. LPWSTR то же самое.Я привожу к этому типу.Возвращаемое значени приведе к этому типу т.к. не будет компилироваться.ЧТО может тут быть не правильным.Вот код откуа я это взял http://www.firststeps.ru/mfc/winapi/r.php?135

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.