Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ах да, можно еще написать вместо SetConsoleOutputCP другое (более портируемо, типа):
    Код (Text):
    1. #include <locale.h>
    2. #include <stdio.h>
    3.  
    4. int main()
    5. {
    6.     setlocale (LC_ALL, ".ACP");  // тоже поставит Ansi Code Page (ACP) текущего языка
    7.  
    8.     printf("Приветики\n");
    9.     return 0;
    10. }
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    KeSqueer
    Он и не хороший и не плохой. Кодировки разные бывают :)
     
  3. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    KeSqueer,
    Great

    Спасибо сделал так работает:

    Код (Text):
    1. #include <stdio.h>
    2. #include <locale.h>
    3.  
    4. int main(void)
    5. {
    6.     setlocale (LC_ALL, "Russian");  
    7.     printf("Спасибки =) \n");
    8.     return 0;
    9. }
    а так нет :dntknw:

    Код (Text):
    1. #include <stdio.h>
    2. #include <locale.h>
    3.  
    4. int main(void)
    5. {
    6.   char str[15];
    7.   setlocale(LC_ALL, "Russian");
    8.  
    9.   printf("Введите строку: ");
    10.   scanf("%s", str);
    11.   printf("%s\n", str); 
    12.  
    13.   return 0;
    14. }
    Код (Text):
    1. Введите строку: тест
    2. в?бв
    После scanf иероглифы
     
  4. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Код (Text):
    1. class X {
    2. public:
    3.     template<int quality> void f();
    4. };
    5.  
    6. template<int quality> void X::f() {
    7.     if (quality < 5)    cout << "a";
    8.     if (quality > 5)    cout << "b";
    9. }
    10.  
    11. int main() {X x;  x.f<4>;   return 0;}
    Будет ли выполнены проверки 'if (quality < 5)' и 'if (quality > 5)' при вызове f<4>(); c отключённой оптимизацией в Vsual Studio (Optimization: Disabled (/Od)) ?

    Будет ли скомпилирован/выполнен лишний код? (необходимо максимально ускорить алгоритм)
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    К примеру здесь генерируется оптимальный код и без оптимизации, но надо в inline function expansion включить что-то отличное от дефолта.
    Код (Text):
    1. #include <iostream>
    2.  
    3. template<bool val>
    4. struct do_cmp2
    5. {
    6.     inline static void f ()
    7.     {
    8.         std::cout<<"less"<<std::endl;
    9.     }
    10. };
    11.  
    12. template<>
    13. struct do_cmp2<true>
    14. {
    15.     inline static void f ()
    16.     {
    17.         std::cout<<"bigger"<<std::endl;
    18.     }
    19. };
    20.  
    21. template<int val>
    22. struct do_cmp
    23. {
    24.     inline static void f ()
    25.     {
    26.         do_cmp2<(val > 0)>::f();
    27.     }
    28. };
    29.  
    30. template<>
    31. struct do_cmp<0>
    32. {
    33.     inline static void f ()
    34.     {
    35.         std::cout<<"equal"<<std::endl;
    36.     }
    37. };
    38.  
    39. template<int val>
    40. struct cmp
    41. {
    42.     static void f ()
    43.     {
    44.         do_cmp<(val - 5)>::f();
    45.     }
    46. };
    47.  
    48. int main (int argc, char* argv[])
    49. {
    50.     cmp<6>::f();
    51. }
     
  6. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Добрый вечер.

    Подскажите пожалуйста, как работает указатель на указатель?

    Есть у меня к примеру кусок кода:

    Код (Text):
    1. template < class NODETYPE > void Tree < NODETYPE >::insertNodeHelper( TreeNode< NODETYPE > **ptr, const NODETYPE &value ) {
    2.     if( *ptr == 0 )
    3.         *ptr = new TreeNode < NODETYPE > ( value );
    4.     else {
    5.         if( value < ( *ptr )->data )
    6.             insertNodeHelper( &( ( *ptr )->leftPtr ), value );
    7.         else {
    8.             if( value > ( *ptr )->data )
    9.                 insertNodeHelper( &( ( *ptr )->rightPtr ), value );
    10.             else
    11.                 std::cout << value << " dup" << std::endl;
    12.         }
    13.     }
    14. }
    TreeNode< NODETYPE > **ptr - это указатель на указатель.

    Код (Text):
    1. if( *ptr == 0 )
    Здесь мы его разыменовуем и получаем еще указатель и сравниваем с нулем.

    Но не ясно зачем нужны указатели на указатели?
    Может есть доступный материал по этой теме(именно указатели на указатели и как с ним работать)?

    Благодарю.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    bug1z
    В коде всё и показано.
    Код (Text):
    1. template < class NODETYPE > void Tree < NODETYPE >::insertNodeHelper( TreeNode< NODETYPE > **ptr, const NODETYPE &value ) {
    2.     if( *ptr == 0 )
    3.         *ptr = new TreeNode < NODETYPE > ( value );
    new возвращает указатель на TreeNode< NODETYPE > и этот указатель записывается в значение *ptr, которое является указателем на TreeNode< NODETYPE >.
     
  8. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Но мне не понятен сам принцип работы.

    insertNodeHelper принимает аргументы:
    Код (Text):
    1. insertNodeHelper( &rootPtr, value );
    rootPtr объявлен как:

    Код (Text):
    1. TreeNode < NODETYPE > *rootPtr;
    если сделать так:

    Код (Text):
    1. std::cout << rootPtr << "          " << &rootPtr;
    То значения будут разные. Почему?

    Ведь rootPtr - содержит АДРЕС. А если применить оператор взятия адреса к адресу - что мы получим? Не пойму.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    bug1z
    Код (Text):
    1. То значения будут разные. Почему?
    В одном случае значение rootPtr, в другом адрес rootPtr.

    Код (Text):
    1. А если применить оператор взятия адреса к адресу - что мы получим?
    Нету там такого. В rootPtr хранится указатель(адрес) другой переменной. Мы берём адрес rootPtr и предаём его в функцию. Функция записывает в rootPtr свой указатель. Если бы мы передавали не указатель rootPtr, а значение rootPtr, то мы бы не смогли поменять значение этой переменной в функции.
     
  10. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    rootPtr прежде всего переменная и брать у нее адрес это самая обычная операция во вторую очередь мы получаем указатель не на int как было бы для простой переменной а на указатель
     
  11. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Все понял. Огромное спасибо!
     
  12. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Хотелось бы считать все int'ы из входного потока и заполнить ими вектор. Такой код корректен?
    Код (Text):
    1. vector<int> v;
    2. int t;
    3. cin >> t;
    4. while (!cin.eof()) {
    5.     v.push_back(t);
    6.     cin >> t;
    7. }
     
  13. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Кому интересно, нашёл решение:

    Код (Text):
    1. template<class T> class proc_add {
    2.     T& v;
    3. public:
    4.     proc_add(T& v): v(v) {}
    5.     void operator()(const typename T::value_type& x) {
    6.         v.push_back(x);
    7.     }
    8. };
    9.  
    10. int main(void) {
    11.     vector<int> v;
    12.     for_each(istream_iterator<int>(cin), istream_iterator<int>(), proc_add< vector<int> >(v));
    не знаю, насколько грамотный здесь применён подход.
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    slavanap
    вообще-то еще проще :)
    Код (Text):
    1. vector< int > v;
    2. copy( istream_iterator< int >( cin ), istream_iterator< int >(), back_inserter( v ) );
     
  15. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Нужно читать числа из потока std::cin, пока считанных символов не будет определенное количество. Для определённости, скажем, 100. Как это сделать?
    std::cin.get(tmp, 100) читает до первого newline character (если задать модификатор skipws, иначе до первого white space).
    std::cin.tellg() возвращает -1, что неудивительно.
     
  16. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Нужно было всего-то использовать std::cin.read().
     
  17. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Код (Text):
    1. #include <iostream>
    2. #include <string>
    3. #include <algorithm>
    4. #include <iterator>
    5. using  namespace std;
    6.  
    7. int main(){
    8.     char data[10]={0};
    9.     string s(data,data+sizeof(data));
    10.     copy_n(istream_iterator<char>(cin),s.size(),s.begin());
    11.     cout <<s ;
    12.            return 0;
    13.  
    14. }
    вот например как-то так)))
     
  18. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    h0t
    Решил подобным образом:
    Код (Text):
    1.   char str[256*1024];
    2.  
    3.   std::cin.read(str, _countof(str));
    4.  
    5.   std::istringstream ss(str);
    6.   std::vector<long long> a;
    7.   std::copy(
    8.       std::istream_iterator<long long>(ss),
    9.       std::istream_iterator<long long>(),
    10.       std::back_inserter(a));
     
  19. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Добрый вечер.

    Не подскажите название какого нибудь не особо сложного проекта на С++(именно ++, а не С) с хорошо спроектированной архитектурой, исходники которого, разумеется, можно посмотреть.

    Так сказать, чтобы выла видна вся суть ООП.

    А то пытался писать что то отличное от обычных университетских задачек и как то не очень с проектированием выходит. Хотелось бы на реальном примере посмотреть, как оно должно быть.

    Мой уровень знаний: Прочитана книга Харви Дейтела и 400 страниц новой книги страуструпа.
    Из не стандартных библиотек знаю, быть может, только FLTK.

    Спасибо.
     
  20. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    bug1z
    Вряд ли такое существует. Ибо С++ создавался именно для больших проектов, в небольших с ООП особо и не стоит заморачиваться.
    Из нестандартных библиотек, самая стандартная - boost. Разобраться в ней вряд ли получится даже ее создателям :) , но внешнюю сторону стоит оценить. На ту же тему, только попроще - Loki от Александреску, описание от автора есть на русском - "Современное проектирование на С++". Правда, там не столько ООП сколько обобщенное и мета- программирование. В принципе, можно рассматривать как краткое описание проектирование библиотеки. Правда, человеку неопытному может грозить вывихом мозгов :):)