WriteLn за C Builder (източник) - Софтуерни продукти
Съдържание
Програмистите на Delphi използват функцията WriteLn като инструмент за отстраняване на грешки от дълго време. Текстът, подаден на WriteLn, се изпраща до прозореца на конзолата, превръщайки го в лог файл в реално време. Използвайки този подход, можете да наблюдавате поведението на вашата програма в критични за времето секции от кода, където нормалните точки на прекъсване няма да работят. За съжаление, C++Builder не включва функцията WriteLn. Въпреки това, няма причина да не го приложите сами. В тази статия ще ви обясня как да го направите. Като част от обяснението ще разгледаме и функциите AllocConsole, GetStdHandle и WriteConsole Windows API.
WriteLn в Delphi
Използването на функцията WriteLn в Delphi се състои от две стъпки. Първо разпределяте конзолен прозорец за вашето приложение и след това извиквате WriteLn. Кодът изглежда по следния начин:
AllocConsole е API функция на Win32 и, както подсказва името й, тя разпределя конзолен прозорец за приложение. Всяко приложение може да има свой собствен конзолен прозорец - но само един. Това важи както за GUI приложения, така и за стандартни конзолни приложения.
След като прозорец на конзолата е разпределен за приложението, функцията WriteLn записва текст в него. Системата е проста, но изключително ефективна. Всъщност в някои ситуации при отстраняване на грешки само той е достатъчен.
Конзолен изход в C++
C++Builder има инструменти за отстраняване на грешки, подобни на WriteLn. Диагностичните макроси TRACE и WARN и функцията OutputDebugString правят, до първо приближение, същото нещо като функцията WriteLn. Но тяхното използване, въпреки това, страда от един недостатък: тяхната производителностсе насочва към лог файл, който не се актуализира, докато приложението не се задържи на точка на прекъсване или излезе. Това ограничава използването на горните инструменти в някои ситуации.
Но добрата новина, освен факта, че WriteLn е лесен за внедряване в C++Builder, е, че можете да включите функции за управление на конзолата директно в неговата реализация, което в крайна сметка ще направи използването на вашата собствена функция WriteLn много по-лесно. WriteLn изисква манипулатор на изходния буфер за прозореца на конзолата, който можете да получите с функцията GetStdHandle. Като цяло всичко ще изглежда така:
Нека да разгледаме по-отблизо кода. Извикването на AllocConsole очевидно разпределя прозорец на конзолата за вашето приложение. На втория ред функцията GetStdHandle извлича манипулатор към стандартния изходен буфер. Вие предавате стойността STD_OUTPUT_HANDLE на тази функция, за да "помолите" Windows да ви даде манипулатор на стандартния буфер.
След като имате манипулатор на стандартния изходен буфер, можете да извикате функцията WriteConsole, за да напишете текст в прозореца на конзолата. Първият параметър на функцията WriteConsole е манипулатор на стандартния изходен буфер, вторият параметър е текстът, който се изпраща към конзолата, а третият параметър е броят знаци, които трябва да бъдат изведени.
WriteLn за C++Builder
Сега, след като знаете всичко, от което се нуждаете, можете да създадете своя собствена функция WriteLn. Първо, нека декларираме неговия прототип. Много е просто:
Както можете да видите, функцията приема параметър String и не връща нищо. Разбира се, стойността на текстовия параметър ще бъде текстовият изход към конзолата. Нека сега да разгледаме WriteLn в неговата цялост:
Първо декларирате статична променливаhandle - това ще ви каже дали конзолен прозорец вече е бил разпределен за вашето приложение (не забравяйте, че статичната променлива има начална стойност нула и запазва стойността си между извикванията на функция). Ако стойността на променливата манипулатор е нула, тогава прозорецът на конзолата все още не е разпределен. Така че можете да извикате AllocConsole. След това извиквате GetStdHandle, за да получите манипулатор на стандартния изходен буфер. След това добавяте символ за нов ред в края на текста, предаван на функцията. Това гарантира, че всеки ред ще започне на нов ред. Накрая извиквате WriteConsole, за да напишете текст в прозореца на конзолата. Обърнете внимание, че предавате дължината на низа от текст като трети параметър на функцията WriteConsole, така че целият низ се отпечатва на конзолата.
Списъкът по-долу е програма, използваща функцията WriteLn. Това е основната форма с един бутон. Когато щракнете върху бутона, цикълът извиква функцията WriteLn, за да напише двадесет реда текст в прозореца на конзолата.
Заключение
Функцията WriteLn може да бъде чудесен инструмент за отстраняване на грешки. Може да не го използвате често, но когато наистина имате нужда от него, няма заместител за него.