Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не присваивается значение переменной в catch, Глючит оптимизатор? 
:(
    Опции темы
Anikmar
Дата 25.9.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Интересный глюк у меня (или у компилятора?)
Код в DLL.

Вариант кода №1
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret=false;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
                              Ret = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
    }

    return Ret;
}

Если ловим исключение - на выходе Ret==true. Вопрос почему? Пробовал отключать оптимизацию, переключать debug/release никакого эффекта.
Видоизменяю код:
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
        Ret = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
        Ret = false;
    }

    return Ret;
}


Теперь все нормально.

Можно видоизменить так:
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret = true;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
        Ret = false;
    }

               Ret = !Ret;
               Ret = !Ret;

    return Ret;
}


Тоже все в порядке.

Собственно вопрос в чем: таких конструкций еще некоторое количество. Во всех такие финты на всякий случай встраивать или кто-то уже с таким глюком сталкивался?

как я понял, если в переменной Ret что-нибудь перед выходом сделать (допустим типа if (Ret) .... какое-нибудь ненужное дествие) - тогда все работает. Если между catch блоком и return ничего нет - то Ret==true стабильно вне зависимости от возникновения исключения. Откуда он это значение берет?

PM MAIL ICQ   Вверх
586
Дата 25.9.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



А если так объявить переменную:
Код
volatile bool Ret = false;


Это сообщение отредактировал(а) 586 - 25.9.2009, 22:01
PM   Вверх
Anikmar
Дата 25.9.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(586 @  25.9.2009,  22:01 Найти цитируемый пост)
А если так объявить переменную:

Без разницы.
Работает правильно в двух случаях:
Либо когда значение присваивается и в блоке try и в блоке catch
Либо если перед return с этой переменной что-то сделать (проверить ее значение, переприсвоить).

Причем эффект возникает только когда собирается в dll. Если этот участок кода запустить обычным способом - все нормально.



PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.