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

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

  1. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.298
    Адрес:
    Ukraine
    twgt
    в msvcrt.dll
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Спасибо, попробую. Только как его экспортировать(не вручную), если и ntdll.lib и msvcrt.lib в проекте, а при убирании опции /nodefaultlib линкуется с msvcrt90.dll, я пока не знаю....
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.298
    Адрес:
    Ukraine
    Создай свою либу.
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Взял msvcr71.dll и переименовал в msvcr90.dll, хотя можно и exe пропатчить.

    Зы. Кто-нибудь мне скажет что означает:
    т.е. #J ???

    Сам выяснил. Там корень из отрицательного числа брался и в FPU стак попадала -1
     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.943
    twgt
    А еще можно поключить корректнорисующие флоаты сорцы sprintf-а к проекту..

    Ой, не посмотрел на часы..
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    _basmp_
    А подробнее?!

    У меня всё лето впереди =)
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.787
    скажите, как можно проинициализировать вектор строк?
    std::vector< std::string > v;
    хочется его сразу же инициализировать, скажем, строками "cat", "dog", "bird".
     
  8. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    varnie
    м.б. std::vector< std::string > v = { "cat", "dog", "bird" }; ?
     
  9. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.943
    twgt
    Ну не знаю.. Можно взять реализацию принтф-а из опенваткомовских сорцов или сорцов мсвс слиб. Перековырять ее как вам по душе. Назвать по другому. После последнего инклуда дефайнуть ее в принтф. И все.
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.787
    Xerx
    не работает. насколько я знаю, это некорректная запись.
    работает следующее:
    Код (Text):
    1.        namespace{  
    2.             char *k_init[] = {"cat", "dog", "bird"
    3.         };
    4.        }
    5.         class A{
    6.             static const std::vector< std::string> _v;
    7.         };
    8.          const std::vector< std::string > A::_v(k_init, k_init+sizeof(k_init)/sizeof(k_init[0]));
    хотя и выдает варнинг:
    на строчку инициализации простого сишного массива элементами

    собственно говоря, у std::vector доступно 4 конструктора, считая конструктор по-умолчанию:
    Код (Text):
    1.       //@brief  Default constructor creates no elements.
    2.       explicit
    3.       vector(const allocator_type& __a = allocator_type())
    4.       : _Base(__a)
    5.       { }
    6.  
    7.       /**
    8.        *  @brief  Create a %vector with copies of an exemplar element.
    9.        *  @param  n  The number of elements to initially create.
    10.        *  @param  value  An element to copy.
    11.        *
    12.        *  This constructor fills the %vector with @a n copies of @a value.
    13.        */
    14.       explicit
    15.       vector(size_type __n, const value_type& __value = value_type(),
    16.          const allocator_type& __a = allocator_type())
    17.       : _Base(__n, __a)
    18.       {
    19.     std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
    20.                       _M_get_Tp_allocator());
    21.     this->_M_impl._M_finish = this->_M_impl._M_start + __n;
    22.       }
    23.  
    24.       /**
    25.        *  @brief  %Vector copy constructor.
    26.        *  @param  x  A %vector of identical element and allocator types.
    27.        *
    28.        *  The newly-created %vector uses a copy of the allocation
    29.        *  object used by @a x.  All the elements of @a x are copied,
    30.        *  but any extra memory in
    31.        *  @a x (for fast expansion) will not be copied.
    32.        */
    33.       vector(const vector& __x)
    34.       : _Base(__x.size(), __x._M_get_Tp_allocator())
    35.       { this->_M_impl._M_finish =
    36.       std::__uninitialized_copy_a(__x.begin(), __x.end(),
    37.                       this->_M_impl._M_start,
    38.                       _M_get_Tp_allocator());
    39.       }
    40.  
    41.       /**
    42.        *  @brief  Builds a %vector from a range.
    43.        *  @param  first  An input iterator.
    44.        *  @param  last  An input iterator.
    45.        *
    46.        *  Create a %vector consisting of copies of the elements from
    47.        *  [first,last).
    48.        *
    49.        *  If the iterators are forward, bidirectional, or
    50.        *  random-access, then this will call the elements' copy
    51.        *  constructor N times (where N is distance(first,last)) and do
    52.        *  no memory reallocation.  But if only input iterators are
    53.        *  used, then this will do at most 2N calls to the copy
    54.        *  constructor, and logN memory reallocations.
    55.        */
    56.       template<typename _InputIterator>
    57.         vector(_InputIterator __first, _InputIterator __last,
    58.            const allocator_type& __a = allocator_type())
    59.     : _Base(__a)
    60.         {
    61.       // Check whether it's an integral type.  If so, it's not an iterator.
    62.       typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    63.       _M_initialize_dispatch(__first, __last, _Integral());
    64.     }
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    varnie
    Извиняюсь.

    Так можно инициализировать обычные массивы. И почему ругается на char *k_init[] = {"cat", "dog", "bird" }; не понятно.
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    считать, что строковые литералы типа "char*" в плюсплюсе скрепя сердце решили в свое время для совместимости с Си. По смыслу-то оно вроде как "const char*", и компилятор при оптимизации может этим пользоваться. Поэтому в данном случае (и вообще, если нет на то особых оснований) лучше написать const char* k_init[] = {"cat", "dog", "bird" };
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.787
    Ustus
    верно. я уже разобрался.
     
  14. landrey

    landrey New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    2
    Подскажите, как можно изменить размерность enum?
    Имею следующее:
    Код (Text):
    1. enum TMonitorCommand
    2. {
    3. MC_1,
    4. MC_2,
    5. MC_3
    6. }
    7.  
    8. #pragma pack(push, 1)
    9. struct TMonitorHeader
    10. {
    11. TMonitorCommand Command;    // должен быть 1 байт !
    12. uint8_t Length;
    13. };
    14. #pragma pack(pop)
    Компилятор VC6 ставит размерность enum как у int (4 байта). Где-то в инете находил, что есть директива
    Код (Text):
    1. #pragma enum=1
    но не помогло и в MSDN про это ничего не нашел.
    Как это можно обойти?
     
  15. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Код (Text):
    1. enum : char TMonitorCommand
    А вообще, как можно было не найти?
    Там же прямо в начале страницы про enum написано, насколько я помню.
     
  16. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    530
    Адрес:
    Russia
    Как правильно конвертить строки из юникода и обратно?
    Например, как делаю я:
    Код (Text):
    1. wchar_t strw[100];
    2. char str[100];
    3. int i;
    4.  
    5. wcscpy(strw,_T("тестовая строка"));
    6. for(i=0; i<wcslen(strw); i++)
    7. {
    8.     str[i] = strw[i];
    9. }
    10. str[wcslen(strw)] = 0;
    что-то стали вкрадываться сомнения, что это не совсем верно. Может быть, есть способы покрасивее?
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    функции из CRT:
    wcstombs
    mbstowcs
     
  18. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    помогити с выводом десятичным.

    вопщем абсолютно никакой траблы, просто.. вот
    Код (Text):
    1. void PrintHex (long val)
    2. {
    3.   signed char i, ch;
    4.  
    5.   for (i = 7; i > -1; i--)
    6.   {
    7.     ch=val>>(i*4)&0xf|0x30;
    8.     if (ch > 0x39) ch+=7;
    9.     printf ("%c",ch ); // int21 (0x200, ch);
    10.  
    11.   }
    12.     printf ("\n");// int21(0x200,0xA);  int21 (0x200,0xD);
    13. }
    14. void main()
    15. {
    16.   PrintHex(0x12345678);
    17. }
    хочу тоже самое тока с выводом десятичным, а то printf в условиях суровово Mode Reale трудно-доступен.
     
  19. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    а, всё, нашел хорошее решение:
    Код (Text):
    1. void PrintDec (long val)
    2. {
    3.   int i,acc; char ch;
    4.  
    5.   acc = 0;
    6.  
    7.   for (i = 0; i < 8; i++)
    8.   {
    9.    ch = val % 10;
    10.    acc = acc | ch << i*4;
    11.    val = val / 10;
    12.   }
    13.    PrintHex(acc);
    14. }
    спасибо мне :)

    ps.
    и да - Real'ность оказалась более ужасной чем предпологалось - кодогенерация под 16бит изобилует костылявыми хитами в RTL либы в местах
    Код (Text):
    1.    ch = val % 10; //вызов __ULDIV@ или  __U4D
    2.    val = val / 10; //вызов  __ULDIV@ или  __U4D
    поэтому окончательное решение стало комбинированым (Cи и Asm):
    Код (Text):
    1. char DivMod10(unsigned long *val)
    2. {
    3. _asm{ push bx
    4.       mov bx, val
    5.       mov eax,[bx]
    6.       xor ecx,ecx
    7.       mov cl, 10
    8.       cdq
    9.       idiv ecx
    10.       mov [bx],eax
    11.       mov al,dl
    12.       pop bx
    13.     }
    14. }
    15.  
    16. void PrintDec (unsigned long val)
    17. {
    18.   unsigned char i,ch;  unsigned long acc=0;
    19.   for (i = 0; i < 8; i++)
    20.   {
    21.    ch = DivMod10(&val);
    22.    acc |= (long) ch << i*4;
    23.   }
    24.    PrintHex(acc);
    25. }
     
  20. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.787
    укажите, плз, как элегантно разрулить:

    есть классы A и B. оба могут выбрасывать исключения CMyException, конструктору которых отдается 2 параметра (позиция и само сообщение). класс A использует класс B, но на "уровне" класса B ничего не известно об позиции, следовательно, он выбрасывает исключения CMyException с дефолтным первым параметром для конструктора, которое (исключение) уже выше ловится классом A, и вот здесь нужно каким-то макаром дополнить это исключение параметром-позицией, и перевыбросить его выше.
    не знаю как бы все это поестественней реализовать, т.к. сама идея с ловлей и перевыбросом исключения меня не особо устраивает — ИМХО слишком много телодвижений. спасибо за подсказки.