Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.80
SAkonst
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 19
#1

Не работает в release - C++

15.02.2012, 22:27. Просмотров 2842. Ответов 9
Метки нет (Все метки)

Доброго времени суток,

Столкнулся со следующей проблемой: При выполнении Debug Build - MFC программа работает корректно.
Собираю Release build. Запускаю exe из папки Release. Окно запускается, все как надо, но программа не считает. Причем по скорости вывода ответа кажется, что она даже не проходит по алгоритму.
Работаю в Visual Studio 2010.

Может есть есть какие оптимизаторы кода, которые "мешают" или, может быть, другие подводные камни.
Подскажите, пожалуйста, как правильно собрать окончательный Release.

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 22:27     Не работает в release
Посмотрите здесь:

Release не работает, Debug работает - C++
Здравствуйте, подскажите в чем может быть проблема, написал программу (тестирование), запускал, проверял все норм. В настройках стояло:...

Release работает, Debug - ошибка - C++
Подскажите, товарищи. Есть код (взял с форума) : #include <iostream> #include <fstream> #include <string> #include <conio.h> ...

Release - C++
Доброго времени суток всем! Есть такая проблема, создал свой первый калькулятор, проект windows forms(мое первое знакомство с формами:)) и...

Не компилируется в Release - C++
Здравствуйте, проблема в следующем: LPTSTR m_name = new char; Это компилируется в Debug, но не компилируется в Release, выдаёт...

Release/Debug - C++
Здравствуйте! Пишу сложную расчётную программу. И мне важна скорость выполнения программы. И хотел бы проконсультироваться. Делал с помощью...

Падение Release - C++
Всем привет. Есть код по конвертированию float в строку char* #include <sstream> using std::stringstream; #include <iostream> using...

ошибка в Release компиляция - C++
В Release версии не появляется окно WinAPI, Настройки в Debug и Release практически идентичны (в смысле стандартные слегка измененные) ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ШКІПЕР
94 / 94 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
15.02.2012, 22:37     Не работает в release #2
SAkonst:
1. Вы уверены, что сборка действительно в Release ?
2. Проект в студия (если © не мешает).


Добавлено через 2 минуты
На самом деле это делается так:
http://10pix.ru/img1/571133/6844893.jpg
http://10pix.ru/img1/1557/6844896.jpg

Добавлено через 1 минуту
Цитата Сообщение от SAkonst Посмотреть сообщение
Может есть есть какие оптимизаторы кода, которые "мешают" или, может быть, другие подводные камни.
К сожалению, телепатов здесь нет.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.02.2012, 22:41     Не работает в release #3
в релизе тоже можно подебажить. ну или логи вставить и посмотреть что происходит.
еще бывает ошибка, когда вызов функции вставляют в ассерт. в дебаге вызова не будет. у вас нет такого случайно?
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,624
15.02.2012, 22:54     Не работает в release #4
выход за пределы массива
утечка памяти
и много косяков где дебаг справляется а релиз падает

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
когда вызов функции вставляют в ассерт
ну и это тоже
для проверки функций макрос VERIFY

Добавлено через 2 минуты
Цитата Сообщение от DU Посмотреть сообщение
в релизе тоже можно подебажить.
трудно это после оптимизатора код на себя не похож
да и ассемблера много
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.02.2012, 22:56     Не работает в release #5
поправляюсь: выражения в макросах вроде ассерта не будут выполняться в релизе, а не в дебаге.

все таки кое-что можно попробовать подебажить в релизе. если не получается, то логи помогут.
SAkonst
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 19
15.02.2012, 23:24  [ТС]     Не работает в release #6
Вы уверены, что сборка действительно в Release ?
А как выяснить в release или нет. Дословно я делаю следующее: Build -> Configuration Manager, а там меняю configuration c debug на release (скриншот). После чего нажимаю Rebuild Solution и получаю exe с файлом pdb (который я так понимаю не очень-то и нужен конечному пользователю) в папке Release.

Код я выложу, но как это поможет в решении этой проблемы? Я так понимаю, что проблема-то не в коде, а в настройках сборки в Release, хотя, конечно могу быть не прав)

Мой код исполняется при нажатии только одной кнопки и syslink. Весь остальной проект сотворен самой студией при создании MFC
(простите, комментарии пока не писал. При необходимости добавлю)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
void CSearchWordsDlg::OnBnClickedCheck1()
{
    if (check == 0)
        check = 1;
    else
        check = 0;
    if (m_EditControlLCon.EnableWindow(FALSE))
        m_EditControlLCon.EnableWindow(TRUE);
}
void CSearchWordsDlg::OnBnClickedButton1()
{
    UpdateData(TRUE);
 
    #define BUFFSIZE 100
    char word[BUFFSIZE];
    int counter = 0;
    int counter2 = 0;
    int i;
    int n = 0;
    int j;
    int log = 0;
    int progress = 0;
    CString counterS;
    CString counterS2;
    CString LastChar;
    
    FILE *filedict;
    FILE *filelog;
    filedict = fopen ("zdb-win.txt", "r");
    filelog = fopen ("Filelog.txt", "w");
    
    if (filedict == 0)
                {
                    MessageBox(_T("Dictionary not found. It must be in folder with program. Please check"));
                    return ;
                }
 
    if (m_EditControlFC.GetLength() == 0 || (m_EditControlFC.GetLength() != 0 &&  check == 1 && m_EditControlLCon.GetWindowTextLength() == 0))
                {       
                    MessageBox (_T("Please, insert characters into field"));
                    return;
                }
    else if (m_EditControlLCon.GetWindowTextLength() > 1)
                {
                    MessageBox (_T("Only one simbol in last character"));
                    return;
                }
            
            
            m_EditControlRes.SetWindowText(_T("Searching..."));
            m_EditControlRes.UpdateWindow();
 
    while (! feof (filedict))
        {
            counterS.Format(_T("%d"), counter);
            counterS2.Format(_T("%d"), counter2);
            memset (word, 0, BUFFSIZE);
            i = 0;
            fscanf (filedict, "%s", word);
 
            while (word[i] == m_EditControlFC.GetAt(i) && m_EditControlFC.GetAt(i + 1) != 0)
                    i = i + 1;
            if (word[i] == m_EditControlFC.GetAt(i))
                {
                    counter = counter + 1;
                    if (check == 0)
                        fprintf (filelog, "%s \n", word);
                }
            
            progress = 1;
 
            if (m_EditControlLCon.GetWindowTextLength() == 1 && check == 1)
                {
                    m_EditControlLCon.GetWindowText(LastChar);
                    j = i;
                    while (word[j] != 0)
                        {
                            j = j + 1;
                            if (LastChar == word[j] && m_EditControlFC.GetAt(i) == word[i] && word[j + 1] == 0)
                                {
                                    fprintf (filelog, "%s \n", word);
                                    log = 1;
                                    counter2 = counter2 + 1;
                                }                       
                        }
                }
            }
            if (log == 0 && progress != 0 && counter == 0 || log == 0 && progress != 0 && check == 1)
                    m_EditControlRes.SetWindowText(_T("No match"));
            if (counter != 0 && check == 0)
                    m_EditControlRes.SetWindowText(counterS);
            if (log != 0)
                    m_EditControlRes.SetWindowText(counterS2);
            
            m_EditControlRes.UpdateWindow();
    
    fclose (filedict);
    fclose (filelog);
    progress = 0;
 
}
 
 
void CSearchWordsDlg::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult)
{
    PNMLINK pNMLink = (PNMLINK)pNMHDR;
    ::ShellExecute (m_SysLink.m_hWnd, _T("open"), _T("Filelog.txt"), NULL, NULL, SW_SHOWNORMAL);
    *pResult = 0;}
еще бывает ошибка, когда вызов функции вставляют в ассерт.
Покажусь нубом, но что есть "ассерт"?

трудно это после оптимизатора код на себя не похож
А есть возможность отключить оптимизаторы?

все таки кое-что можно попробовать подебажить в релизе
Опять-таки покажусь нубом. Как дебажить в релизе? Не работает если запускать сам exe, а внутри студии даже, если build стоит на Release то работает.
Миниатюры
Не работает в release  
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.02.2012, 23:35     Не работает в release #7
assert(exp);
если в дебаге выражение не будет истинно (false), вылезет окно, в котором будет написано где и что сработало не так, как вы ожидали. поведение ассерта можно кастомизировать, но если ничего не трогать, то так и будет. попробуйте у себя в коде где-нибудь написать assert(false); (длф MFC вроде правильнее использовать ASSERT(false)) и посмотрите что получится. В релизе этот макрос пустой, поэтому ничего не происходит.

в резиле дебажится так же как и в дебаге. в студии расставляете брейк поинты и по F5 запускаете прогу. Правда в этом случае студия может не останавливаться в некоторых точках, курсор выполнения загадочно скакать и прочие глюки.
SAkonst
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 19
15.02.2012, 23:37  [ТС]     Не работает в release #8
DU, спасибо, попробую
Bers
Заблокирован
16.02.2012, 01:04     Не работает в release #9
я бы особое внимание уделил второму предложению в #3 посте данной темы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2012, 02:35     Не работает в release
Еще ссылки по теме:

Отличие get() и release() у auto_ptr - C++
Вопрос,конечно,глупой. Но не могу разобраться. В чём всё таки различение между auto_ptr<int> pi(new int(24)); cout<<pi.release();...

Debug и Release разница? - C++
объяснить пожалуйста разница между Debug И Release? и почему после компиляции Debug->Dll fail 460kb а Release->17кб.

Функция GetTextExtentPoint32 в RELEASE EXE - C++
Выдает на выходе в структуре SIZE бешанные числа (как будто фонт не определен) и в это время функция говорит об успехе ее отработки. А в...

Std::shared_ptr release pointer? - C++
Можно ли как-то у std::shared_ptr ( именно std:: ) отнять указатель, дабы он более не имел над ним власти? Вариант передавать "пустой"...

Release. Работа на другом компьютере - C++
Написал программу в Visual Studio 2010. Вчера скинул её другу посмотреть, она не запустилась. Ему нужно было скачать какую-то библиотеку. И...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SAkonst
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 19
17.02.2012, 02:35  [ТС]     Не работает в release #10
Всем спасибо большое. Разобрался в чем проблема:
При создании проекта в мастере выставил Use Unicode Character Set. Потом ручками поменял в свойствах солюшна на Use Multi-Byte Character Set. Но только не сообразил, что в release configuraion тоже поменять надо. Поэтому а релизе и не работало.
Теперь все в порядке.
Спасибо всем за внимание и подсказки))
Yandex
Объявления
17.02.2012, 02:35     Не работает в release
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru