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

самопроизвольный выход программы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
11.03.2013, 11:15     самопроизвольный выход программы #1
Доброго времени суток. Я пишу программу консольный проект С++ в Visual студии 2010 ознакомиться можно по адресу smilejohn.ts6.ru, вот только версии которую я сейчас пишу там нет.

Программа представляет собой конструктор символьных игр. В коде ничего не выделяется динамически, никаких new и проблем с указателями нет. Работает отменно, но после определённого времени работы программа само произвольно вылетает как в случае повреждения кучи или неправильного доступа к памяти.

Код написан так, чтобы все создаваемые классы (их пока всего два) уничтожались по мере возврата обратно в main, у меня работает без проблем, но скидываю тестеру, он жалуется на вылеты программы при возврате в меню из режимов содержащих классы. Создал деструкторы и прямой выход в main из "центральных" функций каждого из режимов, вроде работает, но появились проблемы при считывании карты уровня из файла.

Проблема вообще не понятная, подскажите хоть в какую сторону копать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 11:15     самопроизвольный выход программы
Посмотрите здесь:

Выход из программы C++
C++ выход из программы
C++ Enter = выход из программы
Принудительный выход из программы C++
Выход из программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.03.2013, 11:25     самопроизвольный выход программы #2
Stacktrace? Учись пользоваться дебаггером.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
11.03.2013, 11:25     самопроизвольный выход программы #3
Какое сообщение об ошибке? (Приведи дословно или скриншот.)

Пока информации, чтобы помочь, слишком мало. А телепаты все, как один, - к сожалению, ушли в отпуск :-)
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
11.03.2013, 11:35  [ТС]     самопроизвольный выход программы #4
а куда вставлять картинки? я не нашёл кнопки
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
11.03.2013, 11:47  [ТС]     самопроизвольный выход программы #5
вот скриншот))) и просто закрывается. Видимо что-то на этапе выполнения вылетает, но проверял несколько раз проблем вроде как нет. Разве что, что-то на более низком уровне не так
Миниатюры
самопроизвольный выход программы  
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
12.03.2013, 11:49  [ТС]     самопроизвольный выход программы #6
код "центральной функции" режима запуска игры (созданного уровня)

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
//-------------------------------------------------
//*************************************************
//центральная процедура
//-------------------------------------------------
//*************************************************
void gamemenu(){
//-------------------------------------------------
int q=0,w=0,e=0,r=0;  game::player hero; int M; short n;
//-------------------------------------------------
    //выключить курсор  
//-------------------------------------------------
//полная инициализация рабочего пространства
//-------------------------------------------------
play://рамка
    display(3);
    //рисуем карту
    redraw_map(); draw_map(q,w);
    //статика
    game::footer();
    //индикация
    hero.menu();    
//-------------------------------------------------
while(1){
    M = KEY->push(n);
    if(n!=-1 && n==0)   switch(M){
    //-------------------------------------------------
    case 1: goto play;
    default:      continue;
    }else
    if(n!=-1 && n==224) switch(M){
    //-------------------------------------------------
    case 1: goto play;
    default:    continue;
    }else
    if(n!=-1 && n==1)   switch(M){
    //-------------------------------------------------
    case 1: goto play;
    case k_esc: if(BOX->show("СООБЩЕНИЕ","Вы действительно хотите выйти из игры?",101,5)==6) goto noedit;
    default:    continue;
    }
}
 
noedit: _cls main();
}
где
game:layer hero; - это
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
namespace game{
//-------------------------------------------------
//статические подписи
//-------------------------------------------------
void footer(){
   //просто процедура, выводит статические надписи
}
//-------------------------------------------------
//индикация ведения боя
//-------------------------------------------------
void fight(){
//-------------------------------------------------
    //вывод информации по ведению боя, пока не создано
}
 
//=================================================
//-------------------------------------------------
//класс героя
//-------------------------------------------------
//=================================================
struct player:COORD{
//-------------------------------------------------
//несколько битовых полей       
            
unsigned short gold;//деньги
unsigned long score;//рейтинг
char herosym,       //символ игрока
     mapsym;        //символ-буфер
//-------------------------------------------------
player(){
    //конструктор стартовых параметров
}
//-------------------------------------------------
void menu(){ 
   //процедура вывода изменяющихся параметров для индикации состояния конструктора
}
    //-------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------
    //набор сценарных модулей для изменения и контроля лимитов героя в игре, таких как деньги, здоровье и прочее
};
 
//-------------------------------------------------
//*************************************************
//end block namespace
//-------------------------------------------------
//*************************************************
}
полный код опущен, плюс ещё не дописан, но по словам "тестера" именно при переходе в main программа аварийно закрывается

Добавлено через 13 минут
Цитата Сообщение от Герц Посмотреть сообщение
Stacktrace? Учись пользоваться дебаггером.
так дело в том, что свои ошибки я нахожу дебаггером, но чаще просто выслеживаю их по коду, например исправил некорректное чтение уровня из файла, которого в принципе быть не должно было, просто не досмотрел.

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

Кроме матов ничего на ум не приходит



Эм, э, я не помню запрещается ли несколько постов подряд, но на редактирование записи отводится всего 5 минут и я только, что заметил среди кнопок "предварительный просмотр сообщения", почему не видел раньше, не знаю...
-=ЮрА=-
Заблокирован
Автор FAQ
12.03.2013, 15:11     самопроизвольный выход программы #7
Цитата Сообщение от el Domaco Посмотреть сообщение
M = KEY->push(n);
- вот тебе метод который 100% работает с мемори (будь там вектор, список или массив), показывай весь проект...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 15:57     самопроизвольный выход программы #8
Какой здесь смысл в проверке на неравенство -1 ?
C++
1
if(n!=-1 && n==0)
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
12.03.2013, 18:50  [ТС]     самопроизвольный выход программы #9
это моя собственная функция, созданная для работы со стандартными операциями

KEY.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct key{ 
    int push(short &category){ int M=-1;
        if(hit()){
            M = getch();
            if(M==0 || M==224){
                category = M;
                M = getch();
            }else category = 1;
        }else category = -1;
    return M;
    }
 
    // нажата ли клавиша
    int hit(){  return _kbhit();    }
 
    
};
static key*KEY;
//класс никогда не создаётся просто выполняются функции
таких ещё несколько, переменных в них нет, просто методы делающие свою работу

Добавлено через 7 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- вот тебе метод который 100% работает с мемори (будь там вектор, список или массив), показывай весь проект...
скорей всего, но проект показать не могу, много личных приёмов, которые я хотел бы за собой и оставить
-=ЮрА=-
Заблокирован
Автор FAQ
12.03.2013, 18:59     самопроизвольный выход программы #10
el Domaco, замени гетч на GetAsyncKeyState
http://www.cyberforum.ru/blogs/34326/blog263.html
крайне нечитабельно условные операторы смотряться
На счёт личных приёмов, не думаю что меня чем либо удивил бы. Попробуй привести проект изъяв из него твои приёмы, не могу ничего сказать не видя код.

Цитата Сообщение от el Domaco Посмотреть сообщение
struct key
Цитата Сообщение от el Domaco Посмотреть сообщение
static key*KEY;
- это вообще не понятно что, у тебя перегружен оператор * для struct key а где же перегрузка?
kravam
12.03.2013, 19:10
  #11

Не по теме:

Цитата Сообщение от el Domaco Посмотреть сообщение
скорей всего, но проект показать не могу, много личных приёмов, которые я хотел бы за собой и оставить
Весь-то и не надо, откровенно говоря на фиг кому он нужен весь-то. Надо уметь отделить тык скыть зёрна от плевел. Вот не мой РАБОЧИЙ файл, который у меня не компилился:

вот я сюда его даже спрячу- настолько он велик и громоздок
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
//Тестовый пример №2 рассылки "Что такое "технология COM" и
//как с ней бороться ?" ([url]http://clubpro.spb.ru/cominside/com0016.html[/url])
//
//Реализация модуля сервера
//
//Автор - Михаил Безверхов
//Авторские права © 2000, Михаил Безверхов
//*****************************************************************************
 
#include "stdafx.h"   //служебные объявления
#include "NeoIntr2.h" //объявления интерфейсов
#include <tchar.h>    //используется ради макроса _T("str")
 
#include <basetyps.h>
#include <wtypes.h>
 
 
//******************************************************************************
//Нам хочется - в сугубо демонстрационных целях - пошпионить за аллокатором
//динамической памяти. Действительно ли срабатывает delete this и когда? 
//Для этого господам программистам, к сожалению, придётся поизощрять мозги - нам 
//придется переопределить new/delete на собственную кучу, а после этого мы
//можем делать с ними что хотим. Мне вот хочется, чтобы delete выдавала на
//консоль сообщение - "блок памяти удаляется", которое бы наглядно показывало
//где и когда отрабатывает delete this.
//Нижеследующий код не имеет никакого отношения к нашей рассылке - это только
//реализация того, что изложено выше.
 
 
HANDLE  g_hHeap  = NULL;  //дескриптор собственной кучи памяти
 
//переопределение глобальных new/delete
inline void * operator new(unsigned int stAllocateBlock){
 
  return ::HeapAlloc(g_hHeap,HEAP_ZERO_MEMORY,stAllocateBlock);
}
 
inline void operator delete(void * obj){
 
  ::MessageBox(NULL,_T("удаляется блок памяти"),_T("NeoSrv2 - аллокатор"),MB_OK);
  ::HeapFree(g_hHeap,0,obj);
}
 
 
//******************************************************************************
//реализация объектов сервера. здесь мы допускаем некую стилевую небрежность,
//исключительно из-за примитивности примера и ясности кода- мы сводим объявление
//и реализацию объектов сервера в ОДИН файл, хотя они должны быть разнесены по
//разным файлам исходного текста - ведь не всякий COM-сервер имеет такие 
//примитивные объекты, которые состоят из одной строчки кода? Поскольку у нас
//только один файл .cpp где требуется полное описание класса объекта сервера
//то мы и слили оба файла в один. Это не есть ошибка...
 
 
//******************************************************************************
//объявление статического типа Banzai
class CBanzai: public NeoInterface{
private:
  ULONG     m_dwRefCnt;           //счетчик ссылок
 
public:
  CBanzai(){ m_dwRefCnt = 0;}     //инициализация...
 
public:
  //экспонируемые методы
  STDMETHOD(QueryInterface)(REFIID riid,void ** ppvObject);
  STDMETHOD_(ULONG,AddRef)();
  STDMETHOD_(ULONG,Release)();
 
  STDMETHOD(Show)(HWND hWhere);
  STDMETHOD(Sound)();
 
};
 
 
//******************************************************************************
//объявление статического типа Hello
class CHello: public NeoInterface{
private:
  ULONG     m_dwRefCnt;           //счетчик ссылок
 
public:
  CHello(){ m_dwRefCnt = 0;}      //инициализация...
 
public:
  //экспонируемые методы
  STDMETHOD(QueryInterface)(REFIID riid,void ** ppvObject);
  STDMETHOD_(ULONG,AddRef)();
  STDMETHOD_(ULONG,Release)();
 
  STDMETHOD(Show)(HWND hWhere);
  STDMETHOD(Sound)();
 
};
 
 
//******************************************************************************
//реализация методов статического типа CBanzai
//******************************************************************************
//метод QueryInterface. Назначение метода - выдать указатель на любой 
//интерфейс, реализуемый объектом или NULL в противном случае. Наш объект 
//реализует два интерфейса - IUnknown и NeoInterface
STDMETHODIMP CBanzai::QueryInterface(REFIID riid,void ** ppvObject){
 
  //реализация QueryInterface крайне проста - мы должны разбираться
  //какой IID поступил на вход и преобразовывать указатель this к этому
  //абстрактному типу...
 
  *ppvObject = NULL;
  
  if(::memcmp(&riid,&IID_IUnknown,sizeof(GUID)) == 0) 
    *ppvObject = static_cast<IUnknown *>(this);
 
  else if(::memcmp(&riid,&IID_NeoInterface,sizeof(GUID)) == 0)
    *ppvObject = static_cast<NeoInterface *>(this);
  
  //а больше мы никаких интерфейсов не реализуем. Код возврата E_NOINTERFACE
  //и есть тот код, который сообщает, что запрашиваемого интерфейса нет.
  else return E_NOINTERFACE;
 
  AddRef(); //счётчик нужно продвинуть - ссылка же размножилась
 
  return S_OK;  //нормальное успешное завершение
}
 
//******************************************************************************
//метод AddRef - просто продвигает вперед счётчик ссылок и возвращает его 
//продвинутое значение
STDMETHODIMP_(ULONG) CBanzai::AddRef(){
 
  m_dwRefCnt++;
 
  return m_dwRefCnt;
}
 
//******************************************************************************
//метод Release - просто продвигает назад счётчик ссылок и возвращает его 
//продвинутое значение. Метод НЕ УДАЛЯЕТ объект, поскольку CBanzai у нас -
//статический объект уровня модуля, а не динамически получаемый по операции new.
//поэтому и аппарат подсчета ссылок в данном объекте - фактически не нужен.
//но клиент не знает, как реализован объект внутри сервера и клиент всё равно
//будет соблюдать протокол взаимодействия...
STDMETHODIMP_(ULONG) CBanzai::Release(){
 
  m_dwRefCnt--;
 
  return m_dwRefCnt;
}
 
//******************************************************************************
//метод Show. Показывает сообщение на экране - "БАНЗАЙ". Параметр - дескриптор
//того окна, кому должно принадлежать показываемое методом сообщение
STDMETHODIMP CBanzai::Show(HWND hWhere){
 
::MessageBox(hWhere,_T("БАНЗАЙ!"),_T("Тестовый пример сервера NeoSrv2"),MB_OK); 
 
return S_OK;
}
 
//******************************************************************************
//метод Sound. Издаёт звук. Звук будет отличаться собою от других только в том\
//случае если соответствующая схема звуковых событий в системе настроена
STDMETHODIMP CBanzai::Sound(){
 
::MessageBeep(MB_ICONASTERISK); 
 
return S_OK;
}
 
 
//******************************************************************************
//реализация методов статического типа Hello
//******************************************************************************
//метод QueryInterface. Назначение метода - выдать указатель на любой 
//интерфейс, реализуемый объектом или NULL в противном случае. И этот объект 
//реализует те же два интерфейса - IUnknown и NeoInterface
STDMETHODIMP CHello::QueryInterface(REFIID riid,void ** ppvObject){
 
  //реализация QueryInterface крайне проста - мы должны разбираться
  //какой IID поступил на вход и преобразовывать указатель this к этому
  //абстрактному типу...
 
  *ppvObject = NULL;
  
  if(::memcmp(&riid,&IID_IUnknown,sizeof(GUID)) == 0) 
    *ppvObject = static_cast<IUnknown *>(this);
 
  else if(::memcmp(&riid,&IID_NeoInterface,sizeof(GUID)) == 0)
    *ppvObject = static_cast<NeoInterface *>(this);
  
  //а больше мы никаких интерфейсов не реализуем. Код возврата E_NOINTERFACE
  //и есть тот код, который сообщает, что запрашиваемого интерфейса нет.
  else return E_NOINTERFACE;
 
  AddRef(); //счётчик нужно продвинуть - ссылка же размножилась
 
  return S_OK;  //нормальное успешное завершение
}
 
//******************************************************************************
//метод AddRef - просто продвигает вперед счётчик ссылок и возвращает его 
//продвинутое значение
STDMETHODIMP_(ULONG) CHello::AddRef(){
 
  m_dwRefCnt++;
 
  return m_dwRefCnt;
}
 
 
//******************************************************************************
//метод Release - продвигает назад счётчик ссылок и возвращает его 
//продвинутое значение. По достижении счётчиком ссылок нуля метод удаляет 
//объект из динамической памяти по delete this, поскольку объекты типа CHello
//сервер реализует в динамической памяти.
STDMETHODIMP_(ULONG) CHello::Release(){
 
  ULONG i = --m_dwRefCnt;
 
  if(i == 0) delete this;
 
  return i;
 
  //немного странноватая конструкция, по сравнению с CBanzai::Release
  //дело в том, что i - автоматическая переменная и она размещается в стеке
  //а m_dwRefCnt - переменная, размещаемая в блоке динамической памяти
  //экземпляра объекта. До тех пор, пока счетчик m_dwRefCnt не достиг нуля
  //конструкция return m_dwRefCnt будет работать. Но как только он достигнет
  //нуля и выполнится delete this блок памяти перестанет существовать и 
  //метод выполняющий return m_dwRefCnt обрушится по нарушению защиты памяти
  //именно поэтому, чтобы и в последний раз метод мог вернуть значение
  //счётчика ссылок мы используем автоматическую переменную
  //возможный ещё вариант кода:
  //  
  //  m_dwRefCnt--;
  //  if(m_dwRefCnt == 0){ delete this; return 0;}
  //  else return m_dwRefCnt;
  //
}
 
//******************************************************************************
//метод Show. Показывает сообщение на экране - "ХЕЛЛО". Параметр - дескриптор
//того окна, кому должно принадлежать показываемое методом сообщение
STDMETHODIMP CHello::Show(HWND hWhere){
 
::MessageBox(hWhere,_T("ХЕЛЛО!"),_T("Тестовый пример сервера NeoSrv2"),MB_OK); 
 
return S_OK;
}
 
//******************************************************************************
//метод Sound. Издаёт звук. Звук будет отличаться собою от других только в том\
//случае если соответствующая схема звуковых событий в системе настроена
STDMETHODIMP CHello::Sound(){
 
::MessageBeep(MB_ICONQUESTION); 
 
return S_OK;
}
 
 
//******************************************************************************
//реализация собственно модуля сервера
//******************************************************************************
 
//реализация объекта Banzai в составе сервера
CBanzai oBanzai;
 
 
//стандартная main для DLL. В этом примере она используется - при старте
//DLL мы создаём свою кучу памяти, а при завершении - уничтожаем
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                               ){
 
  switch (ul_reason_for_call){
        case DLL_PROCESS_ATTACH:
      g_hHeap = ::HeapCreate(0,0,0);
      if(g_hHeap == NULL) return FALSE; //завершимся аварийно...
        break;
 
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        break;
 
        case DLL_PROCESS_DETACH:
      ::HeapDestroy(g_hHeap); //а тут уже всё равно - и так завершаемся
              break;
    }
    return TRUE;
}
 
 
//******************************************************************************
//реализация единственной экспортируемой функции DLL - DllGetClassObject
//Это - та самая функция, которая создаёт объекты, идентифицируемые со стороны
//клиента парой CLSID-IID и возвращает клиенту адрес этого объекта. В общем 
//случае для всех статических типов, реализуемых сервером она должна уметь
//опознавать CLSID, проверять, реализует ли данный CLSID запрашиваемый IID
//и создавать ссылку на такой объект "внутри сервера".
STDAPI DllGetClassObject(const GUID& Guid,
                         const GUID& Iid,
                         void ** ppv
                        ){
  //правило хорошего тона - обнулить возвращаемый указатель на тот
  //случай, если вызов закончится неудачно. Тогда клиент не будет введён
  //в заблуждение относительно того, получил ли он что-то осмысленное
    *ppv = NULL;
 
  //реализация создания объекта статического типа Banzai. Поскольку GUID
  //есть просто длинное двоичное число, а нас в данном случае интересует
  //только ответ на вопрос "равно или нет", то для сравнения GUID мы 
  //пользуемся стандартной CRT-функцией сравнения ::memcmp 
  if(::memcmp(&Guid,&CLSID_Banzai,sizeof(GUID)) == 0){
    //это - CLSID_Banzai
 
    //в прошлом примере здесь мы проверяли - а есть ли такой интерфейс в 
    //составе интерфейсов объекта. Нам и здесь его нужно проверять...
    //Но у нас есть QueryInterface этого объекта, которая эту проверку
    //делает. Её и нагрузим, ведь эта ссылка - одна для всех пользователей
    //статического типа CBanzai, т.е. объект в составе сервера - один и 
    //всем запрашивающим клиентам будет возвращаться один и тот же адрес,
    //который УЖЕ существует, независимо от того запрашивает ли его кто
    return oBanzai.QueryInterface(Iid,ppv);
 
                                          }
 
 
  //реализация создания объекта статического типа Hello
  else if(::memcmp(&Guid,&CLSID_Hello,sizeof(GUID)) == 0){
    //это - CLSID_Hello
 
    //а вот в данном случае объект создаётся в динамической памяти по
    //запросу - до запроса он не существует. Его можно создать, а потом
    //так же нагрузить QueryInterface для проверки и приведения типа
    //указателя на интерфейс. НО! Дело выбора программиста - делать так, а
    //потом, если QueryInterface вернет E_NOINTERFACE разрушать объект.
    //Либо не создавать объект, а сначала проверить корректные ли значения
    //IID поступили на вход и уже после этой проверки либо создавать, либо
    //не создавать объект вовсе. С моей точки зрения этот выбор определяется
    //только сложностью самого "поднимаемого" объекта - стоит ли его
    //"беспокоить всуе". Учитывая, что E_NOINTERFACE - ошибка, исключительная
    //ситуация? то оптимизировать стоит "нормальную" ветвь исполнения. Поэтому
    //мы слелаем всё так, как и при выдаче ссылки на CBanzai, с поправкой
    //на то, что делаем объект в динамической памяти.
 
    //а вот место возникновения грозной ошибки, с которой ранее не боролись -
    //что будет, если вызов new провалится?
    CHello * p = new CHello();
 
    if(p == NULL) return E_OUTOFMEMORY; //ну а что еще можно сделать?
 
    HRESULT hr = p->QueryInterface(Iid,ppv);
 
    if(hr == E_NOINTERFACE) delete p;
 
    return hr;
                                                         }
  //а больше никаких CLSID мы не реализуем
  else return CLASS_E_CLASSNOTAVAILABLE;
 
  //вызов был успешен и в ppv - адрес запрашиваемого объекта
}



И вот что от него осталось, когда я упрощал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//dllka.cpp
#include <unknwn.h>
void f(){
  
  //Размер взят от балды
  char x [23];
 
  //так ругается
  //if(memcmp(&x,&IID_IUnknown,2)); 
  
  //а так нет
  memcmp(&x,&IID_IUnknown,2); 
}
И ошибка была где-то в этом маленьком кусочке, и парни со мной работали и помогли. А была бы простыня- кто бы стал возиться? Начинай с конца, убирай инструкции блоками, следи за тем, чтобы эффект был тем же- чё тебя учить что ли надо...



alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 21:04     самопроизвольный выход программы #12
Интересная тема...
Цитата Сообщение от el Domaco Посмотреть сообщение
Проблема вообще не понятная, подскажите хоть в какую сторону копать
, но на вопросы отвечать не буду, код не покажу...Ясновидящие, ау...!
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
13.03.2013, 10:18  [ТС]     самопроизвольный выход программы #13
-=ЮрА=- это просто указатель на описание структуры, которая никогда не создаётся в памяти, причина не в ней.

И ошибка была где-то в этом маленьком кусочке, и парни со мной работали и помогли. А была бы простыня- кто бы стал возиться? Начинай с конца, убирай инструкции блоками, следи за тем, чтобы эффект был тем же- чё тебя учить что ли надо...
повторяю первый пост! программа у меня не вылетает ВООБЩЕ, как бы я с ней не возился. Вылеты происходят на другом компьютере у тестера, у которого есть библиотеки, но не установлена студия. Даже учитывая всё это, режим редактор, который использует всю мощь написанной мною лично библиотеки не вылетает у тестера, вылетает тот код, который я показал. Я показал именно то, что является проблемой... не вижу смысла приводить здесь весь свой проект

но на вопросы отвечать не буду, код не покажу...Ясновидящие, ау...!
на вопросы я отвечаю, просто работаю слегка по другой специальности и не всегда есть возможность присутствовать на форуме. А вообще нужно уметь задавать наводящие вопросы коль уже взялся советовать, если бы ошибка была понятна я бы и писать сюда не стал. Проблема в том, что я и сам не пойму почему в столь простом коде происходит крушение. От того и спрашиваю расплывчато и не понятно
-=ЮрА=-
13.03.2013, 13:09
  #14

Не по теме:

el Domaco, да я увидел что там указатель( просто код написан в плохом стиле и с первого взгляда кажется другое), но дело не в этом, дело в том, что выражаясь простым языком хз что там у тебя в коде. Ты парсишь энер (по моему) гетчем, да будет тебе изветно что гетч функция со времён MSDOS и скажем на виста уже может непредсказуемо отрабоать - т.е ты нажмёшь кнопку, а код может и не пойти либо пойдёт код не энера а скажем ESC-ейпа(ну это так утрировано), тем более если платформа 64-ая, там вообще алес - даже корректные 32-х приложения могут не пойти а тут ты со своими тайнами. Без костяка програмы никто тебе не скажет что там у тебя не так. Возьми выкинь основные моменты да приатач наконец-то проект, который тебе поправит любой прогер юзающий отладчик

el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
13.03.2013, 16:16  [ТС]     самопроизвольный выход программы #15
-=ЮрА=- и kravam большое вам спасибо, если бы не ваша просьба показать весь проект, не нашёл бы ошибку наверно уж точно от меня по плюсу а вот alsav22 я поставил бы минус

Проблема была вот в чём
C++
1
2
3
4
5
6
7
8
9
10
11
int main(){   file_author();    
 
        //базовые настройки экрана и задание    заголовка
    
    //рисуем титульный экран и задаём ему анимацию
 
    // статическое меню выводим статическое меню
        file_author();
    // динамика меню
    reflex_menu();
}

проблема была в этом file_author() это процедура создания файла-шаблона, при старте программы она дважды создавала файл, но!!! если вернуться из какого-либо режима, то есть дальней функции из которой удаляются ранее созданные переменные и классы, то происходит самовылет.

Я сделал глобальную булевскую переменную, чтобы файл-шаблон создавался единожды и скинул тестеру, отписался об успешном исправлении проблемы.
Всем спасибо тема закрыта!
-=ЮрА=-
13.03.2013, 16:37
  #16

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
//if(memcmp(&x,&IID_IUnknown,2));
-
есть сравнение литерала x и IID_IUnknown, можно проверить эквивалентны ли CLSID-ы

Цитата Сообщение от kravam Посмотреть сообщение
//а так нет
* memcmp(&x,&IID_IUnknown,2);
- бесполезный и бессмыленный вызов, что эквивалентны CLSID что нет, всё равно код поедит далее.
Супер решение!

PS:строку memcmp без if можно вообще выкинуть, ничего не изменится.
Видимо там стоял memcpy

alsav22
13.03.2013, 17:00
  #17

Не по теме:

-=ЮрА=-, ТС мне не захотел отвечать, может ты просветишь... самопроизвольный выход программы

kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.03.2013, 17:32     самопроизвольный выход программы #18

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- бесполезный и бессмыленный вызов, что эквивалентны CLSID что нет, всё равно код поедит далее.
Супер решение!
Ну и чё? Так-то вообще весь код бесполезный. Мне главное было получить минимальный компилящийся код. Чтобы простыню не выкладывать. Так понятней?

О, Господи... я выкладываю минимизированный код- в ответ слышу- на хрена ты минимизируешь... Да ты вообще не лезь, без твоей помощи разобрался уже.



Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Видимо там стоял memcpy
Чё гадать-то, видимо- невидимо... Возьми да посмотри оригинал, я выложил же выше.

-=ЮрА=-
Заблокирован
Автор FAQ
13.03.2013, 18:35     самопроизвольный выход программы #19
alsav22, ты прав составное условие можно заменить простым n==0 проверка не равно -1 излишня
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 22:30     самопроизвольный выход программы
Еще ссылки по теме:

C++ выход из программы
Выход из программы C++
C++ Выход из программы

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

Или воспользуйтесь поиском по форуму:
el Domaco
 Аватар для el Domaco
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 16
13.03.2013, 22:30  [ТС]     самопроизвольный выход программы #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
alsav22, ты прав составное условие можно заменить простым n==0 проверка не равно -1 излишня
ааай, сделал как показалось достаточным. Раз уж на то пошло, как можно перехватить код с клавиатуры так, чтобы не было зарежки? Приведу пример во флеше

движение 1 - кнопка: движение, пауза, продолжительное движение
движение 2 - клип: движется продолжительно без задержки

как сделать второе? Я так и не нашёл. Плюс что за функция GetAsyncKeyState? как-то не сталкивался
Yandex
Объявления
13.03.2013, 22:30     самопроизвольный выход программы
Ответ Создать тему
Опции темы

Текущее время: 01:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru