Функция |
Описание |
utf8::append |
Кодирует 32 битовое представление кодовой точки (code point) в UTF-8 последовательность октетов и добавляет эту последовательность к UTF-8 строке. |
utf8::next |
В качестве параметра получает ссылку на итератор начала UTF-8 последовательности, возвращает 32-х битовое представление кодовой точки и перемещает итератор на начало следующей UTF-8 последовательности. |
utf8::peek_next |
Аналогично utf8::next, но не изменяет позицию итератора. |
utf8::prior |
В качестве параметра получает итератор на любой октет в UTF-8 последовательности, перемещает итератор на начало предыдущий UTF-8 последовательности, возвращает 32-х битовое представление кодовой точки. Эту функцию можно применять для нахождения начала UTF-8 последовательности, имея случайную позицию в строке. |
utf8::advance |
Перемещает итератор на указанное количество кодовых точек. Перемещение допустимо только в сторону увеличения итератора. |
utf8::distance |
Возвращает количество кодовых точек между двумя итераторами. |
utf8::utf16to8 |
Перекодирует строку из UTF-16 в UTF-8 |
utf8::utf8to16 |
Перекодирует строку из UTF-8 в UTF-16 |
utf8::utf32to8 |
Перекодирует строку из UTF-32 в UTF-8 |
utf8::utf8to32 |
Перекодирует строку из UTF-8 в UTF-32 |
utf8::find_invalid |
Возвращает итератор на первую найденную, неправильную, последовательность в UTF-8 строке. |
utf8::is_valid |
Определяет, является ли указанная последовательность октетов правильной UTF-8 строкой. Вызов функции аналогичен коду find_invalid(start, end) == end. |
utf8::replace_invalid |
Заменяет указным значением, в UTF-8 строке, все неправильные последовательности. |
utf8::is_bom |
Ниже приведён код пролога для i386:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl %gs:20, %eax
movl %eax, -4(%ebp)
Эпилог для i386 выглядит так:
xorl %gs:20, %eax
jne .L33
...
.L33:
call __stack_chk_fail // выводит сообщение и завершает работу приложения
static void __attribute__ ((constructor)) __guard_setup (void)
{
unsigned char *p;
int fd;
if (__stack_chk_guard != 0)
return;
fd = open ("/dev/urandom", O_RDONLY);
if (fd != -1)
{
ssize_t size = read (fd, &__stack_chk_guard,
sizeof (__stack_chk_guard));
close (fd);
if (size == sizeof(__stack_chk_guard) && __stack_chk_guard != 0)
return;
}
/* If a random generator can't be used, the protector switches the guard
to the "terminator canary". */
p = (unsigned char *) &__stack_chk_guard;
p[sizeof(__stack_chk_guard)-1] = 255;
p[sizeof(__stack_chk_guard)-2] = '\n';
p[0] = 0;
}
сhar * __strcpy_chk (char *__restrict__ dest, const char *__restrict__ src, size_t slen)
{
size_t len = strlen (src);
if (len >= slen)
__chk_fail ();
return memcpy (dest, src, len + 1);
}
char buf[5];
1)
memcpy (buf, foo, 5);
strcpy (buf, "abcd");
2)
memcpy (buf, foo, n);
strcpy (buf, bar);
3)
memcpy (buf, foo, 6);
strcpy (buf, "abcde");
4)
char *p;
memcpy (p, q, n);
strcpy (p, q);
1)
struct S
{
struct T
{
char buf[5];
int x;
} t;
char buf[20];
} var;
strcpy (&var.t.buf[1], "abcdefg");
char buf[20];
int a;
strcpy(buf, "hello%n");
printf(buf, &a);
Item->setOffset(-0.5*QPointF(pixmap.width(), pixmap.height()));
void PicItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if ( event->button() == Qt::RightButton )
{
lastPos = event->pos();
return;
}
QGraphicsPixmapItem::mousePressEvent(event);
}
void PicItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (event->buttons() & Qt::RightButton)
{
qreal det = lastPos.x() * event->pos().y() - lastPos.y() * event->pos().x();
qreal mod_a = sqrt(pow(lastPos.x(), 2) + pow(lastPos.y(), 2));
qreal mod_b = sqrt(pow(event->pos().x(), 2) + pow(event->pos().y(), 2));
qreal angle = asin(det / (mod_a * mod_b)) * 180 / M_PI;
rotate(angle);
return;
}
QGraphicsPixmapItem::mouseMoveEvent(event);
}
void PicItem::wheelEvent(QGraphicsSceneWheelEvent * event)
{
if ( hasFocus() )
{
qreal fd_xy = (event->delta() > 0)?1.01:0.99;
scale(fd_xy, fd_xy);
}
}
Подробнее об этом можно прочитать в блоге у Алексея Новодворского и у Виктора Алксниса.
На наш взгляд осталась последняя возможность - привлечь общественное внимание к этой проблеме. Именно поэтому я обращаюсь к вам за помощью и прошу принять участие в пропаганде кампании по внедрению СПО в школы. На первых порах для этого надо максимально разместить информацию о происходящем на различных форумах и в блогах.
Кстати о блогах. У кого они есть, просьба дать у себя ссылки на вышеприведенные посты, чтобы вывести их в ТОП Яндекса.
Просьба также писать о саботаже школьного проекта в блог Медведева.
Чем больше мы вместе будем об этом говорить, тем больше шансов защитить внедрение СПО. Поймите, если школьный проект провалится (к чему идет дело), то будут провалены и планы перехода нашей страны на СПО.
Вне зависимости от наших разногласий по тем или иным вопросам, сегодня самое главное спасти школьный проект. Спасем его, значит Linux в России победит!"
Это все печально, но эта информация меня не удивила. Пора наверно привыкнуть, что любой "новый курс" у нас это так же и способ разворовать деньги, а работу поручают выполнять людям, которые в деле ничего не соображают. На Руси это было всегда...:(
Отрывок из книги Джеффа Элджера «Библиотека программиста C++»:
«С++ — язык, который изучается постепенно. Лишь после того, как будет сделан последний шаг, разрозненные приёмы и фрагменты синтаксиса начинают складываться в общую картину. По-моему, изучение С++ чем-то напоминает подъем на лифте. Дзынь! Второй этаж. С++ — это усовершенствованный вариант С, с сильной типизацией (которую, впрочем, при желании можно обойти) и удобными комментариями //. Любой программист на С, если он не хочет подаваться в менеджеры, должен двигаться дальше… а Бьярн Страуструп (Господи, благослови его) придумал для этого отличную возможность. Дзынь! Третий этаж. С++ — хороший, хотя и не потрясающий объектно-ориентированный язык программирования. Не Smalltalk, конечно, но чего ожидать от языка, работающего с такой головокружительной скоростью? С++ — это Cobol 90-х, политически выдержанный язык, которые гарантирует финансирование вашего проекта высшим руководством. А уж если С++ достаточно часто упоминается в плане, можно надеяться на удвоение бюджета. Это тоже хорошо, потому что никто толком не умеет оценивать проекты на С++ и управлять ими. А что касается инструментария — глаза разбегаются, не правда ли? Дзынь! Последний этаж, все выходят. Но позвольте, где же «все»? Лифт почти пуст. С++ — это на самом деле не столько язык, сколько инструмент для создания ваших собственных языков. Его элегантность заключается отнюдь не в простоте (слова С++ и простота режут слух своим явным противоречием), а в его потенциальных возможностях. За каждой уродливой проблемой прячется какая-нибудь умная идиома, изящный языковой финт, благодаря которому проблема тает прямо на глазах. Проблема решается так же элегантно, как это сделал бы настоящий язык типа Smalltalk или Lisp, но при этом ваш процессор не дымится от напряжения, а на Уолл-Стрит не растут акции производителей чипов памяти. С++ — вообще не язык. Это мировоззрение или наркотик, меняющий способ мышления.»
#include "Etimer.h"
int main(int argc, char* argv[])
{
//создать переменную типа Etime_t
//эта структура данных
//определена в файле Etimer.h.
Etime_t mtime;
//вызвать функцию EtimeInitialize
//для инициализации переменной
if ( !EtimeInitialize(&mtime) ) return -1;
//начало измерения
if (Etime(&mtime))
{
//измеряемый участок код ;)
...
//получаем время выполнения
if (Etime(&mtime))
{
printf("Выполнялось, сек = %16.13f\n",
EtimeDurationInSeconds(&mtime));
}
}
return 0;
}
"По замечанию д-ра Леонарда Орра, человеческий мозг ведет себя так, как если бы он состоял из двух частей: Думающего и Доказывающего.
Думающий может думать практически обо всем. Как показала история, он может думать, что Земля покоится на спинах бесконечных черепах, или что она внутри пуста, или что она плывет в пространстве. В это верят миллионы людей (включая автора этой книги). Сравнительная религия и философия показывают, что Думающий может считать себя смертным, бессмертным, одновременно смертным и бессмертным (реинкарнационная модель) или даже несуществующим (буддизм). Он может думать, что живет в христианском, марксистском, научно-релятивистском или нацистском мире -- и это ещё далеко не все варианты. Как часто наблюдалось психиатрами и психологами (к вящей досаде их медицинских коллег), Думающий может придумать себе болезнь и даже выздоровление.
Доказывающий -- это гораздо более простой механизм. Он работает по единственному закону: что бы ни думал Думающий, Доказывающий это доказывает.
Вот типичный пример, породивший невероятные ужасы в этом столетии: если Думающий думает, что все евреи богаты, Доказывающий это докажет. Он найдет свидетельства в пользу того, что самый бедный еврей в самом захудалом гетто где-то прячет деньги. Подобным образом, феминистки способны верить, что все мужчины (включая голодных бродяг, которые живут на улицах) эксплуатируют всех женщин (включая английскую королеву).
Если Думающий думает, что Солнце вращается вокруг Земли, Доказывающий услужливо организует восприятие так, чтобы оно соответствовало этой идее; если Думающий передумает и решит, что Земля вращается вокруг Солнца,
Доказывающий организует свидетельства по-новому.".
Хоть эта модель работы мозга и сильно упрощённая, но опровергнуть её не просто:).
Я утверждаю, что система типов
и семантика С++ чище, чем
его синтаксис
Бьерн Страуструп
#include <iostream>
int main(int argc, char* argv[])
{
int a = +-+-+-+-+10;
int b = 5*-+-+a;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
{
{
{
{
10;
std::cout << "Hello;)\n";
}
}
}
}
((a > 10)?a:b) = 100;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << ((2 < 5)?a=1, b=2, a+b: 0) << std::endl;
(1 > 0)?0:throw 1;
try
{
(1 < 0)?0:throw 1;
}
catch( ... )
{
std::cout << "Exception;)\n";
}
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << !!!!!!!!!!!!1 << std::endl;
}
----------------------------------------------
Результата работы программы
----------------------------------------------
a = 10
b = 50
Hello;)
a = 10
b = 100
3
Exception;)
a = 1
b = 2
1
------------------------------------------------
Выражения с несколькими унарными знаками возможны согласно правилам:
выражение-приведения =>
унарное-выражение
унарное-выражение =>
унарный-оператор выражение-приведения
унарный-оператор =>
* & + - ! ~
Несколько вложенных "составных инструкций" возможны по
правилам:
инструкция =>
составная-инструкция
составная-инструкция =>
{ последовательность-инструкций }
последовательность-инструкций =>
инструкция
Приводить правила грамматики позволяющие строить с "условным выражением" такие конструкции я не буду, так как их много, если кому интересно смотрите, например в [1]. А следующее выражение допустимо, потому что оно выводима с помощью правил грамматики С++ и результат применения оператора к операнду lvalue является lvalue, если это приемлемо с точки зрения логики (lvalue - это выражение, ссылающееся на какую-то непрерывную область в памяти):
((a > 10)?a:b) = 100;
Например, на следующее выражение компилятор будет шибко ругаться, хотя оно и верно синтаксически, так как результат "логического ИЛИ" не есть lvalue:
(a || b) = 1;
Литература
1. Б. Страуструп. Язык программирования С++. Специальное издание.
2. Б. Страуструп. Дизайн и эволюция С++.