КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Динамические объекты
End if Next End if redim sled(1 to len1) for i=1 to len1 sled(i)= false i=1: fl1= true do while i<=len1 and fl1 j=1: fl2= true do while j<=len2 and fl2 if not sled(j) and _ mid(str1, i, 1)= _ mid(str2, j, 1) then sled(j)= true: fl2= false j=j+1 loop if fl2 then fl1= false i=i+1 loop anagr=fl1 end function short len1, len2, i, j, fl1=1,// 1 - анаграмма, 0 - нет fl2, // 1 - символ в str2 найден, // 0 - нет sled[20]; /* 1 - j-й символ в str2 использован, 0 – нет */ len1=strlen(str1); len2=strlen(str2); if(len1!= len2) return 0; for (i=0; i<len2; i++)sled[ i ]=0; for (i=0; i<len1 && fl1; i++){ fl2=1; for (j=0; j<len2 && fl2; j++){ if (!sled[ j ] && str1[ i ]==str2[ j ]){ sled[ j ]=1; fl2=0; } } if(fl2)fl1=0; } return fl1; } До сих пор для всех объектов, рассматриваемых в пособии, память выделялась по информации программы автоматически. Для объектов класса памяти static и extern во время трансляции в статической области, для объектов класса памяти auto и register динамически (во время выполнения) в области, называемой программным стеком. Однако, в языке C, как и во многих других языках программирования, имеется возможность выделять память под программные объекты прямым указанием программиста. Такие объекты располагаются в отдельной области – куче (heap). Их принято называть динамическими. Для этих целей в библиотеки языка C включены функции malloc, calloc и free. Их прототипы хранятся в файле alloc.h. Выделение памяти. void* malloc (unsigned size); // Размер в байтах void* calloc (unsigned kol, // Число элементов unsigned size); // Размер в байтах Освобождение памяти: void free (void *ptr); Если памяти не хватает, то функции возвращают значение NULL. Освободить память в куче можно только функцией free. Как видно из прототипов, объекты в этой области имен не имеют и работа с ними выполняются исключительно с помощью указателей. Часто говорят, что куча - это неименованная область памяти. Для того, чтобы сделать программу независимой от компьютера и операционной системы, при выделении памяти используют оператор sizeof (<тип>). Пример. sizeof ( short ) à 2 байта sizeof (DATA) à размер определяется по инструкции typedef. Функции malloc и calloc возвращают указатель на void, который не может использоваться для ссылки на объект, поэтому при размещении объектов в куче программист обязан задать тип размещаемого объекта с помощью оператора приведения типа. Пример. Динамическое выделение памяти под массив заданного размера n. p=(char*) malloc (n* sizeof (char)); p=(char *)calloc(n, sizeof (char)); Примеры. Манипуляции с массивом произвольного размера. float *ptr, buf; short i, n; ........................................ printf("Длина массива:"); scanf("%d", &n); /* Выделить память под массив */ ptr=( float *)calloc(n, sizeof (float)); /* Ввести массив */ printf("Исходный массив\n"); for (i=0; i<n; i++){ scanf("%f", &buf); *(ptr + i) = buf; /* ptr[ i ] = buf; */ } ................................. free(ptr); 2. Функция substr – аналог функции mid языка Basic. #include <string.h> #include <alloc.h> /* Выделить из строки s подстроку длиной length с позиции begin */ /* Если length == 0, выделяется подстрока с begin до конца s */ char* substr(const char * s, short begin, short length){ char* p; / Подстрока */ short i; if (length == 0) length = strlen(s) – begin + 1; // До конца строки s /* Обработка ошибки */ if(begin < 1 || length < 1 || begin + length – 1 > strlen(s)) return NULL; p=(char*)calloc(length + 1, sizeof (char)); for (i=0; i < length; i++){ *(p + i) = *(s + begin + i - 1); } *(p + i) = '\0'; return p; } /* End substr */ Замечание. В функции память выделяется, но не освобождается, поэтому после того, как необходимость в выделенной памяти отпадет, ее следует освободить функцией free(p).
Дата добавления: 2014-12-27; Просмотров: 279; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |