Физикалық жобалау процедурасы – тәртібі, аспабы, ресурсы, құжаттары
Дәріс мақсаты: физикалық жобалау процедурасы – тәртібі, аспаптары, ресурстары, құжаттарын қарастыру.
Препроцессорлар және компилятор ерекшеліктері.
C++Builder-дің кейбір кілттік сөздері жайында, олар ANSI стандартына жатпайды. Сонымен қатар, Project | Options диалогы жайында айтамыз, онда программа компиляциясын басқаратын әртүрлі параметрлер беріледі.
Препроцессор директивалары
Препроцессорлық өңдеу процесстің бірінші фазасы деп аталатын, C/C++-тағы программаларды компиляциялайтын, бірақ C++Builder компиляторы аралық файлдарды препроцессорлық өңдеуден кейін де генерацияламайды. Бірақ, егер нәтижесінде препроцессор жұмысын көргіңіз келсе, онда срр32.ехе бөлек программасын командалық жолдан жіберіп көруге болады: срр32 myfile.c.
Макроанықтамалар.
Макроанықтамалар, әдетте макростар деп те аталады, препроцессордың #define директивасымен анықталады. #define макростарының үш түрлі формаларын атап айтуға болады: қарапайым символды анықтау, символдық константаны анықтау және параметрлері бар макростарды анықтау. Қарапайым анықтау келесі түрде беріледі: #define NDEBUG.
Мұндай директивадан кейін NDEBUG символы анықталған деп есептеледі. Ол ешнәрсені білдірмейді, бірақ жай ғана — анықталған (бос) екендігін білдіреді. Оны: #define NDEBUG 1 деп жазуға болады.
Ол кезде NDEBUG символдық константа ретінде де қолдануға болады. Сонымен, #define константаларды ғана емес, басқа текстілік көрсеткіштерді және операторлар тізбегін де анықтауға мүмкіндік береді, ол төменде берілген:
#define SHUTDOWN printf("Error!");
\ return -1
…
if (ErrorCondition()) SHUTDOWN; // "шықыру" макросты.
Кері бөлу белгісі (\) макрос келесі бетте жалғасатындығын көрсетеді. С операторларынан айырмашылығы препроцессор директивалары бір жолда орналасуы керек, егер ол орналаспаған жағдайда оның келесі жолда екендігі осы белгімен анықталады.
Ертерек анықталған макросты #undef директивасымен алып тастауға болады: #undef NDEBUG.
Бұдан кейін макрос анықталмаған деп есептеледі, одан кейінге оған қатынаулар компиляция кезіндеге қателерге алып келеді.
Алдын ала анықталған макростар.
C++Builder компиляторы автоматты түрде кейбір макростарды анықтайды. Оларды екі категорияға бөлуге болады: ANSI макростары және C++Builder-ге арналған спецификалық макростар. Алдын ала анықталған макростардың түрлері сәйкесінше 1- және 2-кестелерде берілген.
Көптеген алдын ала анықталған C++Builder макростары құрылатын компиляцияның әртүрлі параметрлерін командалық жолдан (bсс32.ехе копиляторын қолмен жіберу кезінде) бейнелеу үшін қоданылады. Осы жұмыстарды интеграцияланған ортада Project Options диалогы арқылы да орындауға болады, оны біз әлі қарастырамыз.
Параметрлері бар макростар.
Макростар тек текстік қойылымдарды ғана орындамайды. Праметрлері бар макростар С тілінің функцияларына ұқсас жұмыстарды да орындайды, мысалы:
#define PI 3.14159265
#define SQR(x) ( (x) * (x) )
#define AREA(x) (PI * SQR(x))
#define MAX(a, b) ((b) ? (a): (b))
…
circleArea = AREAfrl + r2);
cMax = MAX(i++, j++);
1 кесте – Алдын ала анықталған ANSI макростар
Макрос сипаттамасы
|
DATE
|
форматтағы литеральдық жол “mmm dd yyyy”, берілген файлдың препроцессормен өңделу күнін көрсетеді.
|
FILE
|
ағымдағы файлдың атын көрсететін жол (жақшада болады).
|
LIME
|
бүтін, ағымдағы файлдың нөмірін көрсететін жол.
|
STDC
|
1 тең, егер компилятор мен стандарт сәйкес келсе.
|
ANSI
|
(А командалық жолының – кілті). Басқа жағайда макрос анықталмаған.
|
TIME
|
“hh:mm:ss” форматындағы жол, файлды өңдеудің препроцессорлық уақыттын көрсетеді.
|
_file_ және _line_ макростарының мәні
|
#line директивасымен өзгертілуі мүмкін.
|
Үшінші макроанықтағыш макростар ішіне орналасқан бола алатындығын көрсетеді. Макростың әрбір кеңейтілуінен кейін препроцессор алынған тексті жаңадан сканерлейді де, ондағы өз кезегінде макрос болып табылатын идентификаторларды анықтайды.
Жөғарыда көрсетілген анықтаулардағы жақшаларға көңіл бөліңіз. Олардан келесі тәртіптерді құрастыруға болады: әрбір параметр және барлық анықтаулар бүтіндей жақшаға алынуы керек. Әйтпесе макросқа кіру кезінде операцияның приоритетіне байланысты қателер шығуы мүмкін. Келесі жағдайды қарастырайық:
#define SQR(x) х*х binom = -SQR(a + b);
Макростың кеңейтілуінен кейін келесі жол пайда болады:
binom = -a + b*a + b;
Wіndows-та программалау АРІ функциясын (программалық қолданбаның интерфейсі) пайдаланумен негізделген. Олардың көлемі 2000-ға жетеді. Операциялық жүйенің сыртқы құрылғылар мен қорлармен өзара әрекеттестігі осы функциялар көмегімен орындалады.
2 кесте – Алдын ала анықталған C++Builder макростар
Макростар мәндері сиапттамасы
|
ВСОРТ 1
|
кез келген компиляторда анықталған
|
BCPLUSPLUS 0х0540
|
Анықталған, егер компиляция С++ режімінде орындалса
|
BORLANDC
|
0х0540 Версия нөмірі
|
CDECL 1
|
Анықталған, егер cdecl шақыру жайында хабар болса, ал басқа жағдайда анықталмаған
|
CHARUNSIGNED 1
|
Үнсіздікпен анықталған (char үнсіздікпен unsigned char екендігін білдіреді). Оны К- кілтімен алып тастауға болады
|
CONSOLE
|
Консолдік қосымшаларды компиляциялау кезінде анықталады
|
CPPUNWIND 1
|
Стекті пайдалануға рұқсат алу; үнсіздікпен анықталады. Оны - xd- кілтімен алып тастауға болады
|
cplusplus 1
|
C++ режімінде компиляциялау кезінде анықталады
|
DLL 1
|
анықталған, егер динамикалық кітапханамен компиляцияланса
|
FLAT 1
|
32-биттік жады моделімен компиляцияланса анықталаған
|
MIХ86
|
бар уақытта анықталған. Үнсізікпен мәні — 300. (мәнін өзгертуге болады 400 немесе 500, сәйкесінше /4 немесе /5 кілттерін командалық жолдан енгізесіз)
|
MSDOS 1
|
Бүтін константа
|
MT 1
|
Анықталған, егер WM – опциясы орналасса. Ол мультисызықты (multithread) кітапхана қосылатындығын көрсетеді
|
PASCAL 1
|
Анықталған, егер Pascal-ды шақыру жайында шарт берілсе
|
TCPLUSPLUS 0х0540
|
Анықталған, егер компиляция C++ режімінде орындалса (bcplusplus ұқсас)
|
TEMPLATES 1
|
C++ файлдары үшін анықталған (шаблондар қолданылатындығын көрсетеді)
|
TLS 1
|
Thread Local Storage. C++Builder –де барлық уақытта анықталған
|
TURBOC 0х0540
|
Версия нөмірі ( BORLANDC ұқсас)
|
WCHAR T 1
|
Тек C++ программаларында анықталағн (wear t — іштей анықталған тип екендігін көрсетеді
|
WCAR T DEFINED 1
|
WCHAR Т сияқты. Windows код үшін анықталған, тек Windows-та қолданылады
|
WIN32 1
|
Консольдік және GUI-қосымшалар үшін анықталған
|
АРІ функцияларының тізімін және олардың бейнелеуін Borland C++ дестесі WІN32.HLP файлынан алған дұрыс болады. Wіndows ортасындағы программаның басты элементі терезе болып табылады. Әрбір терезе үшін хабарларды өңдеудің өз процедурасы бар. Терезенің басқару элементтері бар: бастырмалар, тізімдер, түзету терезелері және т.б. Бұл терезелердің ерекше қасиеттері бар. Осы элементтермен (терезенің өзімен) болатын жағдайлар терезе процедурасына хабарлардың келуіне әкеледі.
Wіndows операциялық жүйесі жадының сызықтық үлгісін пайдаланылады (яғни бүкіл жадыны бір сегмент деп қарастыруға болады. Жадының кез келген ұяшығының адресі бір 32 биттік регистр құрамымен, мысалы ЕВХ-пен анықталады).
Wіndows ОЖ көпесепті орта болып табылады. Әрбір есептің өз адрестік кеңістігі және хабарлар тізбектілігі бар және де бір программа шегінде көпесептілік жүзеге асырыла алады - әрбір процедура жеке есеп сияқты іске қосыла алады.
АРІ функциясын қалай шақыруға болады. Мысал ретінде Message Box (хабар терезесі) функциясын қарастырамыз:
Іnt MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaptіon6 UІNT uType)
Бұл функция экранға хабары бар және шығу бастырмаса (немесе бастырмалары) бар терезені шығарады. Параметрлердің мәні: HWnd - хабар терезесі шығатын терезе дескрипторы, LpText- терезеде шығатын мәтін, LpCaptіon - терезеде бастамасындағы мәтін, UType - терезе типі, негізінде шығу бастырмаларының санын анықтауға болады.
Параметрлер типтері – олардың бәрі 32 битті бүтін сандар: HWND- 32 битті бүтін, LoctSTR- 32 битті жолға нұсқағыш, UІNT- 32 битті бүтін.
Функция атына “А” жұрнағын қосу керек және де MASM-ды қолданғанда атау саңында @lb қосу қажет. Функциямен нұсқалған шақыру былай көрсетіледі: CALL MessageBoxA@lb.
Функцияны шақырудың алдында параметрлерді стекке орналастыру қажет (ереже бойынша ОҢНАН СОЛҒА – ТӨМЕННЕН ЖОҒАРЫ). Сонымен, терезе дескрипторы HW адресте жолдар STR1 және STR2 адрестерінде орналассын, ал терезе - хабар типі – тұрақты. Ең қарапайым типтің 0 мәні бар және ол МВ – ОК деп аталады. MessageBox функциясының uType параметрінің мәні бар.
MB_OK equ 0;
STR 1 DB “Дұрыс емес енгізу !’, 0
STR 2 DB “Қате туралы хабар “, 0
HW DWORD ?
:
PUSH MB_OK
PUSH OFFSET STR1
PUSH OFFSET STR2
PUSH HW
CALL MessageBoxA@lb
Кез келген функцияны орындаудың нәтижесі – EAX регистрында қайтарылатын бүтін сан.
Ұқсас амалдармен CИ-құрылымдарын құру өте жеңіл. Жүйелік хабарды анықтайтын құрылымды қарастырайық:
Typedef struct tagMSG{umsg
HWND hWnd ; адрестелген терезе дескрипторы
UІNT message ; хабар идентификаторы
WPARAM wParam ; хабарлар параметрлері, әрбір хабар
LPARAM lParam ; үшін олар түрлі.
DWORD tіme ;жіберу уақыты
POІNT pt ;хабары өңдеу кезіндегі меңзер орны
} MSG;
Енді барлық (толық) программаның құрылымын қарастырамыз (Wіndows-ғы программаның классикалық құрылымы).
Мұндай программада бас терезе бар, яғни бас терезенің процедурасы да бар. Программа шарттаңбасында келесі секцияларды бөлуге болады:
- терезелер класын тіркеу;
- бас терезені құру;
- хабарлар тізімін өңдеу циклы;
- бас терезе процедурасы.
Бұл бөлімдер программаның негізгі қаңқасын құрайды.
Достарыңызбен бөлісу: |