tag:blogger.com,1999:blog-53745170184139422752024-02-19T00:01:28.926-08:00Программирование на С и С++Блог посвящен программированию на языках C и С++. Рассматриваются вопросы, связанные с использованием функций, входящих в C99. Для С++ рассматривается стандарт 92 года и нововведения, которые войдут в следующий стандарт языка.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.comBlogger20125tag:blogger.com,1999:blog-5374517018413942275.post-60162443221313794432010-03-20T01:20:00.001-07:002010-03-20T01:20:35.200-07:00Выделение памяти в stack<p>Обычно при динамическом выделении памяти используется heap. Однако такое выделение возможно и в stack’е. Для этого можно использовать набор функций _malloca и _freea, которые задекларированы в заголовочном файле <strong><em>memory.h</em></strong></p> <p>Рассмотрим функцию <strong><em>_malloc</em></strong>:</p> <p><strong><em>void *_malloca( size_t size );</em></strong> – size – размер выделяемой области памяти в байтах. Функция возвращает указатель на выделенную память. Если происходит ошибка, то возвращается нулевой указатель (NULL).</p> <p>Для освобождения памяти используется функция <strong><em>_freea</em></strong>:</p> <p><strong><em>void _freea( void *memblock );</em></strong> – memblock – указатель на участок памяти, который нам необходимо освободить.</p> <p>Рассмотрим пример использования данных функций:</p> <p>#include <malloc.h> <br />#include <string.h> <br />int main(int argc, char* argv[]) <br />{ <br />    char *p=(char *)_malloca(200); <br />    if(p){ <br />        char *str="Hello, world!"; <br />        strcpy_s(p,200,str); <br />        printf("%s", p); <br />        _freea(p); <br />    }else <br />        printf("Cannot allocate memory\n"); <br />    return 0; <br />}</p> albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-84604997467695073902009-12-12T16:04:00.000-08:002009-12-12T16:15:17.474-08:00Python...Изменим чуть-чуть сообщения блога. Посмотрим взаимодействие с python.<br /><br />В данном примере разберем обращение из python к библиотекам языка C.<br />Например, создадим скрипт для доступа к printf из библиотеки libc.dylib (MacOS). Для организации данного доступа необходимо воспользоваться модулем python ctypes, который позволяет обращаться к функциям из c-библиотек.<br /><br /><pre><br />from ctypes import *<br /></pre><br /><br />Загрузим библиотеку через CDLL:<br /><br /><pre><br />libc=CDLL("libc.dylib")<br /></pre><br /><br />Вызовем функцию printf и закончим первый пример:<br /><br /><pre><br />message="Hello, world"<br />i=libc.printf("First program: %s\n",message)<br /></pre><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMds15JaXMoEQsXQ17PLIu_5HK1FCbdeSeYdB9b-pYRKKyia19y2abeITQo2MIHXoLZT4LRFjwCYWzfoBGw5E1uMshuyE0LMVKBLAp_qvTuVtqGbSXl0H5A2vZk7e197P1arUXJtrdLMsP/s1600-h/python1.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 110px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMds15JaXMoEQsXQ17PLIu_5HK1FCbdeSeYdB9b-pYRKKyia19y2abeITQo2MIHXoLZT4LRFjwCYWzfoBGw5E1uMshuyE0LMVKBLAp_qvTuVtqGbSXl0H5A2vZk7e197P1arUXJtrdLMsP/s320/python1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5414507370717786722" /></a>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-66372097583680998752009-06-20T13:27:00.001-07:002009-06-20T13:27:29.691-07:00Информация по изменениям...Всю информацию по изменениям в блогах по программированию на различных языках, о добавлении новых презентаций, о начале новых курсов можно узнать через twitter: <a href="http://twitter.com/alexeibo">AlexeiBo</a>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-79488919485029263772009-05-07T08:42:00.000-07:002009-05-07T08:44:20.510-07:00ПрезентацииХотел бы напомнить, что презентации по темам, связанным с языками С и С++ и не только, доступны на ресурсе: <br /><a href="http://slideshare.net/albova">SlideShare</a>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-73354269691100167912009-05-07T08:28:00.000-07:002009-05-07T08:42:50.893-07:00Продолжение работы со спискамиРассмотрим работу с одно связанным списком, но предположим, что в списке каждая предыдущая структура хранит указатель на последующую. В этом случае, как я упоминал ранее в предыдущем посте, надо хранить указатель на первую структуру в списке. Если мы потеряем первую структуру, то потеряем и элементы списка. А почему? Она - одно связанная, указатель - с предыдущей на последующую, а, следовательно, мы можем двигаться только от первой к последней структуре в списке. Иначе не получится! ;)<br />А теперь код. Он похож на предыдущей, только вместо pLast и prev используем pFirst и next:<br /><br /><pre><br />typedef struct S2{int a; int b; S2* next;} S2_t;<br /><br /> // одно связанный список<br /><br /> S2_t *p2=0, *pLast2=0, *pFirst=0;<br /><br /> //построение списка<br /><br /> for(int i=0;i<10;++i)<br /> {<br /> p2=(S2_t *)malloc(sizeof(S2_t));<br /> memset(p2,0,sizeof(S2_t));<br /> p2->a=i;<br /> p2->b=i+10;<br /> if(pLast2)<br /> pLast2->next=p2;<br /> else<br /> pFirst=p2;<br /> pLast2=p2;<br /> }<br /><br /> //работа со списком<br /><br /> p2=pFirst;<br /> while(p2){<br /> printf("a: %d b: %d\n", p2->a,p2->b);<br /> p2=p2->next;<br /> }<br /><br /> //Удаляем четные элементы<br /><br /> p2=pFirst;<br /> S2_t* p22=pFirst;<br /> while(p2){<br /> if(!(p2->a&1)){<br /> if(p2==pFirst){<br /> p22=p2->next;<br /> pFirst=p22;<br /> free(p2);<br /> p2=p22;<br /> }else{<br /> p22->next=p2->next;<br /> free(p2);<br /> p2=p22->next;<br /> }<br /> }else{<br /> p22=p2;<br /> p2=p2->next;<br /> }<br /> }<br /><br /> printf("After removing:\n");<br /> p2=pFirst;<br /> while(p2){<br /> printf("a: %d b: %d\n", p2->a,p2->b);<br /> p2=p2->next;<br /> }<br /><br /> //удаление списка<br /><br /> p2=pFirst;<br /> while(p2){<br /> pFirst=p2->next;<br /> free(p2);<br /> p2=pFirst;<br /> }<br /></pre>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-36694670905450687502009-05-07T08:00:00.000-07:002009-05-07T08:17:39.393-07:00Работа с динамическими спискамиПосмотрим как работают динамические списки. Из чего они состоят? Из структур, в каждой из которой есть указатель на предыдущую либо последующую. Это верно для одно связанных списков. У дву связанных есть указатель на предыдущую и последующую одновременно.<br />Структура может выглядеть так:<br /><pre><br />typedef struct S1{int a; int b; S1* prev;} S1_t; <br /></pre><br />- имеет указатель на предыдущую<br /><pre><br />typedef struct S2{int a; int b; S2* next;} S2_t; <br /></pre><br />- имеет указатель на последующую<br /><br />Построим для первой структуры список из 10 элементов:<br /><br /><pre><br /> printf("first:\n");<br /> // односвязанный список<br /> S1_t *p1=0, *pLast=0;<br /> //построение списка<br /> for(int i=0;i<10;++i)<br /> {<br /> p1=(S1_t *)malloc(sizeof(S1_t));<br /> memset(p1,0,sizeof(S1_t));<br /> p1->a=i;<br /> p1->b=i+10;<br /> if(pLast)<br /> p1->prev=pLast;<br /> pLast=p1;<br /> }<br /></pre><br /><br />Выведем список на экран:<br /><br /><pre> <br /> p1=pLast;<br /> while(p1){<br /> printf("a: %d b: %d\n", p1->a,p1->b);<br /> p1=p1->prev;<br /> }<br /></pre><br /><br />Удалим из списка структуры, которые содержат первое нулевое поле либо четное:<br /><br /><pre> <br /> p1=pLast;<br /> S1_t* p11=pLast;<br /> while(p1){<br /> if(!(p1->a&1)){<br /> if(p1==pLast){<br /> p11=p1->prev;<br /> pLast=p11;<br /> free(p1);<br /> p1=p11;<br /> }else{<br /> p11->prev=p1->prev;<br /> free(p1);<br /> p1=p11->prev;<br /> }<br /> }else{<br /> p11=p1;<br /> p1=p1->prev;<br /> }<br /> }<br /></pre><br /><br />После работы надо освободить память:<br /><br /><pre><br /> p1=pLast;<br /> while(p1){<br /> pLast=p1->prev;<br /> free(p1);<br /> p1=pLast;<br /> }<br /></pre><br /><br />В начале работы со списком я всегда устанавливаю указатель <span style="font-weight:bold;">p</span>, с которым работаю, в начало списка.<br />При работе с одно связанным списком главное хранить указатель на последний элемент списка, если в списке указатели в структурах указывают с последующей на предыдущую структуры.<br />И надо хранить указатель на первую структуру в списке, если предыдущая структура хранит указатель на последующую.<br />В следующем посте я приведу пример для такой структуры.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-80682401795051612612008-11-17T12:35:00.000-08:002008-11-17T12:48:31.605-08:00__gnu_cxx и __verbose_terminate_handlerОтвлечемся от std. Рассмотрим пространство имен __gnu_cxx, в котором объявлен __verbose_terminate_handler, позволяющий получить больше информации о возникающей исключительной ситуации. Замечу, что это все тот же заголовочный файл exception.<br />Рассмотрим следующий код:<br /><br />int main (int argc, char * const argv[]) {<br /> std::cout << "Hello, World!\n";<br /> std::set_terminate(__gnu_cxx::__verbose_terminate_handler);<br /> int k=120;<br /> if(k>100)<br /> throw std::exception();<br /> else<br /> throw k;<br /> for(int i=k;i<1000;++i)<br /> std::cout<<".";<br /> return 0;<br />}<br /><br />На выходе получаем следующее:<br /><br />[Session started at 2008-11-17 23:42:53 +0300.]<br />Hello, World!<br />terminate called after throwing an instance of 'std::exception'<br /> what(): St9exception<br /><br />Как видно из примера, при возникновении исключительной ситуации выводится дополнительная информация о ней, что в некоторых случаях может быть полезным.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-76214993850146940962008-11-17T12:11:00.000-08:002008-11-17T12:23:13.931-08:00Использование set_terminateРешил немного написать по поводу set_terminate.<br />Функция set_terminate объявлена в заголовочном файле exception. Она имеет следующий вид:<br /><br /><span style="font-weight:bold;">terminate_handler set_terminate(terminate_handler) throw()<span style="font-style:italic;"></span></span>. <br /><br />В качестве параметра функция берет указатель на функцию, которая будет вызвана в случае терминирования программы.<br />Данный указатель на функцию имеет следующий вид:<br /><br /><span style="font-weight:bold;">void (* pF)(void)<span style="font-style:italic;"></span></span>. <br /><br />Если мы через функцию set_terminate устанавливаем новый обработчик, то она вернет нам старый, если ранее такой существовал для данной ситуации.<br />Возникает вопрос: а зачем нужно использовать set_terminate? В ответ можно сказать только следующее, что при ошибке в программе, которая ведет к терминированию этой программы, может возникнуть необходимость сохранить данные, закрыть файлы, записать в лог информацию о причинах ошибки и т.д.<br />В заключении привожу пример использования:<br /><br />#include <iostream><br />#include <exception><br /><br />void func1()<br />{<br />std::cout<<"The end"<<std::endl;<br />}<br /><br />int main (int argc, char * const argv[]) {<br /> std::cout<< "Hello, World!\n";<br /> std::set_terminate(func1);<br /> throw std::exception();<br /> return 0;<br />}<br /><br /> В результате работы программы получаем следующее: <br /><br />[Session started at 2008-11-17 23:10:04 +0300.]<br />Hello, World!<br />The endalbovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-74772689617159308872008-11-10T04:42:00.001-08:002008-11-10T04:56:37.037-08:00Книга по С++, которую я прочитал первойНашел я и книгу, которую прочитал первой при изучении языка С++. Она мне нравилась простотой и последовательностью изложения. Ее удобно использовать, изучая язык. Мне это в ней и нравилось. В настоящее время я, к сожалению, ее уже не имею в своем распоряжении, чтобы подробнее описать. Причина отсутствия: "подарил школьной библиотеке". Так что в школе, где я учился и работал, стало на одну книгу по С++ больше. "Отличный язык в широкие массы!!!".<br />А вот и ссылка на книгу:<br /><a href="http://www.ozon.ru/context/detail/id/3223525/?partner=albova"><img src="http://www.ozon.ru/multimedia/books_covers/1000501311.jpg" alt="Язык Си++" /><br />В. В. Подбельский<br /><br />Язык Си++</a>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-54207288423564400662008-11-10T04:34:00.000-08:002008-11-10T04:55:51.957-08:00Книга по С++На вопрос: "Какую книгу почитать по С++?", я предлагаю прочитать книгу Бьерна Страуструпа. Книга интересная, глубокая. Можно прочитать ее поверхностно, выяснив только те вопросы, которые Вас интересуют, а можно копнуть глубоко, прочитав "от корки до корки". Использовать ее как справочник мне очень нравится. Четкое изложение, наличие примера - все что надо для "прояснения вопроса".<br /><br /><a href="http://www.ozon.ru/context/detail/id/85559/?partner=albova"><img src="http://www.ozon.ru/multimedia/books_covers/mm592_19_07_01.jpg" alt="Язык программирования С++" /><br />Бьерн Страуструп<br /><br />Язык программирования С++. Специальное издание</a><br /><br />Эту книгу я прочитал не первой, однако, купив ее, пользуюсь постоянно.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-73423005556383930462008-11-10T04:08:00.000-08:002008-11-10T04:31:54.412-08:00Перегрузка операторов перенаправления из потока и в потокКогда мы используем вывод на консоль, то часто пишем следующий код:<br />std::cout<<"Hello, world"<<std::endl<br /><br />Предположим, что мы создали класс следующего вида:<br />class TestClass{<br /> public:<br /> TestClass();<br /> ~TestClass();<br />private:<br /> int i;<br /> std::string s;<br /> };<br /><br />Для вывода содержимого класса на экран можно воспользоваться созданным специально для этого методом:<br />class TestClass{<br /> public:<br /> TestClass();<br /> ~TestClass();<br /> void output(); // метод для вывода на консоль<br />private:<br /> int i;<br /> std::string s;<br /> };<br /><br />void TestClass::output(){<br /> std::cout<<"i="<<i<<"s="<<s<<std::endl;<br />}<br /><br />Тогда вывод для экземпляра будет выглядеть так:<br />TestClass tc;<br />tc.output();<br /><br />Такой вариант возможен, но он очень уж некрасив. Переопределим оператор перенаправления в поток, что позволит нам перенаправлять содержимое экземпляра класса в поток вывода:<br />TestClass tc;<br />std::cout<<tc<<std::endl;<br /><br />Для этого реализуем друга класса следующего вида:<br />class TestClass{<br /> public:<br /> TestClass();<br /> ~TestClass();<br /> friend std::ostream& operator<<(std::ostream& out, const TestClass& c);<br />private:<br /> int i;<br /> std::string s;<br /> };<br /> std::ostream& operator<<(std::ostream& out, const TestClass& c);<br /><br />Что содержится в теле данного оператора? В нем должен быть реализован функционал по перенаправлению полей класса в поток вывода, например:<br />std::ostream& operator<<(std::ostream& out, const TestClass& c)<br />{<br /> out<<"i="<<c.i;<br /> out<<" s="<<c.s;<br /> return out;<br />}<br />Т.к. оператор является другом класса, то он имеет доступ к приватным полям класса, что не требует от нас делать их публичными.<br /><br />Теперь, используя написанный код, можно выводить содержимое класса на консоль:<br /><br />TestClass tc;<br />std::cout<<tc<<std::endl;<br />TestClass *p=new TestClass();<br />std::cout<<"second: "<<*p<<std::endl;albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-2764126947668927952008-11-07T00:35:00.001-08:002008-11-10T05:00:45.760-08:00Еще одна книгаЧитать на русском хорошо. Но читать техническую литературу на английском приходится чаще. Можно попрактиковаться при чтении стандарта языка С на английском языке. Соответствующая ссылка приведена ниже:<br /><a href="http://www.ozon.ru/context/detail/id/1835234/?partner=albova"><img src="http://www.ozon.ru/multimedia/books_covers/0470845732.01.lzzzzzzz.jpg" alt="The C Standard" /><br />Standards Institute British <br />The C Standard : Incorporating Technical Corrigendum 1</a><br />Если успеете запастись данной книгой на выходные, то поделитесь своими впечатлениями на тему "Мои английские выходные".albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-36301661535744595272008-11-07T00:20:00.001-08:002008-11-10T05:00:33.637-08:00Интересная книгаХочется поделиться еще одной интересной книгой, которая в настоящий момент доступна для чтения:<br /><br /><a href="http://www.ozon.ru/context/detail/id/2699304/?partner=albova"><img src="http://www.ozon.ru/multimedia/books_covers/1000356030.jpg" alt="C Primer Plus" /><br /><br />Стивен Прата <br /><br />Язык программирования C. Лекции и упражнения</a><br /><br />В данной книге очень хорошо и подробно рассмотрен язык. Уделено внимание рассмотрению конкретных примеров. В принципе, эта книга может быть интересно разноуровневым специалистам. Написана известным человеком в данной области. Так что книга "на выходные" есть.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-30875797490583999102008-11-07T00:10:00.000-08:002008-11-10T05:00:21.527-08:00Использование функции _ExitРассмотрим второй вариант завершения программы.<br /><br />Для завершения программы без вызова обработчиков, зарегистрированных с помощью функции atexit, можно использовать функцию _Exit. Данная функция задекларирована следующим образом:<br />void _Exit(int).<br /><br />В качестве параметра функция принимает код возврата, с которым программа и завершается. <br />Как я уже упоминал: функции-обработчики не вызываются. Рассмотрим пример кода:<br /><br />int k=0;<br /><br />void exit1(){<br /> printf("At function exit1 %d\n",k++);<br />}<br /><br />void exit2(){<br /> printf("At function exit2 %d\n",k++);<br />}<br /><br />void exit3(){<br /> printf("At function exit3 %d\n",k++);<br />}<br /><br />void exit4(){<br /> printf("At function exit4 %d\n", k++);<br />}<br /><br />typedef void (* Func_t)(void);<br /><br />int main (int argc, const char * argv[]) {<br /><br /> Func_t arr[4]={exit1, exit2, exit3, exit4};<br /><br /> int i=0;<br /><br /> for(i=0;i<4;++i)<br /> atexit(arr[i]);<br /><br /> for(i=0;i<10;++i)<br /> if(i==5){<br /> printf("%d",i);<br /> _Exit(0);<br /> }<br /> printf("End of program");<br /> return 0;<br />}<br /><br />При выполнении данного кода произойдет следующее. При i==5 программа завершит свое выполнение путем вызова функции _Exit, при этом ни один из обработчиков вызван не будет. Результат выполнения приведен ниже:<br /><br />[Session started at 2008-11-07 11:10:00 +0300.]<br /><br />The Debugger has exited with status 0.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-52697556853522404312008-11-06T23:57:00.000-08:002008-11-10T05:00:05.520-08:00Использование функции exitРассмотрим варианты выхода из программы.<br /><br />Первый вариант - это выход при помощи вызова функции exit, которая выглядит следующим образом:<br />void exit(int)<br /><br />В качестве параметра в функцию нужно передать код возврата, с которым закончит свою работу программа.<br />При вызове функции программа завершает свою работу. При этом вызываются все функции, зарегистрированные с помощью функции atexit.<br /><br />Пример использования:<br /><br />int k=0;<br /><br />void exit1(){<br /> printf("At function exit1 %d\n",k++);<br />}<br /><br />void exit2(){<br /> printf("At function exit2 %d\n",k++);<br />}<br /><br />void exit3(){<br /> printf("At function exit3 %d\n",k++);<br />}<br /><br />void exit4(){<br /> printf("At function exit4 %d\n", k++);<br />}<br /><br />Это функции - обработчики завершения программы.<br /><br />typedef void (* Func_t)(void);<br /><br />int main (int argc, const char * argv[]) {<br /><br /> Func_t arr[4]={exit1, exit2, exit3, exit4};<br /><br /> int i=0;<br /><br /> for(i=0;i<4;++i)<br /> atexit(arr[i]);<br /><br /> for(i=0;i<10;++i)<br /> if(i==5){<br /> printf("%d",i);<br /> exit(0);<br /> }<br /> printf("End of program");<br />}<br /><br />При запуске данного кода получаем следующий результат:<br /><br />5 // Печатается счетчик цикла i<br />At function exit4 0 // Результат выводится последним обработчиком<br />At function exit3 1 // Результат выводится предпоследним обработчиком<br />At function exit2 2 // и т.д.<br />At function exit1 3albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-11096406033551051112008-11-04T05:59:00.000-08:002008-11-10T04:59:52.911-08:00Что можно почитать?Часто возникает вопрос: А где найти информацию по языку, стандарту и т.д. В принципе, таких мест много в сети. Но если удобно работать с печатными изданиями, которые всегда под рукой, "приятно шелестят страницами", не требуют наличия соединения с сетью, да и вообще ноутбука, то я могу порекомендовать следующее:<br /><a href=http://www.ozon.ru/context/detail/id/1529399/?partner=albova><img src="http://www.ozon.ru/multimedia/books_covers/1000088422.jpg" alt="Язык программирования C" /><br />Сэмюел П. Харбисон, Гай Л. Стил<br />Язык программирования C</a><br />Книга, а мой взгляд, написана очень хорошо. Полностью раскрыты возможности использования языка, приведены примеры.<br />Так что, эта книга заслуживает Вашего прочтения.albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-22166626239180320842008-11-03T12:31:00.001-08:002008-11-10T04:59:39.610-08:00Дополнение по atexitПо поводу 80 обработчиков:<div>хочу уточнить, что в первом тестовом примере было вызвано 200 обработчиков, а во втором вообще 1600.</div>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-76773556005284943112008-11-03T12:15:00.000-08:002008-11-10T04:59:24.591-08:00Дополнение по atexitЯ протестировал возможность добавления 32 обработчиков выхода через atexit. В результате тестов я обнаружил, что <span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 'Trebuchet MS'; font-size: 13px; ">i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465) </span><span class="Apple-style-span" style="font-size: medium;">позволяет мне добавить до 80 обработчиков. Тестовый код приведен ниже:</span><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 'Trebuchet MS'; font-size: 13px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">int</span> k=<span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">void</span> exit1(){</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"At function exit1 %d\n"<span style="color: rgb(0, 0, 0); ">,k++);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">int</span> main (<span style="color: rgb(170, 13, 145); ">int</span> argc, <span style="color: rgb(170, 13, 145); ">const</span> <span style="color: rgb(170, 13, 145); ">char</span> * argv[]) {</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">int</span> i=<span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">for</span>(i=<span style="color: rgb(28, 0, 207); ">0</span>;i<<span style="color: rgb(28, 0, 207); ">400</span>;++i)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(46, 13, 110); ">atexit</span>(exit1);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">for</span>(i=<span style="color: rgb(28, 0, 207); ">0</span>;i<<span style="color: rgb(28, 0, 207); ">100</span>;++i)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span>printf<span style="color: rgb(0, 0, 0); ">(</span><span style="color: rgb(196, 26, 22); ">"."</span><span style="color: rgb(0, 0, 0); ">);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "> <span style="color: rgb(170, 13, 145); ">return</span> <span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;"><br /></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;">На выходе получаем:</span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 1</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 2</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 3</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: georgia; font-size: 16px; "><span class="Apple-style-span" style="font-family: Courier; font-size: 12px; font-weight: bold; ">At function exit1 4</span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: georgia; font-size: 16px; ">...</span><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 13px; "></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 196</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 197</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 198</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 199</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;"><br /></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;">Если мы используем следующий код:</span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 13px; font-weight: normal; "></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">int</span> k=<span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">void</span> exit1(){</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"At function exit1 %d\n"<span style="color: rgb(0, 0, 0); ">,k++);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">void</span> exit2(){</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"At function exit2 %d\n"<span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(63, 110, 116); ">k</span><span style="color: rgb(0, 0, 0); ">++);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">void</span> exit3(){</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"At function exit3 %d\n"<span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(63, 110, 116); ">k</span><span style="color: rgb(0, 0, 0); ">++);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">void</span> exit4(){</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"At function exit4 %d\n"<span style="color: rgb(0, 0, 0); ">, </span><span style="color: rgb(63, 110, 116); ">k</span><span style="color: rgb(0, 0, 0); ">++);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">typedef</span> <span style="color: rgb(170, 13, 145); ">void</span> (* Func_t)(<span style="color: rgb(170, 13, 145); ">void</span>);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(170, 13, 145); ">int</span> main (<span style="color: rgb(170, 13, 145); ">int</span> argc, <span style="color: rgb(170, 13, 145); ">const</span> <span style="color: rgb(170, 13, 145); ">char</span> * argv[]) {</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "> </span>// insert code here...</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span>Func_t arr[<span style="color: rgb(28, 0, 207); ">4</span>]={exit1, exit2, exit3, exit4};</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "> </span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"Hello, World!\n"<span style="color: rgb(0, 0, 0); ">);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">int</span> i=<span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">int</span> j=<span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">for</span>(j=<span style="color: rgb(28, 0, 207); ">0</span>;j<<span style="color: rgb(28, 0, 207); ">400</span>;++j)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">for</span>(i=<span style="color: rgb(28, 0, 207); ">0</span>;i<<span style="color: rgb(28, 0, 207); ">4</span>;++i)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(46, 13, 110); ">atexit</span>(arr[i]);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="color: rgb(170, 13, 145); ">for</span>(i=<span style="color: rgb(28, 0, 207); ">0</span>;i<<span style="color: rgb(28, 0, 207); ">100</span>;++i)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; "> </span></span>printf<span style="color: rgb(0, 0, 0); ">(</span><span style="color: rgb(196, 26, 22); ">"."</span><span style="color: rgb(0, 0, 0); ">);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "> <span style="color: rgb(170, 13, 145); ">return</span> <span style="color: rgb(28, 0, 207); ">0</span>;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); ">}</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;">В этом случае результат еще интереснее:</span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;">...</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 13px; "></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit4 1596</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit3 1597</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit2 1598</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1 1599</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;"><br /></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;">Это говорит о том, что количество функций-обработчиков - не ограничено. Все зависит от конкретной реализации. </span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;">Однако, согласно стандарту, надо помнить, что гарантировано вызывается только 32 обработчика.</span></p></span><p></p><p></p><p></p></div>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-5292160261529008132008-11-03T11:33:00.000-08:002008-11-10T04:58:24.962-08:00Использование atexitИспользование функции atexit... Функция позволяет назначать обработчики выхода из программы. Зарегистрированные с помощью нее обработчики будут вызваны при нормальном завершении программы, а также в некоторых случаях прерывания ее работы. Это позволяет провести некоторые операции, например, сохранение данных программы, при ее завершении.<div>Функция atexit определена в стандартом заголовочном файле stdlib.h. Функция выглядит следующим образом:<div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color:#aa0d91;"><span class="Apple-style-span" style="font-size:large;">int</span></span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size:large;"> </span></span><span class="Apple-style-span" style="font-size:large;"> atexit(</span><span style="color:#aa0d91;"><span class="Apple-style-span" style="font-size:large;">void</span></span><span class="Apple-style-span" style="font-size:large;"> (*)(</span><span style="color:#aa0d91;"><span class="Apple-style-span" style="font-size:large;">void</span></span><span class="Apple-style-span" style="font-size:large;">)).</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-family:georgia;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-family:georgia;"><span class="Apple-style-span" style="font-size: medium;">Таким образом, функция, которая может использоваться в качестве обработчика выхода из программы, не должна возвращать результатов и, кроме того, она не имеет параметров.</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style=" ;font-family:georgia;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style=" ;font-family:georgia;"><span class="Apple-style-span" style="font-size: medium;">Пример использования:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;">#include<stdio.h></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-family: georgia; font-size: 16px;">#include <stdlib.h></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style=" ;font-family:georgia;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style=" ;font-family:georgia;font-size:16px;"></span></p><span class="Apple-style-span" style=" ;font-family:georgia;font-size:16px;"><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">void</span></span><span class="Apple-style-span" style="font-size: medium;"> exit1(){</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c41a16"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">printf</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">"At function exit1\n"</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;">}</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"><span class="Apple-style-span" style="font-size: medium;"><br /></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">void</span></span><span class="Apple-style-span" style="font-size: medium;"> exit2(){</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c41a16"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">printf</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">"At function exit2\n"</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;">}</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"><span class="Apple-style-span" style="font-size: medium;"><br /></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">void</span></span><span class="Apple-style-span" style="font-size: medium;"> exit3(){</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c41a16"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">printf</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">"At function exit3\n"</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;">}</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"><span class="Apple-style-span" style="font-size: medium;"><br /></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">void</span></span><span class="Apple-style-span" style="font-size: medium;"> exit4(){</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c41a16"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">printf</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">"At function exit4\n"</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;">}</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"><span class="Apple-style-span" style="font-size: medium;"><br /></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">int</span></span><span class="Apple-style-span" style="font-size: medium;"> main (</span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">int</span></span><span class="Apple-style-span" style="font-size: medium;"> argc, </span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">const</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">char</span></span><span class="Apple-style-span" style="font-size: medium;"> * argv[]) {</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #007400"><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span class="Apple-style-span" style="font-size: medium;">// insert code here...</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c41a16"><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">printf</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">"Hello, World!\n"</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">atexit</span></span><span class="Apple-style-span" style="font-size: medium;">(exit1);</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">atexit</span></span><span class="Apple-style-span" style="font-size: medium;">(exit2);</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">atexit</span></span><span class="Apple-style-span" style="font-size: medium;">(exit3);</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #2e0d6e"><span class="Apple-style-span" style="font-size: medium;">atexit</span></span><span class="Apple-style-span" style="font-size: medium;">(exit4);</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">int</span></span><span class="Apple-style-span" style="font-size: medium;"> i=</span><span style="color: #1c00cf"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;">;</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">for</span></span><span class="Apple-style-span" style="font-size: medium;">(i=</span><span style="color: #1c00cf"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;">;i<</span><span style="color: #1c00cf"><span class="Apple-style-span" style="font-size: medium;">100</span></span><span class="Apple-style-span" style="font-size: medium;">;++i)</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #2e0d6e"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-size: medium;"> </span></span></span><span class="Apple-style-span" style="font-size: medium;">printf</span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color: #c41a16"><span class="Apple-style-span" style="font-size: medium;">"."</span></span><span style="color: #000000"><span class="Apple-style-span" style="font-size: medium;">);</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color: #aa0d91"><span class="Apple-style-span" style="font-size: medium;">return</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color: #1c00cf"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;">;</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"><span class="Apple-style-span" style="font-size: medium;">}</span></p><div><span class="Apple-style-span" style="font-size: medium;">В результате получается следующее:</span></div><div><span class="Apple-style-span" style="font-size: 16px;"><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 'Trebuchet MS'; font-size: 13px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); ">[Session started at 2008-11-03 22:45:28 +0300.]</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>Hello, World!</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 13px; "></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>....................................................................................................At function exit4</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit3</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit2</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><b>At function exit1</b></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;"><br /></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Courier; color: rgb(51, 51, 51); "><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: georgia;">Можно зарегистрировать до 32 обработчиков. При этом они будут вызываться в обратном порядке, т.е. последний зарегистрированный обработчик будет вызываться первым.</span></span></p></span><p></p></span></div></span><p></p></div></div>albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0tag:blogger.com,1999:blog-5374517018413942275.post-21717397399367694632008-11-03T11:31:00.000-08:002008-11-03T11:32:32.546-08:00О блоге...Данный блог посвящен программированию на языке С. В нем я буду приводить примеры использования стандартного С (с99), а также рассматривать некоторые интересные моменты...albovahttp://www.blogger.com/profile/15042101119226956105noreply@blogger.com0