Как да се по програма на Би Би Си
В четвъртия статия, аз ще обсъди важната тема за всеки C програмист, защото това може да доведе до много проблеми: динамично разпределение на паметта (динамично разпределение на паметта). Неразбирането на този механизъм (и показалеца) може да доведе до течове и грешки в паметта при прилагането (например, за да Segmantation Fault Грешка).
За да използвате библиотеката, първо трябва да инсталирате пакетите ncurses:
След това, в началото на източника файла, който искате да добавите заглавието на ncurses, като положат #include
-l опция указва на свръзката да добавите споделена библиотека ncurses. И като резултат виждаме следния изход:
Работещи ДЛД показва, че приложението изисква присъствието в нашата система libncurses.so.5 библиотека. Но това означава, че няма да бъде в състояние да стартирате тази бинарна система, където има библиотеката. Какво може да ncurses? В действителност, терминал текст - това е странно нещо. Използването ФОРМАТ (), можете да покажете текст, но той винаги се появява в края на линията. Вие не можете да се върнем назад, използване на цветове, печат мастни знаци и т.н. Има и "контролни последователности" (избяга последователности), които оказват влияние върху поведението на курсора и показва съобщението в такива терминали (те съществуват от самото начало на историята на компютрите). Но такива последователности не са подходящи за хора. Така че, ncurses - един вид обвивка, която улеснява използването на изходни последователности. В примерния код Добавих // проверено след извикване на функция, които се отнасят до ncurses. Това са функции, които съм използвал:
getmaxyx () връща размера на терминала
ясно () почиства екрана
mvaddch () показва характера на определено място
опресняване () прави принуден програмата в терминала
endwin () е приключил правилно работа при изходна клема
initscr () инициализира ncurses библиотека
Основната функция прави малко (вж. Обява 1). Той инициализира на екрана (линия 6), и актуализира всяка секунда масив от снежинки (линия 12). Има само една особеност - функция atexit (). Той се използва, за да възложи на приложението, което ви трябва, преди да отиде да се обади тази функция. Неговият код е даден в Обява 2. То просто изисква endwin (). Имайте предвид, че тя използва техника, наречена "показалеца, за да функционира» (функция показалка). Можем да използваме указатели към функции, както и на данните, и това е само името на функцията без скоби.
В основния () имаме съхранение на брой редове, колони и масив от снежинки. Ние премине тези три параметъра в функция updateFlakes () (виж Обявата 3). Ако размерът на терминала се променя, тя заделя памет. Тази функция се казва в терминал размер за всяко повикване. Ако те не съвпадат съхранява в главната, новият масива се разпределя, и всичко започва от начало. В линии от 6 до 19 се чете размери и памет се разпределя (и освободен зает, ако я има). Ето само с помощта на динамично разпределение. Понякога преди съставянето на неизвестно колко памет е необходима. Тук имаме нужда от един байт за всяка позиция на екрана, но размера на прозореца не е фиксирана по време на компилация, така че трябва да го знаят и разпределя точното количество памет. Същото нещо се случва, когато промените размера на прозореца, когато искате да обновите количеството памет е необходимо. За тази цел функция изчистване () (линия 15) и свободно () (линия 13). функция изчистване () (което е памет разпредели - да се разпределят памет), който искате да преведете сумата от байтове, които искате да изберете, и го връща указател към броя байтове (или NULL, ако паметта е повече). безплатно функция () информира системата, която вече не е необходима паметта. Комбинация неправилно изчистване () и безплатен () ще доведе до изтичане на памет и в крайна сметка да се свие прилагане. Е, това е всичко. Обикновено, не е тя? Сега става ясно, колко може да създаде проблем при използването на динамично разпределение на паметта?
![Как-да от програмата на Би Би Си (Gosa) Как да се по програма на Би Би Си](https://webp.images-on-off.com/27/115/325x165_xh6tyazm7xq7luox33dr.webp)
И накрая, просто трябва да обхождане на масива и донесе сняг на екрана. Това е показано на Обява 4. Това са само две за цикъл - по един за редове и друга - за колоните; след това да реши дали да се покаже снежинка.
За много "трудно материал", въпреки че представя само четири статии бяха осветени. Можете да видите, че в тази статия ние вече се отдалечава от общото програмиране на C и се измества към по-специфични приложения за Linux / Ubuntu. Целта на тези статии е продължение на това и все повече и повече призив към типични приеми на програмирането за Linux, и по този пожелавам на всички ентусиасти, Честита Нова Година, пълни с откритие.
Направете план за кандидатстване на вашата система (това е необходимо да намерите желания титлата, намек: моля обърнете се към човек-страници на разговори, които дават ясна грешка).
Вместо exitfun () прехвърляне на atexit (), трябва незабавно да прехвърляте endwin (); провери, че тя работи. Прочетете човек-страницата. Прототипи какви функции е необходимо. Защо няма смисъл да прехвърли функциите, които не връщат стойност.
Изключете за област преразпределение. Сега се опитайте да промените размера на прозореца. Има ли някакви предимства?
Имайте предвид, че се използва поле масива не се освобождава свободно функция (), когато излезете. Тя няма да създаде проблеми, а не да предизвика изтичане на паметта и ядрото ще освободи паметта. Направи поле глобална променлива (поставяне е главната ()) и освобождаване на паметта на изхода.
Напиши кода на приложението, докато (1), за да потвърдите, че паметта е най-накрая приключи.
Научете човека-страниците на случаен принцип и Srand, за да научите как да се започне генератор на случайни числа.
![Как-да от програмата на Би Би Си (10.04) Как да се по програма на Би Би Си](https://webp.images-on-off.com/27/115/434x284_282nfu4bxgs3dn7s5lv3.webp)
Ели де Brauwer - Linux фанатик от Белгия, сега работи като разработчик на фърмуера в една от водещите компании в сателитна трансмисия. Когато той не е със семейството си, той обича да играе с технологията, и прекарва дните си в очакване на Blizzard най-накрая да пусне Diablo III.