| Другое > Hard'n'Soft |
| Програмирование на C++ |
| (1/25) > >> |
| gepar:
Решил создать ещё и такую тему, может кто ещё из начинающих подтянется :) До этого была по паскалю и ассемблеру, их уже выучил и теперь вот начинаю изучать c++. Ещё раз спасибо тем кто помогал тогда ( HardWareMan, topos84, Vegas, EdHell,Йобан Матич, ...) Хотелось бы услышать пару советов, как для начинающего. Хотя я уже и нашёл себе более-менее подходящий компилятор (gnu c++ для виндовс) и книжку в электронном виде (Дейтела 5е издание, если кто знает где в электронном виде есть 6е на русском то ... вы меня поняли), но всё же может есть и что получше для новичков. В общем-то из актуальных проблем у меня сейчас то что русские буквы в консольных приложениях не выводятся :( Что где покрутить чтобы было иначе? Компилировал как в VS2010 так и в gnu c++, результат одинаковый - кракозябры при выводе (в редакторе конечно всё ок). На гугл только не посылайте, выгуглить получилось что-то странное на тему изменения хитрым способом шрифта в консоли на Lucila на 46 строк кода и так каждый раз... в общем изврат я какой-то нагуглил, думаю есть способ полегче. Откройте тайну пожалуйста кто уже знает c++. |
| BmpCorp:
А это и не с консолью проблема, это досовская кодировка. Вместо обычного вывода типа --- Код: ---str = "Текст"; cout << str; --- Конец кода --- используй --- Код: ---AnsiToOem("Текст", str); cout << str; --- Конец кода --- Должно сработать. Возможно, правда, что придётся подключить <windows.h>. Добавлено позже: Для обратного преобразования при вводе используй функцию OemToAnsi. Работает аналогично. |
| HoRRoR:
C++ тут не при чём, это особенности Windows, а конкретно - консоли и её кодировки. |
| Chameleon:
У меня есть файлик исправляющий кракозябры, прикрепляю, не помню как,то ли кодировку меняет то ли что но работает........ После запуска предложит нажать любую клавишу, правда кракозябрами. После этого надо перегрузить машину. |
| Mr2:
--- Цитата: gepar от 22 Январь 2011, 20:42:34 ---В общем-то из актуальных проблем у меня сейчас то что русские буквы в консольных приложениях не выводятся :( Что где покрутить чтобы было иначе? --- Конец цитаты --- --- Код: ---#include <iostream> using namespace std; char bufRus[256]; char* rus(const char* text) { CharToOem(text, bufRus); return bufRus; } int main(){ cout << rus("Хелоу Рашин")<<endl; system ("pause"); } --- Конец кода --- |
| HoRRoR:
Как вариант - можно создать свой объект cout с оператором <<, где будет вызываться CharToOem и отправляться в std::cout. То же самое для printf/puts. |
| AjaxVS:
--- Цитата: gepar ---Хотелось бы услышать пару советов, как для начинающего. --- Конец цитаты --- забей на gnu c++, юзай легальный VS2008EE (2010 - если религия позволяет выделять 800mb памяти на редактор кода ^^), привыкай, но не юзай фреймворки, System.*. из книжек - есть неплохой pdf "Как выучить c++ за 21 день", потом Шилдт и Страустрап (все легко находится и качается). http://www.cplusplus.com/ и http://google.com/codesearch в закладки. ну и все, собственно. |
| gepar:
AjaxVS, я поставил 2010, но ... в общем с ней, пардон, трахаться много приходиться, внезапно в программе, которая только то и делает что выводит текст она находит более 100 ошибок! Что-то там с символьной константой. Сначала она вовсе у меня ничего не компилировала, я целый час и так и эдак создавал новые проэкты но напрасно, а потом ВНЕЗАПНО всё стало ок. Я открыл старый проэкт что не компилировался и он тоже откомпилировался, в чём проблема была - непонятно, ошибки до этого были связаны с тем что vs не понимала строчку операторов типа cout, cin, ну в общем те что от iostream. Ну и она какой-то такой подробный отчёт даёт по каждой проблеме, у меня там мини приложение с парой классов, а она мне отчёт на >100 строк бабах. Хотя я ещё толком ею не пользовался, попробую ещё снова с ней подружиться, но мне кажется для консольных приложений vs это как из пушки по воробьям :) Ну а вообще я сейчас использую Codeblocks, но компилирую через gnu c++ так как Codeblocks не имеет совего компилятора, а через vs 2010 долго будет компилировать. --- Цитата: AjaxVS ---Как выучить c++ за 21 день --- Конец цитаты --- Такое есть, меня название напугало, не люблю я книги обещающие за короткий срок научить чему-то. Вывод русского текста сейчас попробую темы методами что вы написали, меня больше удивляет почему изначально он не выводится нормально, неужто майкрософту сложно было это сделать, хотя ... командная строка в виндовс же может выводить русский текст, почему тогда моё консольное приложение не может? Mr2, на твой код ругается мол CharToOem необъявлен и впервые используется. UPD: добавив #include <windows.h> перестало ругаться и вывело нормально и на русском. Теперь бы ещё понять как твоя комбинация работает, я с таким объявлением --- Код: ---char* rus(const char* text) --- Конец кода --- не знаком, не прокомментируешь немножко, плз. |
| Mr2:
--- Цитата: gepar от 23 Январь 2011, 00:44:00 ---Вывод русского текста сейчас попробую темы методами что вы написали, меня больше удивляет почему изначально он не выводится нормально, неужто майкрософту сложно было это сделать, хотя ... командная строка в виндовс же может выводить русский текст, почему тогда моё консольное приложение не может? --- Конец цитаты --- Видимо у ВинДус и ДОС разные кодировки. --- Цитата: gepar от 23 Январь 2011, 00:44:00 ---Mr2, на твой код ругается мол CharToOem необъявлен и впервые используется. UPD: добавив #include <windows.h> перестало ругаться и вывело нормально и на русском. --- Конец цитаты --- У меня без <windows.h> всё скомпилировалось.(Компилятором Dev C++) --- Цитата: gepar от 23 Январь 2011, 00:44:00 ---Теперь бы ещё понять как твоя комбинация работает, я с таким объявлением --- Код: ---char* rus(const char* text) --- Конец кода --- не знаком, не прокомментируешь немножко, плз. --- Конец цитаты --- Объявление по всей видимости является определением. Функция получает текст, обрабатывает eго в CharToOem кладёт в массив char bufRus[256] и возвращяет результат в int main(); Оператор cout << выводит полученный результат. Вроде так.Не интересовался как эта функция работает,просто использовал её. Когда понадобилось выводить текст из файла написал свою функцию перекодировки. Нужно прибавить к символам определённое число и они будут выводиться корректно. |
| HoRRoR:
--- Цитата ---забей на gnu c++, юзай легальный VS2008EE --- Конец цитаты --- Обоснуй сей выбор. --- Цитата ---У меня без <windows.h> всё скомпилировалось.(Компилятором Dev C++) --- Конец цитаты --- Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам. |
| MetalliC:
gepar, честно говоря не вижу смысла под виндой пользовать GNU-компиляторы, собрать проэкт под ними конечно можно, но отлаживать под VS в разы удобнее. |
| gepar:
--- Цитата: HoRRoR ---Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам. --- Конец цитаты --- А ещё он гадостно работает на 7ке x64 (внезапные вылеты, зависания при попытке отображения подсказок, начальная загрузка больше чем у vs2010), из под XP работает хорошо, но я под XP захожу в основном только чтобы поиграть в старые игрушки. Ксати порт gnu c++ под винду (этот MinGW) я и использую для компиляции, Codeblocks изначально его подхватил. У меня ещё был борландовский компилятор, но я с ним не разобрался да и не сильно то хотелось так что я его через 5 мин. удалил чтобы нервы мне не портил. MetalliC, да я понимаю, но я ко многому не могу привыкнуть в этой vs. Начнём с того что я так и не нашёл пункта по запуску откомпилированного приложения так что я переходил в папку с проэктом и запускал exe'шник оттудова. Самому не верится что в vs2010 пункта "откомплировать и запустить" нет, но я его не нашёл, куда его запрятали? Да и зачем вообще было его прятать, стоило наоборот его вынести на панель вверху так как им то я уж точно часто пользоваться буду. + если открыть исходный код через vs (проассоциировать cpp файл с vs2010) то его вообще нельзя откомпилировать, половина пунктов попросту затемнены. Зачем это сделано? o_0 Чтобы я просто посмотрел исходник в vs и не мог с ним ничего сделать чтоли, так я это и текстовым редактором сделать могу. Chameleon,патч кстати не работает под 7кой (несмотря на то что все файлы ему удаётся заменить), под xp ещё попробую ради интереса. Ещё маленький вопрос: как сортировать текст в заданном поле (setw) выводимый через cout по центру? left/right от iomanip работает, а center (ну это я по логике решил что должно бы быть center :) ) - нет. |
| MetalliC:
gepar, зеленую кнопку видишь ? |
| gepar:
MetalliC, это отладка, мне было бы достаточно простого запуска :) Хотя с этим можно смириться, но вот с непонятными ошибками в vs2010 я смириться не могу. Вот например программа генерирует числа, всё ок, gnu c++ компилирует без ошибок и предупреждений. Ctrl+с, ctrl+v. Тада, vs2010 нашла ошибки: --- Код: ---"Test.exe": Загружено: "C:\Users\Gepar\Documents\Visual Studio 2010\Projects\Test\Debug\Test.exe", Символы загружены. "Test.exe": Загружено: "C:\Windows\SysWOW64\ntdll.dll", Невозможно найти или открыть файл PDB "Test.exe": Загружено: "C:\Windows\SysWOW64\kernel32.dll", Невозможно найти или открыть файл PDB "Test.exe": Загружено: "C:\Windows\SysWOW64\KernelBase.dll", Невозможно найти или открыть файл PDB "Test.exe": Загружено: "C:\Windows\SysWOW64\msvcr100d.dll", Символы загружены. "Test.exe": Загружено: "C:\Windows\SysWOW64\msvcp100d.dll", Символы загружены. Программа "[3540] Test.exe: Машинный код" завершилась с кодом 0 (0x0). --- Конец кода --- За второй попыткой ( код не менял, тупо нажал ещё раз F7): --- Код: ---1>------ Построение начато: проект: Test, Конфигурация: Debug Win32 ------ 1>Построение начато 23.01.2011 12:41:16. 1>InitializeBuildStatus: 1> Обращение к "Debug\Test.unsuccessfulbuild". 1>ClCompile: 1> Для всех выходных данных обновления не требуется. 1> Test.cpp 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(3): warning C4627: #include <iostream>: пропущен при поиске использования предкомпилированного заголовка 1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(7): warning C4627: #include <iomanip>: пропущен при поиске использования предкомпилированного заголовка 1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(10): warning C4627: #include <cstdlib>: пропущен при поиске использования предкомпилированного заголовка 1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(44): fatal error C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include "StdAfx.h"" в источник. 1> 1>СБОЙ построения. 1> 1>Затраченное время: 00:00:00.32 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== --- Конец кода --- Добавляю #include "StdAfx.h" (ну раз уж VS так настаивает). Тада: --- Код: ---1>------ Построение начато: проект: Test, Конфигурация: Debug Win32 ------ 1>Построение начато 23.01.2011 12:42:18. 1>InitializeBuildStatus: 1> Обращение к "Debug\Test.unsuccessfulbuild". 1>ClCompile: 1> Для всех выходных данных обновления не требуется. 1> Test.cpp 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(3): warning C4627: #include <iostream>: пропущен при поиске использования предкомпилированного заголовка 1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(4): error C2001: newline в константе 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(5): error C2039: cout: не является членом "std" 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(5): error C2873: cout: использование символа в "using"-объявлении не допускается 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(6): error C2039: endl: не является членом "std" 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(6): error C2873: endl: использование символа в "using"-объявлении не допускается 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(20): error C2065: cout: необъявленный идентификатор 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(24): error C2065: cout: необъявленный идентификатор 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(24): error C2065: endl: необъявленный идентификатор 1> 1>СБОЙ построения. 1> 1>Затраченное время: 00:00:01.06 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== --- Конец кода --- VS Опять не может понять всё что я подключил, ошибки пока ещё понятные. Убираю using std::cout, using std::endl из заголовка и дописываю using namespace std (ведь именно на них VS заматерилась как я понял) Тада: --- Код: ---1>------ Построение начато: проект: Test, Конфигурация: Debug Win32 ------ 1>Построение начато 23.01.2011 12:44:02. 1>InitializeBuildStatus: 1> Обращение к "Debug\Test.unsuccessfulbuild". 1>ClCompile: 1> Для всех выходных данных обновления не требуется. 1> Test.cpp 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(3): warning C4627: #include <iostream>: пропущен при поиске использования предкомпилированного заголовка 1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(4): error C2001: newline в константе 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(17): error C2065: cout: необъявленный идентификатор 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(21): error C2065: cout: необъявленный идентификатор 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(21): error C2563: несоответствие в списке формальных параметров 1>c:\users\gepar\documents\visual studio 2010\projects\test\test\test.cpp(21): error C2568: <<: не удается разрешить перегрузку функции 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(1021): может быть "std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)" 1> with 1> [ 1> _Elem=unsigned short, 1> _Traits=std::char_traits<unsigned short> 1> ] 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(1011): или "std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)" 1> with 1> [ 1> _Elem=wchar_t, 1> _Traits=std::char_traits<wchar_t> 1> ] 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(1003): или "std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)" 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(977): или "std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)" 1> 1>СБОЙ построения. 1> 1>Затраченное время: 00:00:00.90 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== --- Конец кода --- Получившиеся ошибки меня заводят в ступор так как что это, куда это, зачем это, а главное как это решить я понять не могу. Мне, как начинающему, вся эта ерунда с char ничего не говорит, хотя бы потому что у меня в программе нет ничего с символьным типом. Какого оно вообще такое выходит когда этот же код (без директивы от vs #include "StdAfx.h" естественно) по прежнему комплируется gnu c++ мне не понятно.Может подскажешь, как пользователь VS 2010, что и где нужно накрутить чтобы VS не выделывалась вот так с нормальным кодом. Ато если я буду что-то делать в VS2010 сразу я ведь решу что это с моей программой что-то не так раз вылетают ошибки и буду как идиот сидеть и искать ошибки в работающем коде. Я поначалу так и думал что это я настолько кривой код пишу что даже не могу "Hello world" вывести, но потом скачал gnu c++ и оказалось что код то какраз нормальный. Я хотел бы научиться всё же работать и в vs2010 но пока, как видишь, она со мной дружить не хочет. |
| Mr2:
--- Цитата: HoRRoR от 23 Январь 2011, 12:14:24 ---Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам. --- Конец цитаты --- Поняно. ;) --- Цитата: gepar от 23 Январь 2011, 13:11:33 ---из под XP работает хорошо, но я под XP захожу в основном только чтобы поиграть в старые игрушки. --- Конец цитаты --- Ну так заходи чтоб проги писать. :D |
| MetalliC:
gepar, залей куда-нибудь свой исходник, а то по error-log не совсем понятно |
| gepar:
MetalliC, это был один из примеров из книги Дейтела. Добавлено позже: Мне вообще кажется что дело в этих "прекомпилированных заголовках", я вот отключил эту штуку включённую по умолчанию и пример скомпилировался даже без #include "stdafx.h" и не ругаясь на использование операторов вывода и прочего. Вопрос в том что же делают эти "прекомпилированные заголовки" и зачем они включены тогда? |
| Planestranger:
gepar, я чесгря давно уже C++ не касался... и всё больше C# под VS2010 мучаю... но есть такой момент. гнутый C++ по всем отрытым стандартам и т.п. заметно отличается от объектно-ориентированного Visual C++ в среде от мелкомягких. и оба они отличаются от C++ продвигаемого Borland. не могу сказать, насколько сильно они расходятся в последних ревизиях языков. но раньше не компилирующаяся в одной среде программа, перенесённая из другой, - это нормальное естественное явление. и дело не в том, что VS такая плохая... |
| gepar:
lost_hero, ну если бы у меня был серъёзный проэкт то тут бы удивляться конечно не стоило что он на одном компиляторе компилируется, а на другом нет. И всё же что за прекомпилированный заголовок? Он ведь в новых проэктах по дефолту включён, вы что пользуетесь и не задумываетесь что это? :) Гугл как-то умалчивает что это. |
| AjaxVS:
--- Цитата: gepar ---один из примеров из книги Дейтела --- Конец цитаты --- а этот Дейтел остряк :lol: --- Код: ---#include <iostream> using std::cout; using std::endl; #include <iomanip> using std::setw; #include <cstdlib> // contains function prototype for rand using std::rand; --- Конец кода --- пипец, а если надо было бы юзать 100 функций из std, он бы все их с using упоминал? <_< вот поэтому я ни одной книжки по программированию и не прочитал - чушь всякую пишут.. значит, что делать, чтобы не было непонятных ошибок: в VS2008 (как уже было написано, VS очень удобен для отладки прог): File -> New -> Project: Win32 -> Win32 Console App: Next -> Empty Project (галка), Console App (выбор) -> Finish теперь в Solution Explorer: правой кнопкой на Source Files -> Add -> New Item Code -> C++ File вводишь имя (main.cpp), жмешь Add в новом файле: --- Код: ---#include <iostream> #include <cstdlib> using namespace std; int main() { for ( int counter = 1; counter <= 20; counter++ ) { cout << " " << ( 1 + rand() % 6 ); if ( counter % 5 == 0 ) cout << endl; } char c; cin >> c; return 0; } --- Конец кода --- захочешь добавить WinApi, дописываешь --- Код: ---#include <windows.h> --- Конец кода --- и в коде можно юзать функции типа --- Код: ---MessageBox(0, "blablabla", "bla", 0); --- Конец кода --- и чтобы не возникало ошибок типа --- Код: ---error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [10]' to 'LPCWSTR' --- Конец кода --- идешь в Project->...Properties->Configuration->General->CharacterSet: ставишь Use MultiByte и радуешься C++ |
| Навигация |
| Главная страница сообщений |
| Следующая страница |