<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3132276620877189877</id><updated>2024-10-25T03:04:35.951-07:00</updated><category term="работа"/><category term="C"/><category term="мысли"/><category term="Си"/><category term="уроки"/><category term="js"/><category term="код"/><category term="Perl"/><category term="косяк"/><category term="PHP"/><category term="SQL"/><category term="nodejs"/><category term="БД"/><category term="жизнь"/><category term="ошибки"/><category term="DB2"/><category term="chendex"/><category term="gcc"/><category term="odesk"/><category term="yandex"/><category term="блоги"/><category term="жара"/><category term="железяки"/><category term="кал"/><category term="утилита"/><category term="фильм"/><category term="фриланс"/><category term="хочу денег"/><category term="хрен"/><title type='text'>Записки студента</title><subtitle type='html'>Блог про жизнь &lt;strike&gt;студента&lt;/strike&gt; бывшего студента</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default?start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-4316870784999654723</id><published>2018-01-10T06:26:00.000-08:00</published><updated>2018-01-10T06:26:16.376-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="код"/><category scheme="http://www.blogger.com/atom/ns#" term="ошибки"/><title type='text'>Обновление с nodejs</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Работаю с nodejs и ее&amp;nbsp;require(&quot;vm&quot;).&lt;br /&gt;
Ничего не трогаю, все работает уже несколько лет. И заметил странность - при создании функции с именем уже существующей, старая функция не перезаписывается, а остается, т.е. новая не вызовется.&lt;br /&gt;
т.е. в песочнице&lt;br /&gt;
function aa() {console.log(&quot;aa!&quot;);}&lt;br /&gt;
...&lt;br /&gt;
function aa() {console.log(&quot;bb!&quot;);}&lt;br /&gt;
&lt;br /&gt;
при вызове aa - будет aa!&lt;br /&gt;
&lt;br /&gt;
Решение - обновился до текущей версии 8 - проблема исчезла. Иногда обновления полезны&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/4316870784999654723/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2018/01/nodejs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/4316870784999654723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/4316870784999654723'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2018/01/nodejs.html' title='Обновление с nodejs'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-324553601047303569</id><published>2017-03-31T06:39:00.000-07:00</published><updated>2017-03-31T06:47:18.439-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="js"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="ошибки"/><title type='text'>{ [Error: socket hang up] code: &#39;ECONNRESET&#39; }</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Итак вы используйте nodejs (в качестве клиента -http.request) и получаете эту ошибку - отчего?&lt;br /&gt;
&lt;br /&gt;
Для начала нужно вспомнить что такое этот самый продвинутая и современная платформа nodejs.&lt;br /&gt;
&lt;br /&gt;
nodejs - это современная, продвинутая, &lt;b&gt;асинхронная&lt;/b&gt; платформа.&lt;br /&gt;
&lt;br /&gt;
Асинхронная - не равно многопоточной. В асинхронной системные действия делаются многопоточно, а затем пользовательские (серверные) действия выполняются последовательно из стека задач.&lt;br /&gt;
&lt;br /&gt;
Т.е. когда выполняется один JS-код на сервере, другой код ждет (и нервно курит). Идеально - что время выполнения кода = 0мс.&lt;br /&gt;
&lt;br /&gt;
Но время выполнения кода (а особенно кода JS - это я вам как разработчик на C/C* говорю) - очень отлично от 0мс.&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим ваш неудачный код на nodejs, в котором вы используйте http request для получения данных с сайта, а потом их обрабатываете и получаете иногда (постоянно) ошибку &quot;socket hand up&quot;.&lt;br /&gt;
&lt;br /&gt;
Дело в том, что это означает что код вашей обработки запроса превышает таймаут сервера, с которого вы получаете свои данные. Клиент (т.е. вы) не читаете и не закрываете сокет(Socket) (потому что вы ждете это сделать асинхронно в потоке стека задач). И отрубает вас. Об этом, вы кстати, узнаете после того как выполните текущий код.&lt;br /&gt;
&lt;br /&gt;
Решение?&lt;br /&gt;
1. Ускорить выполнение кода :)&lt;br /&gt;
2. Распаралелить задачу запросов и обработки - через отдельные триды/процессы&lt;br /&gt;
3. Использовать другие технологии&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/324553601047303569/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2017/03/error-socket-hang-up-code-econnreset.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/324553601047303569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/324553601047303569'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2017/03/error-socket-hang-up-code-econnreset.html' title='{ [Error: socket hang up] code: &#39;ECONNRESET&#39; }'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-3105282039770581462</id><published>2016-02-08T11:57:00.001-08:00</published><updated>2016-02-08T12:01:56.330-08:00</updated><title type='text'>Дорогая математика на дешевых хостингах</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Сижу, я давеча, думаю о своем, и тут на почту - шмяк письмо, мол &lt;b&gt;Превышение лимита на использование CPU&lt;/b&gt;. Хостинг от REG-ru порадовал - причем сайтик на нем крохотный, с небольшой посещалкой.&lt;br /&gt;
&lt;br /&gt;
Смотрю предложенные варианты - и вижу было в среднем 1-2% CPU в день, сейчас уже 10-14 и среднее за неделю упорно движется к порогу 7%.&lt;br /&gt;
&lt;br /&gt;
Причем самое интересно посещаемость - вообще не изменилась за неделю. Ничего нового. Даже вирусов. Секция самые долгие запросы - у них вообще бред, показывают что самый долгий запрос - это скачивания файла - причем тут CPU?&lt;br /&gt;
&lt;br /&gt;
Короче день ломал голову, почистил таблицы, даже индекс новый прибабахал для одной - но, тщетно - на следующий день опять письмо - превышение лимита. Цифры только больше.&lt;br /&gt;
&lt;br /&gt;
И тут как осенило, я ж скрипт поправил - там нужно было действие одно делать - а регулярку влом было писать и сделал супер-пупер скриптом, типа:&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;for($x=0;$x &amp;lt; 1000; x++ )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;for($y=0;$y &amp;lt; 1000; y++ )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
И эта конструкция, которая на тьфу решалась даже на этом сервере - оказывается сильно грела процессор. Такая вот фигня&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/3105282039770581462/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2016/02/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/3105282039770581462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/3105282039770581462'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2016/02/blog-post.html' title='Дорогая математика на дешевых хостингах'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-4560633947281962584</id><published>2015-05-06T10:40:00.003-07:00</published><updated>2015-05-06T10:41:00.266-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><title type='text'>OpenSSL SSL_connect returned 0</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Произошла неприятная вещь, старый класс который доставлял информацию по HTTP(S) каналу отказался работать с некоторыми сайтами.&lt;br /&gt;
&lt;br /&gt;
При изучении оказалось, что&amp;nbsp;&lt;i&gt;SSL_connect &lt;/i&gt;возвращает 0, спецификация говорит мол все плохо, но не совсем смотрите getError и будет вам....&lt;br /&gt;
&lt;br /&gt;
Но SSL_ERROR офигительно познавательная ошибка.&lt;br /&gt;
&lt;br /&gt;
После долгих и долгих копаний в инете и шаманских танцев, что эти сайты хотят SNI.&lt;br /&gt;
А чтобы его реализовать нужно сделать&amp;nbsp;&lt;i&gt;SSL_set_tlsext_host_name&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Проблема была в том, что в ssl.h, ни в tls.h не было такой функции. Обновил openSSL. функции появилось, но все равно не заработало.&lt;br /&gt;
&lt;br /&gt;
Поменял &amp;nbsp; &lt;i&gt;ctx = SSL_CTX_new(TLSv1_2_client_method())&lt;/i&gt; - заработало.&lt;br /&gt;
&lt;br /&gt;
Отдельный привет, openSSL - на странице доступной по запросу openssl windows, версия 1.01 говорит, что там библиотеки и для Cbuilder в том числе (ну есть один проект где используется билдер). Библиотек конечно-же нет. Но напомню&amp;nbsp;&lt;i&gt;implib -a ssleay32.lib ssleay32.dll&lt;/i&gt; &amp;nbsp;творит чудеса.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/4560633947281962584/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2015/05/openssl-sslconnect-returned-0.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/4560633947281962584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/4560633947281962584'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2015/05/openssl-sslconnect-returned-0.html' title='OpenSSL SSL_connect returned 0'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-5646731766218520776</id><published>2015-01-18T09:12:00.002-08:00</published><updated>2015-01-18T09:12:59.454-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="odesk"/><category scheme="http://www.blogger.com/atom/ns#" term="фриланс"/><title type='text'>Фриланс</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Вообще мне пока хватает моей зарплаты (тем более она не стоит на месте), однако еще почти сразу при &amp;nbsp;устройстве на работу я попробовал себя в фрилансе. Для перестраховки.&lt;br /&gt;
Пару раз выполнял довольно крупные проекты, это было на русском сайте фриланс.ру.&lt;br /&gt;
&lt;br /&gt;
Потом было много работы и не до этого. После печальной эпопеи с рублей решил посмотреть в ту степь. Русские сайты фриралнса теперь предлагают купить про-режимы, про-статусы и короче любую хрень, чтобы навариться на вас. Работы нет. Только для &quot;про&quot;.&lt;br /&gt;
&lt;br /&gt;
Решил зарегистрироваться на &amp;nbsp;odesk&#39;е. В конце декабря, сайт постоянно колбасило и не мог заполнить профиль - постоянно ошибка. Написал тикет - сказали есть проблема. В январе (числа 12, эх) все же удалось.&lt;br /&gt;
&lt;br /&gt;
Заполнил профиль, прошел первый тест (другие не давались выдавало 500 ошибку), отправил на Review свой профиль. И не прошел. Причем лично знаю, что там работают люди которые в программирование хуже меня на очень много. Собственно я с ними работаю на основной работе и по их рекомендации узнал о odesk&#39;е. Вот так.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/5646731766218520776/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2015/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5646731766218520776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5646731766218520776'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2015/01/blog-post.html' title='Фриланс'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-1652162640620792790</id><published>2013-11-13T06:56:00.001-08:00</published><updated>2013-11-13T06:56:32.337-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="железяки"/><category scheme="http://www.blogger.com/atom/ns#" term="мысли"/><title type='text'>Выбираю себе домашний комп</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Первый комп мой был персоналкой, P-90 по-моему.&lt;br /&gt;
Его я постепенно апгрейдил до второго пня, поменяв все, кроме HDD, (просто докупал более объемный и увеличивал их количество).&lt;br /&gt;
&lt;br /&gt;
Затем пришлось жить отдельно от родителей, и я купил себе первый ноут - его можно было таскать из комнаты в комнату. Потом появился ADSL инет и ноут припарковался на рабочий стоол. К нему был докуплена полноценная клавиатура, и само-собой мышка (ненавижу тачболы).&lt;br /&gt;
Затем появился монитор :) Чтобы экран был больше, а не жалкие 15&quot;.&lt;br /&gt;
&lt;br /&gt;
Короче через некоторое время купил себе полноценный комп, ноут ушел на пенсию. Комп был из бывших серверов, и хотя через некоторое время стал &quot;притормаживать&quot; (появились 5-герои), все равно ничего уже не апгредил. Было лень, а потом момент упущен - для полноценного апгрейда нужно было менять все кроме корпуса и БП.&lt;br /&gt;
&lt;br /&gt;
Думал на что поменять - на персоналку (что дешевле) или ноутбук (что дороже), потому что экран хочу большой. И тут я обратил внимание на моноблоки. Если не брать продукцию от яблока, то дешевле чем ноут получаешь большую производительность и большОй экран.&lt;br /&gt;
Плюс беспроводная мышь и клавиатура, давно беспроводной инет - к монитору (по-сути) уже один провод - питалово.&lt;br /&gt;
&lt;br /&gt;
Ну и домохозяйки, окажутся правы, которые показывали на монитор и говорили &quot;компьютер, процессор и т.п.&quot;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/1652162640620792790/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2013/11/monoblock.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1652162640620792790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1652162640620792790'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2013/11/monoblock.html' title='Выбираю себе домашний комп'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-2640666544444580243</id><published>2013-06-03T09:34:00.000-07:00</published><updated>2013-06-03T09:34:05.610-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="gcc"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><category scheme="http://www.blogger.com/atom/ns#" term="код"/><title type='text'>Оптимизация кода - ускорение приложения</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Ранее (вернее до вчерашнего дня) я под ускорением приложения подразумевал оптимизацию кода.&lt;br /&gt;
Например заместо &lt;em&gt;for(int i=0;i&lt;strlen em=&quot;&quot; i=&quot;&quot; if=&quot;&quot; s=&quot;&quot;&gt; писал &lt;em&gt;for(int i=0;s[i];i++)&lt;/em&gt; ...&lt;/strlen&gt;&lt;/em&gt;&lt;br /&gt;
Ну и так далее, оптимизировал циклы и прочее, часто использовал указатели на char *, нежели пользовался стандартными функциями str.&lt;br /&gt;
Но все изменилось вчера, собрал небольшой, но вычислительный код на машинке под Lin64.&lt;br /&gt;
Компилил само-собой g++, и скорость на только что свежой тачке с толи с 4, толи 8 ядерным процессором показала практически туже что и на моем рабочем компьютере - винXP32, трехлетней выдержки.&lt;br /&gt;
&lt;br /&gt;
Что за нах? Подумал и поискал в инете, нашел кучу ключей и собрал уже с ключами &lt;em&gt;-m64 -Ofast -flto -march=native -funroll-loops&lt;/em&gt;, разница была в десять(10) раз!!!&lt;br /&gt;
&lt;br /&gt;
Вот такая хреновина...&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/2640666544444580243/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2013/06/blog-post.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2640666544444580243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2640666544444580243'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2013/06/blog-post.html' title='Оптимизация кода - ускорение приложения'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-5683378334851590959</id><published>2012-12-13T10:54:00.000-08:00</published><updated>2012-12-13T10:54:57.214-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="DB2"/><category scheme="http://www.blogger.com/atom/ns#" term="БД"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><title type='text'>Многострочный INSERT в VARCHAR поле</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Сегодня портировали базу в IBM DB2, встряли на &lt;b&gt;insert&lt;/b&gt;&#39;ах в текстовые поля: &lt;b&gt;varchar&lt;/b&gt;&#39;ы и &lt;b&gt;blob&lt;/b&gt;&#39;ы, решение простое - нужно квотировать символы #10 и #13 как &lt;code style=&#39;background:#eeeeee&#39;&gt;&#39;||chr(10)||&#39;&lt;/code&gt; и chr(13) соотвественно, чтобы весь insert был в одну строку. Без единого разрыва, как говорится
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/5683378334851590959/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/12/insert-varchar.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5683378334851590959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5683378334851590959'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/12/insert-varchar.html' title='Многострочный INSERT в VARCHAR поле'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-5057504927678001071</id><published>2012-10-05T07:51:00.001-07:00</published><updated>2012-10-05T07:51:35.753-07:00</updated><title type='text'>вперёд</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Создаем новый проект, сделано 99%, до окончательного пуска осталось от пары недель до бесконечности, это для тех кто понимает.&lt;br /&gt;
&lt;br /&gt;
Надеюсь все срастется, проект реально неплох.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/5057504927678001071/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/10/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5057504927678001071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/5057504927678001071'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/10/blog-post.html' title='вперёд'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-7093537256050280279</id><published>2012-09-10T06:38:00.000-07:00</published><updated>2012-09-10T06:41:14.223-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Как сортировкать массивы в PHP по нескольким полям</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Задался тут вопросом как сортировать в &lt;b&gt;PHP&lt;/b&gt; массивы по нескольким ключам, поискал (не сильно долго в инете) ничего не нашел, а потому придумал свой вариант.&lt;br /&gt;
&lt;br /&gt;
Все очень просто, и делается за три прохода:&lt;br /&gt;
1. Пробегаете ваш массив и одновременно создаете новый (&lt;b&gt;tmp&lt;/b&gt;), где ключ - ключ в исходном массиве, а значение склейка ключей. Например для строковых $a.&#39;-&#39;.$b.&#39;-&#39;.$c, а для числовых можно воспользоваться умножением.&lt;br /&gt;
2. Сортируете полученный массив sort или rsort&lt;br /&gt;
3. Создаете новый массив пробегая по отсортированному &lt;b&gt;tmp&lt;/b&gt;, создавая массив по заданному значению из tmp и значению из исходного массива.&lt;br /&gt;
&lt;br /&gt;
Это возможно лишь потому, что PHP при создании нового элемента массива элемент точно добавляется в конец, в Perl это бы не прокатило. Там он бы попал по хешу для сортировки. Да и сортировать в Perl&#39;е гораздо легче, следует лишь указать любую пользовательскую функцию перед sort. Да и Perl круче PHP, но пост совсем не про это....&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/7093537256050280279/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/09/php.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/7093537256050280279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/7093537256050280279'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/09/php.html' title='Как сортировкать массивы в PHP по нескольким полям'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-8529871115188279554</id><published>2012-09-07T10:42:00.001-07:00</published><updated>2012-09-07T10:42:31.849-07:00</updated><title type='text'>Firebird &amp; x64 &amp; Linux</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;А вернее Suse, значит на сервер наш администратор поставил deleveper пакеты Firebird и мы там ж, стали компилить наш проект.
Он скомпилилися (ну вернее скомпилился после указания пару флагов компилятору про точность - но это gcc и сам отлично показывал).&lt;/div&gt;&lt;br&gt;

&lt;div&gt;Но затем при некой выборке из БД, выдавал какую-то ересь, причем полезли в дебри заголовочных файлов &lt;strong&gt;isbase.h&lt;/strong&gt; нашли там &lt;strong&gt;ISC_INT64&lt;/strong&gt;.&lt;/div&gt;&lt;br&gt;

&lt;div&gt;Для спецов скажу - там не учитывается x64 режим, нужно ставить еще define на просто int.&lt;/div&gt;&lt;br&gt;

&lt;div&gt;Для &lt;b&gt;не&lt;/b&gt; спецов скажу - это пиздец товарищи когда ставишь delevoper пакет ожидаешь что он не будет содержать ошибки.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/8529871115188279554/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/09/firebird-x64-linux.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8529871115188279554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8529871115188279554'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/09/firebird-x64-linux.html' title='Firebird &amp; x64 &amp; Linux'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-1989722751619608566</id><published>2012-08-07T12:15:00.001-07:00</published><updated>2012-08-07T12:15:17.178-07:00</updated><title type='text'></title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Случайно переключился с &lt;em&gt;cp1251&lt;/em&gt; на &lt;em&gt;cp866&lt;/em&gt; набрав слово &quot;&lt;strong&gt;его&lt;/strong&gt;&quot;.&lt;br /&gt;
Задумался над смыслом кодировки....&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/1989722751619608566/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/08/cp1251-cp866.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1989722751619608566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1989722751619608566'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/08/cp1251-cp866.html' title=''/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-2072791245690269074</id><published>2012-02-02T13:02:00.000-08:00</published><updated>2012-02-02T13:02:00.413-08:00</updated><title type='text'>Нашел на баш.орг.ру :)</title><content type='html'>&lt;quote&gt;&lt;br /&gt;&lt; emilevictor&gt; .... почему? я не понимаю. если я делаю указатель x и присваиваю ему 0, то почему *x - не 0?&lt;br /&gt;&lt; ciaranm&gt; emilevictor: указатель указывает на адрес, в данном случае 0x0. а *x - это данные по этому адресу, скорее всего равные &quot;segmentation fault&quot;&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;:)</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/2072791245690269074/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2072791245690269074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2072791245690269074'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/02/blog-post.html' title='Нашел на баш.орг.ру :)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-2543126329500113196</id><published>2012-01-30T05:06:00.001-08:00</published><updated>2012-03-22T12:27:26.043-07:00</updated><title type='text'>между делом</title><content type='html'>Помогал инет-знакомому сделать кой-какой модуль на Flash (давно уже, где-то год назад), тот наконец-то проект запустил &lt;a href=&quot;http://prapra.ru/&quot;&gt;генеалогическое древо семьи своими руками&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Знайте - там есть частичка меня :)</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/2543126329500113196/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2543126329500113196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/2543126329500113196'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/01/blog-post.html' title='между делом'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-8062583831734397671</id><published>2012-01-23T06:57:00.000-08:00</published><updated>2012-01-23T07:07:48.607-08:00</updated><title type='text'>Центрирование при зуме(zoom) или зачем нужна математика</title><content type='html'>На новом проекте делали масштабирование и нужно было сделать что при изменение масштаба центр эээ &lt;strike&gt;вселенной&lt;/strike&gt; картинки оставался на месте (т.е. в центре).&lt;br /&gt;&lt;br /&gt;Реализовывал все это наш новенький программист. Он из тех, кто считает, что вузы нафик не нужны (кстати недавно узнал, что вуз теперь не аббревиатура, а потому пишется не заглавными), так вот он долго втыкал в функцию центровки объекта по средине экрана.&lt;br /&gt;Скажем: &lt;code&gt;off1 = x*sw*kof - scrX/2&lt;/code&gt;, затем думал.&lt;br /&gt;Думал от прошлой среды то понедельника, вернее говорит еще все выходные думал и выдал на формулу:&lt;br /&gt;&lt;code&gt;off1 = (sw*kof1*off2+sw*kof1*scrX/2 - (scrX/2)*sw*kof2)/(sw*kof2)&lt;/code&gt;&lt;br /&gt;На мой вопрос, а можно ли ее сократить - ответил, что нет.&lt;br /&gt;&lt;br /&gt;Новая формула для &lt;em&gt;центрирования при изменения масштаба&lt;/em&gt; сейчас такая: &lt;code&gt;offX = (newkof*offX + (newkof-oldkof)*screenX/2)/oldkof;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Да-да, простое математическое деление. С другой стороны, зачем вузы если и в школе было не все понятно?</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/8062583831734397671/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2012/01/zoom.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8062583831734397671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8062583831734397671'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2012/01/zoom.html' title='Центрирование при зуме(zoom) или зачем нужна математика'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-8152081908636681840</id><published>2011-11-02T12:33:00.000-07:00</published><updated>2011-11-02T12:34:58.954-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Perl"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Незнал</title><content type='html'>У Perl:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;my @arr;&lt;br /&gt;push @arr,&#39;element&#39;;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В PHP:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$arr = array();&lt;br /&gt;$arr[] = &#39;element&#39;;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Вот такой &lt;strong&gt;push&lt;/strong&gt; в &lt;strong&gt;PHP&lt;/strong&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/8152081908636681840/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8152081908636681840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8152081908636681840'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/11/blog-post.html' title='Незнал'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-3815417751230899402</id><published>2011-10-14T06:42:00.000-07:00</published><updated>2011-10-14T06:44:44.183-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Perl"/><title type='text'>Почему и нет?</title><content type='html'>Вот удивляюсь почему в &lt;strong&gt;Perl&lt;/strong&gt; нет унарных правых циклов?&lt;br /&gt;&lt;br /&gt;Ну как бы красиво смотрелось print(&quot;Daesh molodeshz!&quot;) for($i=0;$i&lt;10;$i++);&lt;br /&gt;&lt;br /&gt;Почему унарные условия есть, а циклы (те-же яйца только в профиль) нету?&lt;br /&gt;&lt;br /&gt;Чтож за убожество писать for($i=0;$i&lt;10;$i++) {print(&quot;Daesh molodeshz!&quot;)}</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/3815417751230899402/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/3815417751230899402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/3815417751230899402'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/10/blog-post.html' title='Почему и нет?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-8951047539578111916</id><published>2011-05-11T11:06:00.000-07:00</published><updated>2011-05-13T11:05:20.948-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="хочу денег"/><title type='text'>Алкоголь - это зло</title><content type='html'>И точка.&lt;br /&gt;&lt;br /&gt;И такое чувство что я это уже писал...</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/8951047539578111916/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/05/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8951047539578111916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/8951047539578111916'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/05/blog-post.html' title='Алкоголь - это зло'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-6705861005108660684</id><published>2011-04-08T09:17:00.000-07:00</published><updated>2011-04-08T09:18:20.060-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>PHP – гавно</title><content type='html'>В конце зимы, наша фирма взяла новый проект, который нужно было срочно сделать до конца марта, и который , билиать, должен быть сделан на PHP, потому что, гребанные программисты из &lt;strike&gt;депо&lt;/strike&gt; из контры не разберутся.&lt;br /&gt;&lt;br /&gt;Ну что же – партия сказала надо – комсомол ответил есть. Начали писать, да мне вообще побоку на каком &lt;em&gt;скриптовом&lt;/em&gt; языке писать, пусть сегодня на PHP.&lt;br /&gt;&lt;br /&gt;Куча кода (действительно несколько сотен килобайт) – база (билиать вы не поверите – mysql), однако к сегодняшнему дню все работает, даже база (что стоит сказать мускул не так уж плох, как я раньше думал – почти миллион записей – работает, ежели конечно от туда чего нить не удалить – тогда жопа).&lt;br /&gt;&lt;br /&gt;Но язык – ужас, одним словом – выкидыш от C и Perl. Но простой и легкий. Как ежик – как и все PHP-программисты.</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/6705861005108660684/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/04/php.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/6705861005108660684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/6705861005108660684'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/04/php.html' title='PHP – гавно'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-930321541832500651</id><published>2011-02-11T11:33:00.000-08:00</published><updated>2011-02-11T11:46:58.908-08:00</updated><title type='text'>Жизнь и Хмель</title><content type='html'>Довольное время я приходя с работы, покупал &lt;strike&gt;пару&lt;/strike&gt; не пару пива, и начинал кодить. &lt;br /&gt;&lt;br /&gt;Скажу сразу пишу код я одинаково быстро, единственно что иногда не попадаю сразу на нужные клавиши. Так вот, прошло уже больше года как я работаю в фирме и начал замечать, что когда выпью (как сегодня - скажем по пятницам), то чаще хочу быстро доделать рутину, нежели придумывать нечто новое.&lt;br /&gt;&lt;br /&gt;Это я осознал еще в вторник, и подумал, что не буду пить всю неделю. В четверг вечером, я закончил нехилый кусок, который рассчитывал доделать в середине марта.&lt;br /&gt;&lt;br /&gt;Сегодня, у девочки из бухгалтерии было день рождения, и потому выпили. Чуть-чуть, за здоровье, ножки и прочие части именинницы.&lt;br /&gt;&lt;br /&gt;Думал сегодня чего-нить дописать, и понял максимум - что смогу - это эту запись в блог.&lt;br /&gt;Зато Мариночка так страстно поцеловала на прощание ;)</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/930321541832500651/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/930321541832500651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/930321541832500651'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/02/blog-post.html' title='Жизнь и Хмель'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-285442109127712655</id><published>2011-01-25T08:21:00.000-08:00</published><updated>2011-01-25T08:23:35.291-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><category scheme="http://www.blogger.com/atom/ns#" term="уроки"/><title type='text'>Строки и функции с ними</title><content type='html'>Как мы уже поняли из &lt;a href=&quot;http://prog-student.blogspot.com/p/cc-language.html&quot;&gt;предыдущих&lt;/a&gt; уроков, строки это всего лишь набор байтов, а точнее массив типа &lt;em&gt;char&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Сегодня рассмотрим функции, которые можно использовать на &lt;strike&gt;кошках&lt;/strike&gt; строках.&lt;br /&gt;&lt;br /&gt;Отмечу, что легко написать свои аналогичные функции и они будут выполняться также быстро, как и библиотечные (в этом и прелесть Си), но с другой стороны &lt;em&gt;на какой изобретать велосипед?&lt;/em&gt;&lt;br /&gt;Начнем-с.&lt;br /&gt;&lt;br /&gt;Длина строки &lt;strong&gt;strlen&lt;/strong&gt; - возвращает количество символов до символа \0. При передаче мусора – программа может выпасть или зависнуть, если будет искать этот самый символ бесконечно.&lt;br /&gt;Возвращает – без знаковое целое число (&lt;em&gt;unsigned int&lt;/em&gt;), что в принципе логично – длина строки явно положительная величина.&lt;br /&gt;&lt;br /&gt;Копировать строку в строку &lt;strong&gt;strcpy&lt;/strong&gt;. Копирует в заданную строку, другую без ограничения размера первой строки, пока у второй строки не попадется символ \0, символ \0 также копируется. Синтаксис &lt;em&gt;strcpy(v, ”Hello”);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Для копирования определенного количества символов нужно использовать &lt;strong&gt;strncpy&lt;/strong&gt;, где указывается количество копируемых символов, также не контролируется размер исходной строки, синтаксис &lt;em&gt;strncpy(v, ”Hello”, 4)&lt;/em&gt;, но в этом случае символ \0 не добавляется в конец исходной строки (иными словами strncpy это алиас memcpy и не более того)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Поиск заданного символа в строке &lt;strong&gt;strchr&lt;/strong&gt; - возвращает указатель на символ, либо NULL, если символа увы нет. Синтаксис - &lt;em&gt; v=strchr(str,&#39;a&#39;)&lt;/em&gt;, где &lt;em&gt;v&lt;/em&gt;, указатель на char (&lt;em&gt;char *&lt;/em&gt;).&lt;br /&gt;&lt;br /&gt;Поиск заданной подстроки в строке &lt;strong&gt;strstr&lt;/strong&gt; - возвращает указатель на первый символ в строке в случае успеха, а в случае неудачи возвращает… NULL!&lt;br /&gt;Синтаксис: &lt;em&gt;v = strstr(str, &quot;Hello&quot;);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Сравнение строк &lt;strong&gt;strcmp&lt;/strong&gt; - возвращает 0 в случае полного сравнения, 1 если первая строка больше, -1 если меньше. Больше и меньше – это конечно по ASCII-коду символа, который не совпал. Удобно для сортировки. &lt;br /&gt;У функции есть более прогрессивный потомок &lt;strong&gt;strncmp&lt;/strong&gt;, который также сравнивает строки, но  только до определенной позиции(длины).&lt;br /&gt;Синтаксис: &lt;em&gt;strncmp(str, &quot;hello&quot;, 4)&lt;/em&gt; - т.е. добавилось только количество сравниваемых символов.&lt;br /&gt;&lt;br /&gt;Даже не знаю, что добавить. Хотя, помню когда я пришел в Си из Бейсика мне часто не хватало функции MID, или &lt;strong&gt;substr&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Ответ пришел очевиден – допустим нужно сравнить строку на совпадение трех символов, начиная с второго как &#39;ID:&#39;, а последующие 4 тогда определить как число. Исходная строка: &lt;em&gt;xID:0034User&lt;/em&gt;&lt;br /&gt;В Си &lt;code&gt;if ( (v = strnstr(str+1,’ID:’))) {strncpy(temp,str+4,4);temp[4]=0;id=atoi(temp);}&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/285442109127712655/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2011/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/285442109127712655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/285442109127712655'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2011/01/blog-post.html' title='Строки и функции с ними'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-1452999724681931524</id><published>2010-12-30T12:42:00.000-08:00</published><updated>2010-12-30T12:48:17.846-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><category scheme="http://www.blogger.com/atom/ns#" term="уроки"/><title type='text'>Структуры в C (С, Си)</title><content type='html'>Привет, с вами опять я - &lt;a href=&quot;http://prog-student.blogspot.com/&quot;&gt;кодер&lt;/a&gt; -бывший студент&lt;br /&gt;Иногда есть необходимость сгруппировать некоторые данные, допустим вы делайте программу, которая подбирает лучшую девушку 2011.&lt;br /&gt;&lt;br /&gt;Конечно можно использовать ряд массивов, например &lt;code&gt;char NameGirl[10]={&quot;Sveta&quot;,&quot;Anja&quot;,....};int AgeGirl[10]={21,23,...}&lt;/code&gt; и т.д.&lt;br /&gt;&lt;br /&gt;Но лучше использовать структуры.&lt;br /&gt;Структура &lt;strong&gt;struct&lt;/strong&gt; это объеденение нескольких переменных разных или однотипных в одну пачку.&lt;br /&gt;&lt;br /&gt;Синтаксис&lt;br /&gt;struct &lt;em&gt;уникальное_название_вашей_структуры&lt;/em&gt;&lt;br /&gt;{&lt;br /&gt;&lt;em&gt;переменные, например int age;&lt;/em&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Но я &lt;b&gt;не рекомендую&lt;/b&gt; использовать такой синтаксис, более простой способ это использовать &lt;strong&gt;typedef&lt;/strong&gt;, описание структуры будет в этом случае, таким:&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;&lt;em&gt;переменные, например int age;&lt;/em&gt;&lt;br /&gt;} &lt;em&gt;уникальное_название_tp&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;В чем разница? В объявлении (в функциях и как переменные),&lt;br /&gt;в первом случае вы должны будете писать &lt;code&gt;struct &lt;em&gt;уникальное_название_вашей_структуры&lt;/em&gt; имя_переменной&lt;/code&gt;, &lt;br /&gt;во-втором случае всего &lt;code&gt;уникальное_название_tp имя_переменной;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Допустим:&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;char name[30];&lt;br /&gt;short age;&lt;br /&gt;char virgin;&lt;br /&gt;char like_drink;&lt;br /&gt;char emo;&lt;br /&gt;} TS_Girl;&lt;br /&gt;&lt;br /&gt;В Си, нет булевых типов переменных (они есть только в C++ - &lt;em&gt;bool&lt;/em&gt;), потому используем char, но для кода на самом деле все равно, булевая переменная из C++, занимает в памяти также 1 байт, а не 1 бит - как кажется.&lt;br /&gt;&lt;br /&gt;Теперь TS_Girl - это, что-то типа переменной и можно сделать так:&lt;br /&gt;TS_Girl girl_from_work[10];&lt;br /&gt;Тут мы объявили массив структур, обращение к структуре будет выглядеть так:&lt;br /&gt;&lt;code&gt; if (girl_from_work[0].age &amp;gt; 30) continue;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Обращение к членам структуры - через точку &lt;code&gt;TS_Girl wounder_girl;&lt;br /&gt;if (wounder_girl.emo != 0) printf(&quot;Не повезло!\n&quot;);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В чем прелесть структур - что (кроме группировки) - что данные хранятся в одном месте и последовательно друг-за другом.&lt;br /&gt;Системная функция &lt;strong&gt;sizeof&lt;/strong&gt; вернет размер струтуры, в моем случае sizeof(TS_Girl) вернет 35.&lt;br /&gt;Можно эти данные копировать/записовать как область памяти, например &lt;code&gt;write(file,(char*)&amp;girl_from_work[i],sizeof(TS_Gril));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В некоторых (поздних)версиях С, в структурах появились функции - но это язычество, сын мой, избегай этого! &lt;br /&gt;Есть классы (в C++), а есть структуры и не стоит мешать мух с котлетами.&lt;br /&gt;&lt;br /&gt;&lt;div style=&#39;border: #0000ee solid 2px;&#39;&gt;&lt;a href=&quot;http://feeds.feedburner.com/prog-student&quot;&gt;Подпишись на обновления блога&lt;/a&gt; - будь в курсе&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/1452999724681931524/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2010/12/c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1452999724681931524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/1452999724681931524'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2010/12/c.html' title='Структуры в C (С, Си)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-363747470776414320</id><published>2010-12-20T11:56:00.000-08:00</published><updated>2010-12-20T12:00:25.275-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><category scheme="http://www.blogger.com/atom/ns#" term="уроки"/><title type='text'>Циклы и условия</title><content type='html'>Объединил их в один урок, т.к. на самом деле - это одно и тоже - проверка условия и выполнения оператора или блока операторов.&lt;br /&gt;Разница только в том, один раз выполняется блок/операнд или несколько - по условию.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Условия&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Как и в множества других языках - блок проверки условия называется &lt;strong&gt;if&lt;/strong&gt; - в переводе &lt;em&gt;если&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;После &lt;strong&gt;if&lt;/strong&gt; пишется условие в круглых скобках, а затем один операнд (с замыкающей ;), либо блок (в фигурных скобках).&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;code&gt;if (age &amp;gt; 21) printf(&quot;You may&#39;be buy VODKA\n&quot;);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Комбинирование условий&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;В блоке проверки условий можно проверять не одно, а несколько условий - написано в некоторых учебниках и самоучителей.&lt;br /&gt;&lt;font size=+1 color=#aa1111&gt;Это все вранье и чушь!&lt;/font&gt; - В блоке &lt;strong&gt;if&lt;/strong&gt; проверяется &lt;u&gt;только&lt;/u&gt; одно условие, а операции &amp;&amp; - &lt;strong&gt;и&lt;/strong&gt;, и || - &lt;strong&gt;или&lt;/strong&gt; - это &lt;font size=+1 color=#aa1111&gt;операции&lt;/font&gt; над значениями.&lt;br /&gt;&lt;br /&gt;Допустим &lt;code&gt;if (age &amp;gt; 21 &amp;&amp; sex == SX_MAN)&lt;/code&gt; на самом деле сначала выполняется решение условия в скобках, все операции имеют разный &lt;strong&gt;приоритет&lt;/strong&gt; (из школы вам известно что умножить приоритетнее, чем сложение), а у операций &amp;&amp; и || - самый низкий приоритет.&lt;br /&gt;&lt;br /&gt;Выполняется первая часть (проверка идет справа налево) проверка на пол и ее значение запоминается, затем идет проверка на возраст и ее значение запомниается (обе части получают значение true или false), а далее выполняется третья операция &amp;&amp; (и) - и если обе части true - то и общее значение будет true.&lt;br /&gt;&lt;br /&gt;Если нужно выполнить разные блоки при срабатывание и не срабатывания условия, то используют конструкцию &lt;strong&gt;if&lt;/strong&gt; () {...} &lt;strong&gt;else&lt;/strong&gt; {}&lt;br /&gt;&lt;strong&gt;else&lt;/strong&gt; в переводе &lt;em&gt;иначе&lt;/em&gt;.&lt;br /&gt;Логично - сделай так если условие и иначе если не так.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Циклы&lt;/h3&gt;&lt;br /&gt;При реализации алгоритма цикла можно использовать любой способ т.е. любую запись, и самое главное при любом случае - в машинных кодах получится одно и тоже, но вот для более понятного исходников их делят:&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;strong&gt;for&lt;/strong&gt; - для&lt;/h4&gt;&lt;br /&gt;Цикл &lt;strong&gt;for&lt;/strong&gt; чаще всего используется там, где нужно выполнить заранее известное количество иттераций (циклов).&lt;br /&gt;&lt;br /&gt;Синтаксис&lt;br /&gt;for(&lt;em&gt;условия иницилизации&lt;/em&gt; ; &lt;em&gt;блок проверки&lt;/em&gt; ; &lt;em&gt;блок выполняемый при каждом цикле - блок шага&lt;/em&gt;) {...}&lt;br /&gt;Вместо блока операндов, можно также писать один операнд - если это необходимо.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;code&gt;for(i=0;i&amp;lt;10;i++) printf(&quot;i=%d\n&quot;,i);&lt;/code&gt;&lt;br /&gt;В примере в блоке &lt;em&gt;условия инициализации&lt;/em&gt; - переменной i назначается значение = 0.&lt;br /&gt;В блоке проверки переменная i проверяется, что она (переменная) меньше 10, в блоке шага - переменная i увеличивается на один.&lt;br /&gt;&lt;br /&gt;Блок инициализации выполняется всегда - а блок шага только в том случае, если выполняется условия.&lt;br /&gt;Т.е. выполняется i=0; затем проверяется i&amp;lt;10, далее выполняется блок за &lt;strong&gt;for&lt;/strong&gt; - печатается строка &lt;code&gt;printf(&quot;%d\n&quot;,i)&lt;/code&gt;, затем выполняется блок шага - i++, &lt;br /&gt;затем опять проверяется условие и если оно = &lt;strong&gt;true&lt;/strong&gt; (меньше 10 в нашем случае) - опять выполняется блок за &lt;strong&gt;for&lt;/strong&gt; и блок шага. И до тех пор пока блок условия - будет = true.&lt;br /&gt;&lt;br /&gt;В любом блоке &lt;strong&gt;for&lt;/strong&gt; можно указать несколько действий через запятую, например:&lt;br /&gt;&lt;code&gt;for(i=0,j=0; i&amp;lt;20,j&amp;lt;5; i+=2,j++) printf(&quot;i=%d,j=%d\n&quot;,i,j);&lt;/code&gt;&lt;br /&gt;Т.е. в блоке инициализации выполняем присвоение перменной i и переменной j.&lt;br /&gt;&lt;br /&gt;В блоке проверки условий выполняется два условия что i меньше 20 и j меньше 5 - на самом деле цикл будет только при выполнении всех условий - аналогично сработает (и кстати более лучше для понимания) i&amp;lt;20&amp;&amp;j&amp;lt;5&lt;br /&gt;В блоке шага, выполняется также два операнда, увеличение переменной i на два и i на один.&lt;br /&gt;Результат:&lt;br /&gt;&lt;pre&gt;i=0,j=0&lt;br /&gt;i=2,j=1&lt;br /&gt;i=4,j=2&lt;br /&gt;i=6,j=3&lt;br /&gt;i=8,j=4&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Скажу больше в блоках можно использовать даже функции, например &lt;code&gt;for(i=0,printf(&quot;start&quot;);i&amp;lt;10;i++,printf(&quot;step\n&quot;)) printf(&quot;i=%d\n&quot;,i);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Но кроме использования их в блоках инициализации и проверки - не вижу смысла использовать функции в блоке шага, уж лучше перенести в блок за &lt;strong&gt;for&lt;/strong&gt;, либо использовать....&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;strong&gt;while&lt;/strong&gt; - пока&lt;/h4&gt;&lt;br /&gt;Цикл &lt;strong&gt;while&lt;/strong&gt; - чаще используют если количество иттераций заранее не известно.&lt;br /&gt;&lt;br /&gt;Синтаксис:&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; (&lt;em&gt;условие&lt;/em&gt;) {...}&lt;br /&gt;Блок за &lt;strong&gt;while&lt;/strong&gt; будет выполнятся пока условие = &lt;em&gt;true&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Если условие изначально &lt;em&gt;false&lt;/em&gt; то блок не будет выполнятся вообще, если это необходимо используют более редкую конструкцию &lt;strong&gt;while&lt;/strong&gt; с &lt;strong&gt;do&lt;/strong&gt;&lt;br /&gt;Синтаксис:&lt;br /&gt;&lt;strong&gt;do&lt;/strong&gt; {...} &lt;strong&gt;while&lt;/strong&gt;(&lt;em&gt;условие&lt;/em&gt;);&lt;br /&gt;Блок do-while выполнится один раз как минимум и будет выполнятся пока &lt;em&gt;условие&lt;/em&gt; = &lt;em&gt;true&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для изменения работы циклов (&lt;strong&gt;for&lt;/strong&gt; и &lt;strong&gt;while&lt;/strong&gt;) - есть ключевые слова &lt;strong&gt;break&lt;/strong&gt; и &lt;strong&gt;continue&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;break - сломать&lt;/h4&gt;&lt;br /&gt;Цикл прерывается и выполняется слелующий операнд за циклом&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;continue - продолжить&lt;/h4&gt;&lt;br /&gt;Цикл принудительно переходит на блок проверки условия, однако у &lt;strong&gt;for&lt;/strong&gt; - выполняется блок шага&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Еще про проверки условий&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Еще для более удобного представления множественной проверки условий используют конструкцию &lt;strong&gt;switch&lt;/strong&gt; - переключатель&lt;br /&gt;Синтаксис:&lt;br /&gt;switch(&lt;em&gt;выражение&lt;/em&gt;)&lt;br /&gt;{&lt;br /&gt;case &lt;em&gt;значение1&lt;/em&gt;:&lt;br /&gt; ...&lt;br /&gt; break;&lt;br /&gt;case &lt;em&gt;значение2&lt;/em&gt;:&lt;br /&gt; ...&lt;br /&gt; break;&lt;br /&gt;default:&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;в условиях стоит выражение, значение которого проверяется в каждом case и если оно совпадает с одним из &lt;em&gt;значением&lt;/em&gt; то выполняется операнды под этим &lt;strong&gt;case&lt;/strong&gt;.&lt;br /&gt;Внимание, если не будет стоят &lt;strong&gt;break&lt;/strong&gt; то затем будут выполнятся все другие условия, под другими case, которые описаны дальше.&lt;br /&gt;&lt;br /&gt;Блок &lt;strong&gt;default&lt;/strong&gt; выполняется как глобальный else - если не один case не подошел.&lt;br /&gt;&lt;br /&gt;Иногда специально не ставят &lt;strong&gt;break&lt;/strong&gt; для выполнение какого-то кода.&lt;br /&gt;Вообще &lt;strong&gt;switch&lt;/strong&gt; как и циклы - это все проверки условия (&lt;strong&gt;if&lt;/strong&gt;) и переходы на строку (&lt;strong&gt;goto&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;Однако  использовать &lt;strong&gt;goto&lt;/strong&gt; - некомильфо и презирается гуру.&lt;br /&gt;Однако если у вас вложенный тройной цикл - то плюйте на гуру и пишите &lt;strong&gt;goto&lt;/strong&gt;, между прочим в коде под &lt;strong&gt;Linux&lt;/strong&gt; для обработки изображений jpeg используется &lt;strong&gt;goto&lt;/strong&gt;, так что - вообще нежелательно - но если очень хочется - то можно.&lt;br /&gt;&lt;br /&gt;&lt;div style=&#39;border: #0000ee solid 2px;&#39;&gt;&lt;a href=&quot;http://feeds.feedburner.com/prog-student&quot;&gt;Подпишись на обновления блога&lt;/a&gt; - будь в курсе&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/363747470776414320/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2010/12/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/363747470776414320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/363747470776414320'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2010/12/blog-post_20.html' title='Циклы и условия'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-7649722710558549176</id><published>2010-12-09T06:05:00.000-08:00</published><updated>2010-12-10T04:05:01.681-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chendex"/><category scheme="http://www.blogger.com/atom/ns#" term="утилита"/><title type='text'>Какие страницы не в индексе ПС?</title><content type='html'>Задался тут вопросом и написал небольшую &lt;a href=&quot;http://prog-student.blogspot.com/p/chendx.html&quot;&gt;утилиту для определения страниц не в индексе ПС&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Работаю программистом, а потому отдавать за просто так жаль.&lt;br /&gt;Отдам на тесты первым трем комментаторам к этой записи (укажите на какую почту скинуть ключ) [&lt;font color=red size+1&gt;УЖЕ ЗАВЕРШЕНО&lt;/font&gt;] и тому кто скажет &lt;font color=&quot;#ee1111&quot;&gt;красную цену&lt;/font&gt; и сможет ее  аргументировать.&lt;br /&gt;&lt;br /&gt;Думаю некоторым &lt;a href=&quot;http://topsape.ru&quot;&gt;саперам&lt;/a&gt; будет интересна.&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJPuFaaU3mdi-UNtXqP-i9LIGjlye6oUMHjfIJznAZekPja6EVz50GjgWmJcY86cXQAo7rukigJZS6n4MROzsBaDPzQMd8t9J3FFo4gD-LCRMRgufXRBd0ip7kS5o6wH6NIhyphenhyphenyPpaW6UM/s1600/scr1.jpg&quot;&gt;&lt;img style=&quot;float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 258px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJPuFaaU3mdi-UNtXqP-i9LIGjlye6oUMHjfIJznAZekPja6EVz50GjgWmJcY86cXQAo7rukigJZS6n4MROzsBaDPzQMd8t9J3FFo4gD-LCRMRgufXRBd0ip7kS5o6wH6NIhyphenhyphenyPpaW6UM/s400/scr1.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5548700529765698034&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/7649722710558549176/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2010/12/blog-post.html#comment-form' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/7649722710558549176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/7649722710558549176'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2010/12/blog-post.html' title='Какие страницы не в индексе ПС?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJPuFaaU3mdi-UNtXqP-i9LIGjlye6oUMHjfIJznAZekPja6EVz50GjgWmJcY86cXQAo7rukigJZS6n4MROzsBaDPzQMd8t9J3FFo4gD-LCRMRgufXRBd0ip7kS5o6wH6NIhyphenhyphenyPpaW6UM/s72-c/scr1.jpg" height="72" width="72"/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3132276620877189877.post-933612133433953464</id><published>2010-11-29T07:40:00.000-08:00</published><updated>2010-11-29T07:48:34.186-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="Си"/><category scheme="http://www.blogger.com/atom/ns#" term="уроки"/><title type='text'>Указатели, функции и указатели на функции (С, Си)</title><content type='html'>Итак, в &lt;a href=&quot;http://prog-student.blogspot.com/2010/11/blog-post_22.html&quot;&gt;уроке №2&lt;/a&gt; мы разобрали какие бывают переменные и как они хранят свое содержимое.&lt;br /&gt;&lt;strong&gt;Всё в мире байты&lt;/strong&gt; - это как эпиграф.&lt;br /&gt;&lt;br /&gt;А байты хранятся в памяти, в виде цепочки - друг-за-другом, чтобы узнать где именно - можно получить указатель на адрес переменной.&lt;br /&gt;&lt;blockquote&gt;Вообще разница между адресами и указателями очень тонка, и отличия возникают все же больше в C++, нежели в простом C. Но об этом позже&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;В языке C, получить адрес переменной - знак амперсанда - &lt;a href=&quot;http://prog-student.blogspot.com/&quot;&gt;&amp;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Допустим:&lt;code&gt;int a=5;int *b=&amp;a;&lt;/code&gt;&lt;br /&gt;Переменная b - на самом деле указатель на целочисленный тип (int). Чтобы точнее это понять стоит писать &lt;em&gt;int* b&lt;/em&gt;, но все пишут (и я тоже) как &lt;em&gt;int *b&lt;/em&gt;, потому что в пробелы и их отсутствие - это не суть.&lt;br /&gt;&lt;br /&gt;Так вот, переменная b указывает на адрес памяти переменной a или если кратко - b указатель на a.&lt;br /&gt;Для понимания можно выполнить следующий код &lt;code&gt;*b = 6;&lt;/code&gt;, звездочка перед b означает действие разыменование, и реально &lt;strong&gt;именно переменная a станет равной 6!&lt;/strong&gt;&lt;br /&gt;Если же выполнить конструкцию просто &lt;code&gt;b = 6;&lt;/code&gt; то в результате переменная &lt;strong&gt;b&lt;/strong&gt; будет содержать на область памяти с смещением 6. Само по себе это ничего не даст (и ошибок тоже), но если после этого сделать &lt;strong&gt;*b = 6;&lt;/strong&gt; 99% что ваша программа закроется с ошибкой. Потому что вы меняете значения памяти не глядя, а там может располагаться исполняемые код или другие данные. &lt;br /&gt;&lt;br /&gt;Это тоже одна из плавающих ошибок, которую трудно найти.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Функции&lt;/h3&gt;&lt;br /&gt;Функции это самостоятельный код, который объеденен в группу - функцию.&lt;br /&gt;Функция может принимать любое количество, любых типов переменных и возвращать любой тип переменных. А может и не возвращать - в некоторых языках делят на функции и процедуры - мол процедуры не возвращают ничего, в C - функции могут возвращать тип void - ничего/пусто.&lt;br /&gt;&lt;br /&gt;Синтаксис очень просто перед именем функции пишут тип возвращаемых данных, например int, затем имя функции, а в круглых скобках перечисления через запятую типы аргументов и их имена.&lt;br /&gt;Например &lt;code&gt;int my_func(int a,int b,double num)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Тело функции пишутся после объявления функции в фигурных скобках, например&lt;br /&gt;&lt;code&gt;int my_func(int a,int b,double num)&lt;br /&gt;{&lt;br /&gt;int c = a + b;&lt;br /&gt;c = c + (int)num;&lt;br /&gt;return c;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Ключевое слово &lt;em&gt;return&lt;/em&gt; говорит что в данном месте нужно прекратить выполнение функции и вернуть значение, которое у него указано (в примере - переменная &lt;em&gt;c&lt;/em&gt;).&lt;br /&gt;Если функция типа &lt;em&gt;void&lt;/em&gt; - то можно конструкция упрощается просто &lt;em&gt;return;&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Теперь про большие проекты, функции используются еще для того чтобы разнести код по его смыслу на разные модули.&lt;br /&gt;Чтобы в другом файле(модуле) использовать функцию другого файла(модуля) нужно написать(указать) ее прототип.&lt;br /&gt;&lt;br /&gt;Например в нашем случае &lt;code&gt;int my_func(int a,int b,double num);&lt;/code&gt; - описания прототипа заканчивается точкой запятой, а описание функции - телом функции в фигурных скобках.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;В прототипе функции(описании) можно не указывать названия переменных или (если хочется) писать любые имена - все равно комплиятор их не смотрит&lt;/blockquote&gt;&lt;br /&gt;&lt;code&gt;int my_func(int,int,double);&lt;/code&gt; - это тоже прототип функции.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Забегая вперед скажу, что в C++ можно не указывать имя переменной и в описания функции - это означает, что в данной функции вы не используете эту переменную, а ее синтаксис сохранен для совпадения с чем-то. В этом случае компилятор не выдает предупреждение(warning) &lt;em&gt;Parameter &#39;a&#39; is never used in function&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;Допустим мы в функции &lt;em&gt;my_func&lt;/em&gt; изменем содержание переменной a, например &lt;code&gt;a = 5;&lt;/code&gt;, то в сама переменная указаная в функции при вызове - &lt;strong&gt;не изменится&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;code&gt;int my_func(int a,int b,double num)&lt;br /&gt;{&lt;br /&gt;a = 6;&lt;br /&gt;int c = a + b;&lt;br /&gt;return c + (int)num;&lt;br /&gt;}&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;int i=5,j=6,n;&lt;br /&gt;double k=1;&lt;br /&gt;n=my_func(i,j,k);&lt;br /&gt;printf(&quot;n=%d, i=%d\n&quot;,n,i);&lt;br /&gt;}&lt;/code&gt; Выдаст &lt;em&gt;n=13, i=5&lt;/em&gt;, потому что &lt;strong&gt;в функцию передаются значения переменных, а не их адреса&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Чтобы изменять значения переменной нужно в описании функции указывать не просто переменную, а указатель на нее.&lt;br /&gt;&lt;code&gt;void my_func2(int *a,int b)  &lt;br /&gt;{&lt;br /&gt;*a = b + 5;&lt;br /&gt;}&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;int i=5,j=6;&lt;br /&gt;my_func2(&amp;i,j);&lt;br /&gt;printf(&quot;i=%d\n&quot;,i);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Код вернет &lt;em&gt;i=11&lt;/em&gt;, т.к. в функции мы используем указатель на переменную, и пусть она называется не так как в основной функции (там i, а в myfunc2 - a) - имена не играют никакой роли, все равно в область памяти переменной указанной в качестве первого аргумента, будет записано значение переменной второго аргумента + 5.&lt;br /&gt;&lt;br /&gt;С переменными более, менее ясно - теперь - как передавать массивы, в частности строки?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Допустим мы хотим написать функцию, которая будет определять сколько букв &#39;а&#39;, в заданной фразе.&lt;br /&gt;Нам нужно передать в функцию строку - массив символов, так как это сделать?&lt;br /&gt;Очень просто, в описании функции нужно написать, что ожидается указатель на элемент массива (в нашем случае - символ).&lt;br /&gt;Например: &lt;code&gt;int getSymA(char *src);&lt;/code&gt;&lt;br /&gt;В функции, чтобы получить элемент массива, можно также просто писать str[1] или *(str+1) - это два идентичных кода вернут второй символ в строке.&lt;br /&gt;&lt;br /&gt;В целом наша функция будет выглядеть так:&lt;br /&gt;&lt;code&gt;int getSymA(char *src)&lt;br /&gt;{&lt;br /&gt;int i,n=0;&lt;br /&gt;for(i=0;src[i];i++)&lt;br /&gt;{&lt;br /&gt; if (src[i]==&#39;а&#39;) n++;&lt;br /&gt;}&lt;br /&gt;return n;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;кстати, фигурные скобки после циклов, если код состоит из одной строки можно не указывать, например:&lt;br /&gt;&lt;code&gt;int getSymA(char *src)&lt;br /&gt;{&lt;br /&gt;int i,n=0;&lt;br /&gt;for(i=0;src[i];i++)&lt;br /&gt; if (src[i]==&#39;а&#39;) n++;&lt;br /&gt;return n;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;или вообще не использовать лишние переменные:&lt;br /&gt;&lt;code&gt;int getSymA(char *src)&lt;br /&gt;{&lt;br /&gt;int n=0;&lt;br /&gt;for(;*src;src++)&lt;br /&gt; if (*src==&#39;а&#39;) n++;&lt;br /&gt;return n;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Это как эволюция понимания, потому рассмотрим последний код построчно.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Первая строка - говорим что нужно создать переменную n и инициализировать ее нулем.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Вторая строка - цикл &lt;em&gt;for&lt;/em&gt; - пропускаем блок инициализации (первый после круглой скобки) сразу ставим точку с запятой, второй блок - условия - в нем проверяем является ли указатель на символ 0 - пустым символом, означающим конец строки, третий блок перемещаем указатель в памяти (указатель, а не его значение)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Третья строка - проверяем, а текущий указатель указывает на букву А? Если так увеличиваем счетчик n на один, если нет - то ничего не делаем (нет блока else)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Сделаем вызов, скажем следующего кода:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;char s[10]=&quot;Hello!&quot;;&lt;br /&gt;printf(&quot;%d\n&quot;,getSymA(s));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Первое - при передаче массива, не надо указывать его адрес - нужно указывать саму переменную, т.к. она и есть уже указатель на переменную.&lt;br /&gt;Второе -&lt;br /&gt;АААА! Мы изменяли указатель! Программа сломается и нельзя использовать переменную дальше! - Вовсе нет, мы передали указатель, который может менять значение переменной, но мы его не модифицировали, а просто изменяли его адрес.&lt;br /&gt;Чтобы модифицировать сам указатель нужно использовать указатель на указатель :)&lt;br /&gt;&lt;br /&gt;Код:&lt;br /&gt;&lt;code&gt;void hhh(int **a,int *b)&lt;br /&gt;{&lt;br /&gt;*a = b;&lt;br /&gt;}&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;int i=5,j=6,*n=&amp;i;&lt;br /&gt;hhh(&amp;n,&amp;j);&lt;br /&gt;printf(&quot;i=%d,j=%d,n=%d\n&quot;,i,j,*n);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;результат: &lt;em&gt;i=5,j=6,n=6&lt;/em&gt;, в функцию мы передали указатель на указатель переменной i, но в самой функции сказали, что теперь он равен указателю на переменную b.&lt;br /&gt;Сами переменные (i и j) не изменились, а вот указатель n, ранее указывающий на i, стал указывать на переменную j.&lt;br /&gt;&lt;br /&gt;И отвечая на ваш вопрос скажу - &lt;strong&gt;ДА! Есть указатели на указатели указателей, особенно это любит использовать корпорация Microsoft&lt;/strong&gt;&lt;br /&gt;Но в реальной жизни, хватает и указателей на указатели. А некоторым и просто указателей.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Указатели на функции&lt;/h3&gt;&lt;br /&gt;Раз в функции можно передать указатель на область памяти, то почему не передать на ту область где находится функция?&lt;br /&gt;Конечно можно и не так сложно, код:&lt;br /&gt;&lt;code&gt;#include &lt;stdio.h&gt;&lt;br /&gt;int pw(int n,int t)&lt;br /&gt;{&lt;br /&gt;int i,r=1;&lt;br /&gt;&lt;br /&gt;for(i=0;i&amp;gt;t;i++)&lt;br /&gt; r*=n; &lt;br /&gt;return r;&lt;br /&gt;}&lt;br /&gt;int hhh(int (nn(int,int)),int z)&lt;br /&gt;{&lt;br /&gt;return nn(z,2);&lt;br /&gt;}&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;printf(&quot;%d\n&quot;,hhh(pw,3));&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Вызываем функцию hhh, передавая ей в качестве аргументов адрес на функцию и число.&lt;br /&gt;В функции hhh вызываем функцию указанную в качестве параметра и получаем в результате цифру 9.&lt;br /&gt;&lt;br /&gt;Для сложных функций, передаваемых в качестве параметра, лучше использовать заменитель &lt;strong&gt;typedef&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;typedef int (*load_func)(int,int);&lt;br /&gt;int hh(load_func f,int z)&lt;br /&gt;{&lt;br /&gt;if (f) return f(z,2);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;printf(&quot;%d\n&quot;,hhh(&amp;pw,3));&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&#39;border: #0000ee solid 2px;&#39;&gt;&lt;a href=&quot;http://feeds.feedburner.com/prog-student&quot;&gt;Подпишись на обновления блога&lt;/a&gt; - будь в курсе&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prog-student.blogspot.com/feeds/933612133433953464/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://prog-student.blogspot.com/2010/11/blog-post_29.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/933612133433953464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3132276620877189877/posts/default/933612133433953464'/><link rel='alternate' type='text/html' href='http://prog-student.blogspot.com/2010/11/blog-post_29.html' title='Указатели, функции и указатели на функции (С, Си)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>