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

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

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

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

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

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

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

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

Заранее спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 22:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает в release (C++):

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

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

Проект под Win32 Release (exe-шник, который работает на любом ПК) - C++
Использую IDE Visual C++ 2010, cкомпилировал проект под Win32 Release. Появился в папке Realease exe- шник. Программ является...

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

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

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

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


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

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

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

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

все таки кое-что можно попробовать подебажить в релизе. если не получается, то логи помогут.
0
SAkonst
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 19
15.02.2012, 23:24  [ТС] #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 то работает.
0
Миниатюры
Не работает в release  
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.02.2012, 23:35 #7
assert(exp);
если в дебаге выражение не будет истинно (false), вылезет окно, в котором будет написано где и что сработало не так, как вы ожидали. поведение ассерта можно кастомизировать, но если ничего не трогать, то так и будет. попробуйте у себя в коде где-нибудь написать assert(false); (длф MFC вроде правильнее использовать ASSERT(false)) и посмотрите что получится. В релизе этот макрос пустой, поэтому ничего не происходит.

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2012, 02:35
Ответ Создать тему
Опции темы

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