Другое > 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++
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии