C, PHP, VB, .NET

Дневникът на Филип Петров


Архив за октомври, 2008

* Функции за разпределение на паметта

Публикувано на 26 октомври 2008 в раздел С/С++.

Всеки компютър разполага с определено количество свободна памет. За да се използува ефективно тя трябва да се разпределя динамично. В С имаме възможност да променяме подразбиращият се размер на стека по време на изполнението на програмата. Програмистът обаче сам трябва да се грижи да предпазва стека от препълване.

Ще разгледаме две от функциите за разпределение на паметта от високо ниво – malloc, calloc и free.

1. malloc: Резервира блок памет и връща указател към блока:

	int *p = (int *)malloc(unsigned bytes);

Чрез bytes указваме точно колко байта памет искаме да резервираме. Ако няма достатъчно памет в указателя p ще се запише NULL. Имайте предвид, че ако се опитате да записвате информация чрез такъв указател програмата ще завърше с фатална грешка, затова винаги проверявайте резултатът от malloc! Прочети още…

.

 


* Работа с файлове от ниско ниво (UNIX стил)

Публикувано на 26 октомври 2008 в раздел С/С++.

Функциите open, close, creat, unlink, read, write и lseek предоставят небуфериран достъп до данните във файловете. Това означава, че ще е нужно ние сами да се грижим за създаването на съответен буфер. Използват се предимно при UNIX -базирани операционни системи (Linux или BSD например).

1. open: Отваря файл с режим на достъп четене (0), запис (1) или четене+запис:

	int fd = open(char *path, int flags, mode_t mode);

Променливата fd се напича дескриптор на файла. Ако отварянето на файла не е възможно, то дескриптора ще получи стойност -1. Входния параметър name е символен низ, който описва пътя до файла в операционната система. Флаговете (flags) са следните:
O_RDONLY – само за четене.
O_WRONLY – само за запис.
O_CREAT – Създава файла ако той не съществува.
O_TRUNC – Изтрива съдържанието на файла.
Прочети още…

.

 


* Списък на функциите от други библиотеки

Публикувано на 26 октомври 2008 в раздел С/С++.

Представяме списък с функциите на други често използвани библиотеки:

1. string.h:
memchr();
memcmp();
memcpy();
memmove();
memset();
strcat();
strncat();
strchr();
strcmp();
strncmp(); Прочети още…

.

 


* Библиотека ctype.h

Публикувано на 26 октомври 2008 в раздел С/С++.

Библиотеката ctype.h съдържа следните функции:

isalnum(char c): Проверява дали символа е буква (A-Z или a-z) или цифра (0-9)

isalpha(char c): Проверява дали символа е буква (A-Z или a-z)

iscntrl(char c): Проверява дали символа 0x00-0x1F или 0x7F

isdigit(char c): Проверява дали символа е цифра (0-9)

isgraph(char c): Проверява дали символа е от множеството, което може да се отпечата, без space (0x21-0x7E)

islower(char c): Проверява дали подадения символ е малка буква (a-z)

isprint(char c): Проверява дали символа е от множеството, което може да се отпечата (0x20-0x7E)

ispunct(char c): Проверява дали символа е от множеството, което може да се отпечата, но без space и всички alphanum символи

isspace(char c): Проверява дали символа е space, tab, carriage return, new line, vertical tab или formfeed

isupper(char c): Проверява дали символа е главна буква (A-Z)

isxdigit(char c): Проверява дали символа е шеснайсетично число (0-9, A-F или a-f)

char tolower(char c): Преобразува главна в малка буква

char toupper(char c): Преобразува малка в главна буква

.

 


* Работа с файлове от високо ниво

Публикувано на 26 октомври 2008 в раздел С/С++.

Когато създаваме каквато и да е програма обработваща данни обикновено се налага да съхраняваме данните след приключването на програмата. Много често се налага и прочитане на данни от вече съществуващи файлове. В С функциите за достъп до файлове от високо ниво са fopen, fclose, getc, putc, fgetc, fputc, ungetc, fseek, fprintf, sprintf, fscanf, sscanf, remove, fgets и fputs. Всички те се намират в stdio.h.

Преди да започнем описанието на функциите трябва да отбележим, че има два вида достъп до дискови файлове – буфериран и небуфериран. Функциите от високо ниво използват буфериран достъп до файловете. При него се чете или записва символ по символ и програмистът не се занимава със системно зависими особености. Прочети още…

.

 


* Данни с изброими стойности

Публикувано на 25 октомври 2008 в раздел С/С++.

Може да създаваме и данни, които приемат стойности от крайно множество на целите числа. Изключително е удобно да ги използваме в ситуации, които се характеризират със съвкупност от възможни варианти. Общият синтаксис е:

	enum име_на_типа{списък_на_стойностите}променливи;

Типичен пример за С е липсата на булеви променливи в езика: Прочети още…

.

 


* Предефиниране на типове

Публикувано на 25 октомври 2008 в раздел С/С++.

Друга удобна конструкция в езика С е създаването на собствени имена на типовете на променливите. Това се извършва чрез описанието typedef:

	typedef <стар тип> <нов тип>;

Името определено с typedef може да се използва за описание на променливи (то е еквивалентно на съществуващ тип). Например:

	typedef int NEWNAME;
	NEWNAME i,j;
 Прочети още...

.

 


* Разредни полета

Публикувано на 25 октомври 2008 в раздел С/С++.

В езика за програмиране С могат да се дефинират набори от последователни битове. Такива набори се наричат „разредни полета“. Те осигуряват връзката между високото ниво на езика и ниското ниво на апаратната част.

Разредните полета се дефинират като елементи на структура по следния начин:

	unsigned int <име>:<размер>

Следният пример демонстрира дефинирането на разредни полета: Прочети още…

.

 


* Обединения

Публикувано на 25 октомври 2008 в раздел С/С++.

Обединенията са много сходни с описаните вече структури. Всички правила за дефиниране на структури са валидни и за обединенията:

	union name{
		int i;
		float f;
		char c;
		double d;
	} x,y;
	...
	union name z;

Обръщението към елементи също е аналогично. Съществената разлика между обединенията и структурите е свързана с паметта, която се резервира при дефиниране на конкретна променлива. Прочети още…

.

 


* Проблеми свързани с използването на scanf

Публикувано на 25 октомври 2008 в раздел С/С++.

Както вече се запознахте scanf е удобна функция за четене на различни типове данни от клавиатурата. Всеки, който я е използвал активно обаче се е сблъсквал с един много неприятен проблем – невалидно подадени данни от клавиатурата. Например:

	int number;
	printf("I will check if your numbers are odd or even. Type 0 to exit.\n\n");
	do{
		printf("type a number");
		scanf("%d", &number);

		if (number != 0){
			if (number%2 == 0) printf("Even!\n");
			else printf("Odd!\n");
		}

	} while (number != 0);

На пръв поглед програмата върви нормално. Въвеждаме числа от клавиатурата и програмата проверява дали са четни или нечетни. Когато въведем 0 програмата ще спре. Какво ще се случи обаче ако не въведем число, а например буквата ‘a’? Прочети още…

.