Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глюк в Release

1.9K
07 апреля 2006 года
Rad87
123 / / 14.12.2005
До некоторых пор всё работало хорошо
Но сегодня вечером ко мне пришёл он - глюк.

Программа просто стала перескакивать часть кода без всяких там готу и условий. И что интересно все обявления переменных как бы обявляются но нельзя просмотреть. Либо например при объявлеие DWORD dwSize=256; говорит что там типа не 256 а 4294967295.

Ниже привожу код который "почти что" работает

CString strPasswd;
editID.GetWindowText(strID);
UserDialog.strID=strID;
editPasswd.GetWindowText(strPasswd);
editPasswd.SetWindowText("");
if (strID.GetLength()!=4) {MessageBox ("Неверно указан формат номера",0,0); return;}



ATL::CCryptMD5Hash md5;

CCryptProv prov;
LPCTSTR pszContainer = NULL; //Пропускает
LPCTSTR pszProvider = MS_DEF_PROV;//Пропускает
DWORD dwProvType = PROV_RSA_FULL;//Пропускает
DWORD dwFlags = CRYPT_VERIFYCONTEXT | CRYPT_SILENT;//Пропускает

HRESULT hr = prov.Initialize(dwProvType, pszContainer,pszProvider, dwFlags);

if (hr == NTE_KEYSET_NOT_DEF) hr = prov.Initialize(dwProvType, pszContainer, pszProvider,dwFlags | CRYPT_NEWKEYSET); //Пропускает


char Hash1st[256]; //Пропускает
DWORD dwSize=256; //Пропускает
dwSize=256;//Пропускает

TRACE("\n%i",dwSize);//Пропускает
int y;//Пропускает

for(y=0;y<255;y++)//Пропускает
{
Hash1st[y]=0; // сюда заходит но выполняет только один раз

}

HRESULT hr2=md5.Initialize(prov,0);


md5.AddString(strPasswd.GetString());
hr2 = md5.GetValue((BYTE*)Hash1st, &dwSize);
md5.Destroy();
prov.Detach();
strPasswd="";

И не смотря на точто пропускает инициализацию переменных Функция prov.Initialize(dwProvType, pszContainer,pszProvider, dwFlags); срабатывает и ошибок не выдает.
При попытке просмотреть содержимое например dwProvType он мне в всплывающей подсказке говорит что "DWORD dwProvType". Без значения переменной.

Пробовал ставить брекпойнты но они либо при запуске программы сползают до первой не пропускаемой строки либо показываются как брекпойнт с вопросиком.
Пробовал всё комментировать, оставлял только цикл и всё равно он выполнялся только один раз так как программа переходила в тело цикла миную for.

Пробовал даже винду переставлять всё равно одно и тоже.

И эти ошибки не только здесь, а в 2 других участках кода и только при компиляции в Release в Debug всё работает хорошо.

В общем я поражен и обескуражен таким поведением программы!
Помогите пожалуйста.
406
08 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Чет я не пойму,ты че под релизом пытался дебагить? Если так то откомпиль в дебаг режиме а затем уже смотри в дебагере пошагово.
534
10 апреля 2006 года
HarryAxe
448 / / 19.01.2006
Слышал когда-нибудь, что код на C++ можно оптимизировать, дабы ускорить выполнение и уменьшить размер бинарника? Так вот в Release конфигурации именно это и происходит. Например, макрос TRACE не включается в сборку, некоторые переменные помещаются в регистры процессора, код наподобие
 
Код:
for(y=0;y<255;y++)
{
    Hash1st[y]=0;
}

заменяется на memset(Hash1st, 0, 255), а неиспользуемые переменные удаляются. Такому поведению оптимизатора радоваться надо, а не винду переставлять. Для отладки существует Debug.
534
10 апреля 2006 года
HarryAxe
448 / / 19.01.2006
И ещё: не проще ли к полям, хранящим ID и Password, сразу подвязать строки через DDX и не засорять код явными вызовами GetWindowText()?
1.9K
13 апреля 2006 года
Rad87
123 / / 14.12.2005
Цитата:
Originally posted by HarryAxe
Слышал когда-нибудь, что код на C++ можно оптимизировать, дабы ускорить выполнение и уменьшить размер бинарника? Так вот в Release конфигурации именно это и происходит. Например, макрос TRACE не включается в сборку, некоторые переменные помещаются в регистры процессора, код наподобие
 
Код:
for(y=0;y<255;y++)
{
    Hash1st[y]=0;
}

заменяется на memset(Hash1st, 0, 255), а неиспользуемые переменные удаляются. Такому поведению оптимизатора радоваться надо, а не винду переставлять. Для отладки существует Debug.



HarryAxe спасибо тебе за объяснение, а винду я переставил из-за совокупности глюков винды - взбесили они меня, а "глюки" в моей программе были последней каплей.

Но в релизе у меня есть ещё одна не понятная для меня вещь. Я пытаюсь занести в ричэдит цветной текст. В дебаг версии у меня всё хорошо а вот в релизе всё рисуется жирным черным цветом(или вообще не понятно каким стилем).

CHARFORMAT nameFont;
nameFont.cbSize=14;
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;

richMessages.SetWordCharFormat(nameFont);

richMessages.SetSel(richMessages.GetTextLength(),-1);
richMessages.ReplaceSel(MessageText,0);

Но если в самом начале рича поставить например символы перевода строки то весь рич будет обычного шрифта и никакие изменения цвета отображаться не будут.

А это наверное уж точно не оптимизация :)

534
13 апреля 2006 года
HarryAxe
448 / / 19.01.2006
 
Код:
CHARFORMAT nameFont;
nameFont.cbSize = sizeof(nameFont);
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;
nameFont.dwMask = CFM_BOLD | CFM_COLOR | CFM_SIZE;

ichMessages.SetWordCharFormat(nameFont);
   ...
1.9K
14 апреля 2006 года
Rad87
123 / / 14.12.2005
Цитата:
Originally posted by HarryAxe
 
Код:
CHARFORMAT nameFont;
nameFont.cbSize = sizeof(nameFont);
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;
nameFont.dwMask = CFM_BOLD | CFM_COLOR | CFM_SIZE;

ichMessages.SetWordCharFormat(nameFont);
   ...



Всё получилось :D
Спасибо!

16K
16 апреля 2006 года
Баювар
10 / / 16.04.2006
CHARFORMAT nameFont;
ZeroMemory(&nameFont, sizeof(nameFont));
!!! Обязательно!!! Тогда не будет описанных проблем с дебаг-релизом. Что не так -- сразу проявится. Объявили -- занулили.

nameFont.cbSize = sizeof(nameFont);
И все остальное.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог