Как отключить обнуление переменных memset?(Visual Studio)

Тема в разделе "LANGS.C", создана пользователем Aids, 6 окт 2011.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    К примеру такой код:

    struct tparammodule{
    DWORD ep;
    DWORD base;
    };

    tparammodule *param=new tparammodule();

    в результате выделяется память под param, и переменная очищается memset

    наверное должен быть какой то параметр у студии?
     
  2. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    И вот ещё проблема:

    unsigned __int64 delta;
    FILETIME datetime2, datetime1;
    delta=(unsigned __int64)(*(unsigned __int64*)&datetime2-*(unsigned __int64*)&datetime1);

    компилятор генерит aulldiv от неё тоже нужно избавится
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    1. По стандарту так положено, на сколько я знаю. new вызывает конструктор по-умолчанию, который инициализирует переменные-члены в их значения по-умолчанию.
    2. Если нужно вычислить разность в байтах, нужно использовать не (unsigned __int64*), а (char *). Если нужна разница именно в количестве байтов, поделённая на размер unsigned __int64 (т.е. 8 байт), такая операция приведёт не к ожидаемому результату, если разница между ними не кратна 8 байтам. В любом случае использование C-style cast'ов не приветствуется в C++.
     
  4. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    В первом случае можно заменить new на malloc, во втором - сначала определитесь, какой результат вы ожидаете.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Aids

    Все правильно и в соответствии со стандартом. Делай new tparammodule; вместо new tparammodule();, и не будет memset.
     
  6. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Не вчитался в код сначала. Вычисляется разница не указателей, а значений.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ezrah
    фейсьпальм.

    tparammodule *param=new tparammodule;
     
  8. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Booster
    В ходе дискуссии рождается истина. Я первым сделал предложение, Вы подправили. ТС и я получили профит. Разве не замечательно? Глядишь не ответь я, другой бы никто не ответил в силу своей лени, а так видно, что человек ошибся, и хочется его подправить.
     
  9. Person

    Person Hugh Person

    Публикаций:
    0
    Регистрация:
    29 июн 2011
    Сообщения:
    23
    __alldiv и memset надо брать из ntdll
     
  10. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Person
    в том то и дело что я пытаюсь избавится от импорта. а мне конмпилятор апи втыкает и просит вставить ntdll.lib

    сори сильно упростил вырожение, должно так быть
    delta=(unsigned __int64)(*(unsigned __int64*)&datetime2-*(unsigned __int64*)&datetime1)/10000
    но вы меня навели на мысль, я почему то подумал что __alldiv это какое-то преобразование типов, на самом деле это обычное деление с большими числами и всё можно свести к
    __int64 a,b;
    b=a/10000;
    поэтому для таких делений нужно самстоятельно вызвать alldiv
     
  11. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    _DEN_
    спасибо.
     
  12. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Вы удивительно мягко об этом говорите:) Тут не то, что не приветствуется, за это дело выговор обеспечен...

    10000 - It's Magic Number. You should declare it as static constant in your class.
     
  13. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Ezrah
    Nafanya
    а как можно по другому найти разность 2х dwordов не прибегнув к преобразованию в __int64?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Здесь смотрели?
    http://msdn.microsoft.com/en-us/library/ms724284
    Ключевое слово "subtract".
     
  15. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    ах ну да.