C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 149 - О стеке / MFC шаг за шагом / Visual C++

Шаг 149 - О стеке

При программировании и выполнении программ есть понятие стека. Стек вобщем-то если просто - это участок памяти, который использует программа для вызова процедур. То есть при вызове процедуры в стек помещается адрес возврата и переменные этой процедуры. Создали простой код, в котором подряд вызываются три функции.

// Stecs.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"

void St1();
void St2();
void St3(int i);

void main()
{
St1();	
}

void St1()
{
	St2();
}

void St2()
{
	St3(1);
}

void St3(int i)
{
 cout << "This" << endl;
}
Установим курсор в строку cout << "This" << endl; и запустим выполнение программы в режиме отладки до курсора.

149_1.gif (4125 b)

Если теперь вызвать окно показывающее состояние стека, то можно увидеть очередь вызова функций. Вот как вызвать это окно.

149_2.gif (3113 b)

В этом окне должно быть примерно вот что:

St3(int 1) line 29
St2() line 24 + 7 bytes
St1() line 20
main() line 15
mainCRTStartup() line 206 + 25 bytes
KERNEL32! bff8b537()
KERNEL32! bff8b3e9()
KERNEL32! bff89dac()

Это и есть последовательность вызовов функций. А причем здесь MFC вы скажете. Для отладки, вы всегда сможете узнать окуда была вызвана эта функция даже если она вызывается из многих мест. Вот пример окна стека при работе MFC приложения.

CSD2View::OnDraw(CDC * 0x0064f8e0 {CPaintDC hWnd=0x00000fb4}) line 58
CView::OnPaint() line 182
CWnd::OnWndMsg(unsigned int 15, unsigned int 0, long 0, long * 0x0064fa54) line 1825
CWnd::WindowProc(unsigned int 15, unsigned int 0, long 0) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00771b20 {CSD2View hWnd=???}, HWND__ * 0x00000fb4, unsigned int 15, unsigned int 0, long 0) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x00000fb4, unsigned int 15, unsigned int 0, long 0) line 368
AfxWndProcBase(HWND__ * 0x00000fb4, unsigned int 15, unsigned int 0, long 0) line 220 + 21 bytes
KERNEL32! bff7363b()
KERNEL32! bff942e7()

Видно, что функция OnDraw была вызвана из OnPaint !!! Если Вы хотите точно знать как и что работает это как раз то, что Вам нужно !!! Исследуйте находите и пишите на сайт !!!


| |
Автор Каев Артем.
[AD]