Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з дисципліни: “Основи алгоритмізації та програмування”
З лабораторної роботи №6
На тему « Засоби відлагодження інтегрованого середовища: вiкно спостереження за вмiстимим пам'ятi (Memory windows) i вiкно спостереження за за стеком викликiв (Call Stack). Розв'язування на С задач, в яких використовуються масиви типу char i рядки»
Мета роботи
познайомитися iз засобами вiдлагодження Memory windows та Call Stack iнтегрованого середовища Visual C++ 2005;
познайомитися iз використанням масивiв типу char i рядкiв у мовi програмування С.
Засоби відлагодження Memory windows та Call Stack
Засоби Memory windows та Call Stack є бiльш "тонкими" iнструментами вiдлагодження.
З допомогою Memory windows можна спостерiгати за значеннями комiрок пам'ятi комп'ютера, в яких зберiгаються данi, пiд час виконання програми.
Для встановлення вiкна (чи вiкон) спостереження за пам'яттю використовується меню Debug/Windows/Memory iнтегрованого середовища Visual Studio.
Для перегляду конкретної областi пам'ятi потрiбно задати адресу цiєї областi. Отримати таку адресу можна у вiкнi Autos чи Locals. Для масивiв у цих вiкнах видається адреси першого елемента масиву, для простих змiнних адресу можна отриматм записуючи у вiкнi Watch вираз з операцiєю отримання адреси (операцiя &).
Розглянемо використання цього засобу на прикладi конкретної програми iз книжки Мартынов Н.Н. Информатика: С для начинающих.-М.:КУДИЦ-ОБРАЗ, 2006. Вiзьмемо програму Лiстинг 3.11:
#include <stdio.h>
#include <math.h>
double ArrAver( int ar[], int size );
double ArrDisp( int ar[], int size );
int main( void )
{
int size; double Disp;
int Arr[] = { 1,6,3,2,5,1,77,-18,99,16,45,12,-45,54,
567,-123,5,9,-4,67,-17,44,2,3,9,5,34,
11,-11,234,67,82,91,3,7,5,-32,-56,-77,
678,-987,456,-123,555,3,78,1,93,-4,37,
2,33,6,543,-88,37,66,-66,777,12,-45,567,
999,888,3,-765,34,89,-37,41,333,56,-987
};
size = sizeof( Arr ) / sizeof( int );
Disp = ArrDisp( Arr, size );
printf( "Disp is %Lf\n", Disp );
return 0;
}
double ArrAver( int ar[], int size )
{
int i, Sum = 0;
for( i = 0; i < size; i++ )
Sum = Sum + ar[i];
return Sum / size;
}
double ArrDisp( int ar[], int size )
{
double Aver, dSum = 0; int i;
Aver = ArrAver( ar, size);
for( i = 0; i < size; i++ )
dSum = dSum + ( ar[i] - Aver ) * ( ar[i] - Aver );
return sqrt( dSum / size );
}
Вiдкомпiлювавши цю програму i зробивши декiлька крокiв Step over (чи Step into), отримаємо:
Беремо аресу за якою в пам'ятi розмiщений масив Arr - 0x00012fe24 i заносимо її в поле Address вiкна Memory 1. Пiсля цього у ньому отримаємо значення елементiв масиву Arr.
У вiкнi Memory 1 ми бачимо значення у внутрiшньому кодi процесора комп'ютера. Кожне число типу int у внутрiшньому представленнi займає 4 байти. Першим (злiва) є молодший байт числа, а останнiм (четвертим) - старший байт. Вiд'ємнi числа представленi у доповняльному кодi. Так число 1 представлене як 00 00 00 01 (у вiкнi Memory 1 навпаки - молодший байт злiва), число 6 - 00 00 00 06, число 77 - 00 00 00 4d, а число -18 - ff ff ff ee. Примiтка, тут для зручностi значення окремих байтiв роздiло пробiлом, а фактично це одне 32-розрядне число.
Вiкно Call Stack встановлюється з допомогою меню Debug/Windows/Call Stack. У виконавчих програмах побудованих компiлятором Visual C++ 2005 (до речi, як створених iншими компiляторами) передача параметрiв у функцiї здiйснюється через стек. З допомогою вiкна Call Stack можна вiдслiдковувати ланцюжок викликiв функцiй та значення параметрiв що передаються.
У цьому прикладi функцiя main викликає функцiю ArrDisp, а вона, в свою чергу, викликає функцiю ArrAver. Функцiя main, в свою чергу викликається iз iнтегрованого середовища, яка включає ще два виклики.
Індивідуальні завдання
Перевірити чи в задану послідовність символів входить кожна із букв слова key.
#include "stdio.h"
#include "string.h"
int main()
{
char str1[] = "the first step in char massiv is key to the programming";
char k[] = "k";
char e[] = "e";
char y[] = "y";
char *ach;
ach = strchr(str1, k[0]);
if (ach!=NULL)
printf("K in phrase\r\n");
ach = strchr(str1, e[0]);
if (ach!=NULL)
printf("E is phrase \r\n", ach);
ach = strchr(str1, y[0]);
if (ach!=NULL)
printf("Y is phrase\r\n");
return 0;
}
Висновок
Я познайомитися iз засобами вiдлагодження Memory windows та Call Stack iнтегрованого середовища Visual C++ 2005 та з використанням масивiв типу char i рядкiв у мовi програмування С.