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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка в коде при присваивании значения переменной, ошибка кода значение переменной 
V
    Опции темы
kshyms
Дата 30.11.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <cmath>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <sstream>
#include <iomanip>
#include <string>
std::string escapeString(const std::string &url)
{
   std::stringstream ret;
   for(std::string::const_iterator it = url.begin(), end = url.end(); it != end; ++it) {
       const unsigned char c = *it;
       if ((c > 127) || (c < 0x21) || (c == '%')) //не экранируются символы ASCII, за исключением пробела и процента
           ret << '%' << std::hex << std::setw(2) << std::setfill('0') << (int)c << std::setw(0);
       else
           ret << (char)c;
   }
   return ret.str();
}
//*****
using namespace std;
int main ()
{
int wctomb(char *out, wchar_t in);
    int simple_function(void* p, long size); // прототип
 int  a1; // объявление двух переменных a и b целого типа данных. 
cin  >> a1 ;
string q1; 
std::getline(std::cin, q1);
std::cout << escapeString(q1) << std::endl;
cout<<q1; // подходит для С++ точно, для С хз
string s;
s="https://www.google.com/search?q=";
ShellExecute (NULL, "open",  (s+q1).c_str(), NULL,   NULL, SW_SHOW);
  return 0;
}

Так вроде ошибок не выдает но уже даже на английском не ищет
PM MAIL WWW Skype   Вверх
bsa
Дата 1.12.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



kshyms, ты хоть читаешь описание функций?
Цитата
SVr4, BSD, POSIX.1-2001. POSIX.1-2008 marks toascii() as obsolete, noting that it cannot be use portably in a localized application.

Фактически, эта функция ничего не делает. Тебе необходимо использовать функции, которые я привел в последнем своем посте в теме: http://forum.vingrad.ru/index.php?show_typ...%B8%D1%86%D0%B0
PM   Вверх
kshyms
  Дата 10.12.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <cmath>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <sstream>
#include <iomanip>
#include <string>

using namespace std;

// обработчики сообщений CInternetPoll4View
//перекодировка строки к кодировке UTF-8
CString ContvertToUTF8(CString str, CString from) {
    map<CString, int> codePages;
    codePages["utf-16"] = 1200;
    codePages["windows-1250"] = 1250;
    codePages["windows-1251"] = 1251;
    codePages["koi8-r"] = 20866;
    codePages["koi8-u"] = 21866;
    codePages["koi8-u"] = 21866;

    //если данной кодировки в списке нет
    if (codePages.find(from) == codePages.end()) {
        AfxMessageBox("Неизвестная кодировка " + from);
        return "";
    }

    //Конвертируем исходный текст в WideString
    DWORD dwNum = MultiByteToWideChar(codePages[from], 0, str, -1, NULL, 0);
    //выделяем память под wide char строку:
    wchar_t *pwText;
    pwText = new wchar_t[dwNum];
    if(!pwText) {
        return "";
        delete []pwText;
    }
    MultiByteToWideChar(codePages[from], 0, str, -1, pwText, dwNum);

    //Конвертируем WideString в UTF-8
    dwNum = WideCharToMultiByte(CP_UTF8, 0, pwText, -1, NULL, 0, NULL, NULL);
    char *Text;
    Text = new char[dwNum];
    if(!Text) {
        return "";
        delete []Text;
    }
    WideCharToMultiByte(CP_UTF8, 0, pwText, -1, Text, dwNum, NULL, NULL);

    CString res = CString(Text);

    //очищаем выделенную под переменные память
    delete []pwText;
    delete []Text;

    return res;
}
//*****
using namespace std;
int main ()
{
int wctomb(char *out, wchar_t in);
    int simple_function(void* p, long size); // прототип
 int  a1; // объявление двух переменных a и b целого типа данных. 
cin  >> a1 ;
string q1; 
std::getline(std::cin, q1);
std::cout << escapeString(q1) << std::endl;
cout<<q1; // подходит для С++ точно, для С хз
string s;
s="https://www.оченьпопулярный.com/search?q=";
ShellExecute (NULL, "open",  (s+q1).c_str(), NULL,   NULL, SW_SHOW);
  return 0;
}

Ошибку выдает на строке 19 CString не имя типа

Это сообщение отредактировал(а) kshyms - 10.12.2011, 11:43
PM MAIL WWW Skype   Вверх
bsa
Дата 11.12.2011, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



А где ты взял этот класс? замени все CString на std::string.
PM   Вверх
kshyms
Дата 12.12.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <cmath>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <iostream>
#include "russia.h"
#include <fstream>
#include <windows.h>
//перекодировка строки к кодировке UTF-8
std::string ContvertToUTF8(std::string str, std::string from) {
        map<std::string, int> codePages;
        codePages["utf-16"] = 1200;
        codePages["windows-1250"] = 1250;
        codePages["windows-1251"] = 1251;
        codePages["koi8-r"] = 20866;
        codePages["koi8-u"] = 21866;
        codePages["koi8-u"] = 21866;
 
        //если данной кодировки в списке нет
        if (codePages.find(from) == codePages.end()) {
                AfxMessageBox("Неизвестная кодировка " + from);
                return "";
        }       
 
        //Конвертируем исходный текст в WideString
        //1 - исходная кодировка
        //2 - 0 - доп. флаги не установлены
        //3 - строка для конвертации
        //4 - -1 - исходная строка заканчивается \0
        //5, 6 - необязательные
        DWORD dwNum = MultiByteToWideChar(codePages[from], 0, str, -1, NULL, 0);
        //выделяем память под wide char строку:
        wchar_t *pwText;
        pwText = new wchar_t[dwNum];
        if(!pwText) {
                delete []pwText;
        }
        MultiByteToWideChar(codePages[from], 0, str, -1, pwText, dwNum);
 
        //Конвертируем WideString в UTF-8
        dwNum = WideCharToMultiByte(CP_UTF8, 0, pwText, -1, NULL, 0, NULL, NULL);
        char *Text;
        Text = new char[dwNum];
        if(!Text) {
                delete []Text;
        }
      WideCharToMultiByte(CP_UTF8, 0, pwText, -1, Text, dwNum, NULL, NULL);
 
        std::string res = std::string(Text);
 
        //очищаем выделенную под переменные память
        delete []pwText;
        delete []Text;
 
        return res;
}//*****
using namespace std;
int main ()
{
int wctomb(char *out, wchar_t in);
    int simple_function(void* p, long size); // прототип
 int  a1; // объявление двух переменных a и b целого типа данных. 
cin  >> a1 ;
string q1; 
std::getline(std::cin, q1);
std::cout << escapeString(q1) << std::endl;
cout<<q1; // подходит для С++ точно, для С хз
string s;
s="https://www.google.com/search?q=";
ShellExecute (NULL, "open",  (s+q1).c_str(), NULL,   NULL, SW_SHOW);
  return 0;
}


ошибки на  14,15,24,69 строках выдает но результат уже почти есть

Это сообщение отредактировал(а) kshyms - 22.12.2011, 22:21
PM MAIL WWW Skype   Вверх
bsa
Дата 12.12.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



я не хочу помогать человеку, который не хочет включить свой мозг...
PM   Вверх
kshyms
Дата 24.12.2011, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда начнем мыслить . Прежде всего чего хотим?
вывод символьной строки после набора на любом языке (русском китайском и т.д.) из MS-DOS в UTF-16 
программирование под WIN32 на dev-C++. На этом иде которым я пользуюсь это проблемно, а вот на других иде под WINDOWS это возможно с меньшими затратами?
PM MAIL WWW Skype   Вверх
bsa
Дата 24.12.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



Цитата(kshyms @  24.12.2011,  20:51 Найти цитируемый пост)
вывод символьной строки после набора на любом языке (русском китайском и т.д.) из MS-DOS в UTF-16

данное предложение не несет в себе смысла. может речь идет о конвертации, а не выводе?
Цитата(kshyms @  24.12.2011,  20:51 Найти цитируемый пост)
 На этом иде которым я пользуюсь это проблемно, а вот на других иде под WINDOWS это возможно с меньшими затратами?

ты ошибаешься. IDE лишь упрощает доступ к услугам редактора, компилятора и отладчика. На других IDE будет сложнее написать, так как придется дольше настраивать проект.
PM   Вверх
kshyms
  Дата 25.12.2011, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пусть будет конвертация но самым опримальным было бы набор и конвертация строки в UTF 16. Осталось только это объяснить компилятору
Итак два варианта постановки задачи а других вариантов нет:
1. ввод данных в стринговую переменную MS-DOS и конвертация в UTF-16
2. набор и конвертация строки в UTF 16

Добавлено @ 18:51
Да  а еще все тоже самое но под UNIX/Linux

Это сообщение отредактировал(а) kshyms - 25.12.2011, 19:07
PM MAIL WWW Skype   Вверх
xvr
Дата 25.12.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



2 kshyms: программирование, это не разновидность черной магии. Не существует книги заклинаний от программирования, и Интернет таковой книгой не является. Текст программы - это не заклинание, которое надо заучить наизусть, и не дай бог ошибиться в букве или интонации.
Любая программа в первую очередь описание некоторого алгоритма. В этом описании используются некоторые термины (имена переменных, функций, классов), которые вводятся где то в другом месте (в системных библиотеках или других модулях этой же программы). Так что, когда вам надо взять какой то кусок чужой программы и поместить его в свою, не торопитесь копировать чужой текст куда нибудь к себе, это может не сработать  smile Разберитесь, что там было написано, какие функции/переменные/классы используются и откуда они взяты. Только после этого вы сможете безболезненно взять этот кусок, или понять, что его нельзя взять, т.к. он банально не совместим с вашей программой по задействованным библиотекам.

В сообщениях об ошибках от компилятора внимательно читайте текст сообщения, обычно он пишется не от балды, а описывает, что именно не так. Почти всегда текста сообщения хватает, что бы сразу понять, в чем состоит ошибка.

Вот, например:
Код

std::string ContvertToUTF8(std::string str, std::string from) {
        map<std::string, int> codePages;
вас не настораживает, что все системные (назовем их так) классы (тут string), написаны с префиксом std::, а map - без префикса. И компилятор ругается на строку с map. Видимо std:: не просто так было написано во всех остальных местах  smile 

PM MAIL   Вверх
bsa
Дата 26.12.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



Цитата(kshyms @  25.12.2011,  19:46 Найти цитируемый пост)
1. ввод данных в стринговую переменную MS-DOS и конвертация в UTF-16

под windows нужно использовать MultiByteToWideChar(), а под Unix iconv().
PM   Вверх
kshyms
  Дата 26.12.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



библиотеках
find * | recode UTF-8..CP1251/CR-LF > list.txt Изменяет кодировку списка файлов из UTF-8 (Linux) в CP1251 (Windows), корректирует перевод строки это может пригодиться  в дальнейшем. Инет 
Цитата

Интернет таковой книгой не является. 
 это самая большая электронная книга знаний и опыта
PM MAIL WWW Skype   Вверх
xvr
Дата 27.12.2011, 18:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(kshyms @  26.12.2011,  15:36 Найти цитируемый пост)
 это самая большая электронная книга знаний и опыта 

Да, но не книга готовых программ. Не думайте, что все, что там найдется, можно не разбираясь один в один скопировать к себе в программу  smile 
PM MAIL   Вверх
kshyms
  Дата 9.1.2012, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <cmath>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <windows.h>
//конвертация строки к кодировке UTF-16 (Unicode)

std::string ContvertToLC_ALL,"UTF-16 (Unicode)(std::string str, std::string from) {
        map<std::string, int> codePages;

        codePages["LC_ALL,"UTF-16 (Unicode)"] = 1251;

        DWORD dwNum = MultiByteToWideChar(codePages[from], 0, str, -1, NULL, 0);
   
        MultiByteToWideChar(codePages[from], 0, str, -1, pwText, dwNum);
 
       
 
        std::string res = std::string(Text);
 
        //очищаем выделенную под переменные память

        delete []Text;
 
        return res;
}//*****
using namespace std;
int main ()
{
setlocale(LC_ALL,"UTF-16 (Unicode)");
int wctomb(char *out, wchar_t in);
    int simple_function(void* p, long size); // прототип
 int  a1; // объявление двух переменных a и b целого типа данных. 
cin  >> a1 ;
string q1; 
std::getline(std::cin, q1);
std::cout << escapeString(q1) << std::endl;
cout<<q1;

 return 0;
}


я не боюсь ошибаться!!!

Это сообщение отредактировал(а) kshyms - 9.1.2012, 22:00
PM MAIL WWW Skype   Вверх
bsa
Дата 10.1.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



эээ. ты хоть сам понял, что ты написал (и это без учета того, что у тебя синтаксические ошибки)? Ты связываешь с кодировкой utf-16 кодовую страницу 1251. Которая в принципе не является юникодом.
дальше, у тебя в коде появляется переменная pwText... Но она нигде не объявлена. Тоже самое и с переменной Text. Где она объявлена? Где под нее выделяется память?

Код
//namespace std { typedef std::basic_string<wchar_t> wstring; } //раскомментировать, если будет ругаться на wstring

struct CStrCmp
{
   int operator()(const char *ch1, const char *ch2) const { return strcmp(ch1, ch2); }
};

std::wstring ContvertToWide(const std::string &str, const std::string &from) {
        static std::map<const char *, int, CStrCmp> codePages;
        if (codePages.empty()) {
           codePages["utf-8"] = CP_UTF8;
           codePages["acp"] = CP_ACP;
           codePages["oem"] = CP_OEMCP;
           codePages["cp866"] = 866;
           codePages["windows-1250"] = 1250;
           codePages["windows-1251"] = 1251;
           codePages["windows-1252"] = 1252;
           codePages["utf-16"] = 1200;
           //...
        }
        std::map<const char *, int, CStrCmp>::const_iterator it = codePages.find(from.c_str());
        if (it == codePages.end())
            return std::wstring();
        DWORD size = MultiByteToWideChar(it->second, 0, str.c_str(), -1, NULL, 0);
        wchar_t *text = new wchar_t[size];
        MultiByteToWideChar(it->second, 0, str.c_str(), -1, text, size);
 
        std::wstring res(text);
 
        //очищаем выделенную под переменные память
        delete []text;
 
        return res;
}//*****


Это сообщение отредактировал(а) bsa - 10.1.2012, 13:04
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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