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

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

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    MirrorBlack
    Я же написал почему, потому что доступ к __int64 компилятор выравнивает на его же размер.
     
  2. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Booster
    Ослеп под вечер :)
    Как отключить выравнивание в структурах нашёл - #pragma pack(1)
    А как его обратно включить? Т.е. выставить значение "По умолчанию"?
    И что криминального произойдёт если я поменяю структуру FILETIME?
    Понятно что мой исходник уже так просто не скомпилируеш, зато мне удобно будет.
     
  3. BigGreen

    BigGreen New Member

    Публикаций:
    0
    Регистрация:
    19 май 2009
    Сообщения:
    34
    MirrorBlack
    Код (Text):
    1. #pragma pack(push)
    2. #pragma pack(align)
    3. //... type decls
    4. #pragma pack(pop)
    или
    Код (Text):
    1. #pragma pack(push, align)
    2. //... type decls
    3. #pragma pack(pop)
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Или просто:
    #pragma pack(align)
    #pragma pack()

    Хозяин барин, но это просто неудобно и дико. Оптимизируем? ^)
     
  5. SCARHAND

    SCARHAND New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    6
    Как в С++ огромное число с плавающей точкой, с точностю до 30 числа после запитой, можна записать в файл? Lопустим у меня есть число p = 3.141414141414141414141242434343 Или это всё нужно делать на асемблере?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    SCARHAND
    Бери бинарное представление и пиши.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SCARHAND
    Как любой буффер. Взять и записать.
    Насчет С++а не скажу точно, ибо не знаю тонкостей, а в Си пишется легко через fwrite / write / WriteFile / ZwWriteFile
     
  8. SCARHAND

    SCARHAND New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    6
    делал вот так:
    #include <stdlib.h>
    #include <stdio.h>

    int main( void )
    {
    int decimal, sign;
    char *buffer;
    int precision = 20;
    long double source = 3.1415926535312312312313;

    buffer = _ecvt( source, precision, &decimal, &sign ); // C4996
    // Note: _ecvt is deprecated; consider using _ecvt_s instead

    }
    выводит только 17 цифр дальше нули и не показывает запитую,делат только строку с чисел.
     
  9. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Очередной "интелектуальный" вопрос.
    Как в отладчике VC++ 2008 запустить программу от имени другово пользователя.
    Пока делаю по деревенски __asm{int 3}. Может есть менее варварский способ?
     
  10. dmicarus

    dmicarus New Member

    Публикаций:
    0
    Регистрация:
    25 май 2009
    Сообщения:
    17
    Есть ли в плюсах возожность узнать тип объекта? Например у меня есть шаблон функции работающий с контерйнером и параметризируемый по типу контейнера. Хочу для конкретного контейнера - вектора (как наиболее часто используемого) сделать процедуру прохода элементов не через итераторы или for_each,а таким образом для увеличения перформанса :
    Код (Text):
    1. T* pElem = &vec[0];
    2. int count = vec.size();
    3. for (int i = 0; i < count; ++i)
    4. {
    5. /*
    6.     use *pElem
    7.    ...
    8. */
    9.     ++pElem;
    10. }
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    dmicarus
    брр..
    во-первых, перфоманс т.о. ты не улучшишь.
    во-вторых, в чем сложность использования этого кода для темплейтизированного контейнера?
    в-третьих, все же лучше пробегаться по итераторам. (имхо)
    в-четвертых, в плюсах есть #include <typeinfo>, но она к твоей задаче никакого отношения не имеет (имхо).
     
  12. dmicarus

    dmicarus New Member

    Публикаций:
    0
    Регистрация:
    25 май 2009
    Сообщения:
    17
    varnie
    Не знаю...
    Только что померял
    в векторе ~300k двордов
    Код (Text):
    1. DWORD StartTick = GetTickCount();
    2. for(std::vector<DWORD>::iterator iter= vec.begin(); iter != vec.end(); iter++)
    3. {
    4. /*
    5.    тут код
    6. */
    7. }
    8. wchar_t message[128];
    9. wsprintf(a, L"%lu", GetTickCount() - StartTick);
    10. MessageBox(0, message, 0, 0);
    выдал примерно 700 мс

    через указателб на массив работает на несколько порядков быстрее.
    Может грабли в чем-то другом?
     
  13. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    dmicarus
    Ну, во-первых не i++, а ++i. Бр-р-р... :)
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    *то есть не i, а iter.
     
  15. dmicarus

    dmicarus New Member

    Публикаций:
    0
    Регистрация:
    25 май 2009
    Сообщения:
    17
    Интересная штука stl. Хоть и была создана для облегчения кодинга, но уж слишком много граблей на которые можно ненароком наткнутся не зная внутренней реализации. Про использование префиксного инкремента в цикле я знал, просто опечатался набирая код. Коме того еще и желательно проинициализировать итератор указывающий на "запоследний" элемент перед циклом:
    Код (Text):
    1. std::vector<DWORD>::iterator end(vec.end());
    2. for (std::vector<DWORD>::iterator iter = vec.begin(); iter != end; ++iter)
    3. {...}
    В моем-же случае задержки были из-за того, что собирал код в дебаг варианте, в котором внутри реализации stl куча мусора вроде проверок указателей на валидность. В релизе все нормально.
     
  16. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    dmicarus
    вот вот. хорошо что разобрался.
    кстати, еще можно вот так:
    for (std::vector<DWORD>::iterator iter = vec.begin(), iter_end = vec.end(); iter != iter_end; ++iter){
    //do smth
    }
     
  17. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    Код (Text):
    1. LRESULT CALLBACK LV2WndProc(HWND hwnd, UINT mMsg, WPARAM wParam, LPARAM lParam);
    2. ...
    3. class CMyDlg : public CDialog
    4. {
    5. public:
    6.     PTCHAR szName;
    7. friend LRESULT CALLBACK LV2WndProc(HWND hwnd, UINT mMsg, WPARAM wParam, LPARAM lParam);
    8. }
    9. ...
    10. LRESULT CALLBACK LV2WndProc(HWND hwnd, UINT mMsg, WPARAM wParam, LPARAM lParam)
    11. {
    12.     switch (mMsg)
    13.     {
    14.     case WM_LBUTTONDOWN:
    15.     {
    16.         MessageBox(0,szName,0,MB_OK); // < --- error
    17. ...
    18. }
    error C2065: 'szName' : undeclared identifier
    почему так?
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    verelex
    Чтобы функция могла обращаться к членам класса в неё должен передаваться указатель на класс как структуру данных. Для функций членов класса это происходт неявно, а в статической, и тем более callback фукции механизм передачи такого указателя не предусмотрен (ведь win которая будет её вызывать о твоих С++ классах не имеет ни малейшего понятия - для неё это обычная функция). Поэтому из статических функций, даже если они члены класса, можно обращаться только к статическим свойствам класса.
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    verelex
    А чтобы спрятать окно или диалог в обёртку из С++ класса нужно самому вести список соответсвия между hwnd и ссылкой на данные класса и в оконной callback функции получив hwnd искать его в списке чтобы получить нужную ссылку и дальше обращаться к данным через неё, хотя намного удобнее получив эту ссылку перенаправить дальнейшую обработку в фукнцию метод класса, где всё уже будет доступно без лишнего гемороя, например так:
    case WM_LBUTTONDOWN:
    return _this -> wm_LBUTTONDOWN(wParam, lParam);
    Обрати внимание this - не "настоящий", а своя ссылка, добытая из списка.
     
  20. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    понятно, спасибо.
    А если другим путем:
    Код (Text):
    1. // mylist.h
    2. // CMyListCtrl  subclassing
    3.  
    4. class CMyListCtrl : public CListCtrl
    5. {
    6. public:
    7.     CMyListCtrl();
    8.  
    9. // Implementation
    10. protected:
    11.     afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
    12.     DECLARE_MESSAGE_MAP()
    13. };
    14.  
    15. BEGIN_MESSAGE_MAP(CMyListCtrl , CListCtrl)
    16.     ON_WM_LBUTTONDOWN( UINT, CPoint )
    17. END_MESSAGE_MAP()
    18. //--------------------------------------------------------------------------------
    19. void CMyListCtrl::OnLButtonDown(UINT nFlags,CPoint point)
    20. {
    21.     MessageBox(L"zzz");
    22. }
    23. //--------------------------------------------------------------------------------
    24.  
    25. ...
    26.  
    27. //mydialog.h
    28. class CMyDlg : public CDialog
    29. {
    30. private:
    31.     CMyListCtrl *MyListCtrl;
    32.  
    33. public:
    34.     CMyDlg(PTCHAR str);
    35. ...
    36. };
    37.  
    38. ...
    39.  
    40. void CMyDlg::DoDataExchange(CDataExchange* pDX)
    41. {
    42.     CDialog::DoDataExchange(pDX);
    43.     DDX_Control(pDX,IDC_LIST2,*MyListCtrl);
    44. }
    45. //--------------------------------------------------------------------------------
    46. BOOL CMyDlg::OnInitDialog()
    47. {
    48.     MyListCtrl = static_cast<CMyListCtrl*>( GetDlgItem(IDC_LIST2) );
    49.     CDialog::OnInitDialog();
    50.     MyListCtrl->m_hWnd = 0; // должн почему-то быть = 0
    51.     MyListCtrl->SubclassDlgItem(IDC_LIST2,this);
    52. ...
    53. }
    54.  
    55. если MyListCtrl->m_hWnd != 0 то вываливается:
    56.  
    57. wincore.cpp:
    58.  
    59. BOOL CWnd::Attach(HWND hWndNew)
    60. {
    61.     ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    62. ...
    Вот здесь: http://www.codeproject.com/KB/miscctrl/subclassdemo.aspx
    сказано
    может поэтому и как пофиксить?