Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: О стилистике при оформлении исходников
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
Злодей
"Не используйте эмоции в комментариях." - по мне замечание.
zltigo
Цитата(Злодей @ Feb 14 2010, 18:38) *
"Не используйте эмоции в комментариях."

Тоже не факт sad.gif. Я вот несколько недель назад закомментировал несколько сот строк исходника с мутью от Microchip. И написал краткий, но исчерпывающий, и доходчивый комментарий на русском (кодировка WIN1251, кстати, прекрасный повод для обсуждения, какую использовать smile.gif ).
aaarrr
Цитата(Alex B._ @ Feb 14 2010, 18:20) *
Глуповато выглядит переходить в споре на личности и цепляться к фразам. Хе, не ожидал от вас такого =)

Хе-хе. А попытки уязвить собеседника фразочками типа "вкусовщина", "не барское дело", "слив засчитан", думаете, выглядят умно и тонко?

Цитата(zltigo @ Feb 14 2010, 19:00) *
кодировка WIN1251, кстати, прекрасный повод для обсуждения, какую использовать smile.gif

Да-да, в FAR'е-то по умолчанию DOS smile.gif
Dog Pawlowa
Прокомментируйте еще плз.
Рекомендация использовать собственные typedef с обязательным указанием signed/unsigned. В принципе логично.
Но sprintf требует указатель на буфер родного типа char.
Как решается эта коллизия?
В сотне мест делать преобразование типа или запрещать предупреждение?
zltigo
Цитата(aaarrr @ Feb 14 2010, 19:11) *
Да-да, в FAR'е-то по умолчанию DOS smile.gif

Да, ибо консоль, но плагины разные есть.
В принципе 866 AKA "альтернативная" самая разумная кодировка, что-бы не говорили юниксоиды и уж тем более микрософт. Но тут уж я "сдался" и последние годы по умолчанию, если вдруг кирилица нужна, пользую 1251, хотя в редактор встроил и распознавание и переключение OEM/ANSI кодовых страниц. Разнообразные перекодировки тоже имеются.
Цитата(Dog Pawlowa @ Feb 15 2010, 00:37) *
Но sprintf требует указатель на буфер родного типа char.

Зачем-же ему фигню какую-то другого типа подсовывать, если с текстами работаете? Да и сам sprintf() штука не слишком незаменимая, дабы его в сотнях мест пользовать. Скорее всего Вам vfprintf(),vprintf(),vspritf() требуются.
sigmaN
Классно. Но вот лично я так и не понял чем же плох таб, если его "пробеловый эквивалент" можно выставить в редакторе и каждому наслаждаться привычным форматированием?
Я как-бы опыта не шибко много имею и возможно вопросик глупый задаю, но всё-же тема для начинающих. Простите уж меня.

Правильно ли я понял, что при отображении редактор способен заменить каждый символ табуляции определенным кол-вом пробелов?
Программист ставит скобку { ентер и таб. Ставит ещё одну { снова ентер и таб.... от начала строки табов с каждым таким разом становится всё больше, каждый таб при выводе на экран заменяется заданным кол-вом символов пробелов - этим с обеспечивается отступы...

Но ведь не зря же кому-то пришла эта мысль с пробелами. Это тупость, которая якобы заставляет все исходники выглядеть одинаково на всех машинах?

Ааа не проще ли в стандарте кодирования для компании прописать размер табуляции - 4 символа. Кто не настроил свой редактор правильно - тот дурак. А может и не дурак, может ему привычнее наблюдать исходники с tab=2символа. Зато он что-то накодит там(используя именно табы) а другой откроет у себя с настройками tab=4 и будет видеть его код но уже в привычном для себя виде.. ИМХО вообще сказочно получается.
Или чего-то я не понял пока в этой жизни?
aaarrr
Цитата(sigmaN @ Feb 15 2010, 02:48) *
Правильно ли я понял, что при отображении редактор способен заменить каждый символ табуляции определенным кол-вом пробелов?

Ну, если только это не "блокнот" smile.gif

Цитата(sigmaN @ Feb 15 2010, 02:48) *
Но ведь не зря же кому-то пришла эта мысль с пробелами. Это тупость, которая якобы заставляет все исходники выглядеть одинаково на всех машинах?

Одинаково плохо на всех. При замене пробелами очень часто дело кончается тем, что иденты вообще теряют фиксированный размер - выглядит безобразно.
_Pasha
Цитата(MrYuran @ Feb 14 2010, 19:10) *
SciTE - русский потомок Scintill'-ы
Скриптоязык там правда LUA, но он написан на си, так что с натяжкой можно считать...

На первый взгляд - очень даже ничего. beer.gif Огромное количество скриптоязыков в мире действительно раздражает. Скоро можно будет подолгу играть в языки, как в прошлом играли в города (вспомнились "Джентльмены удачи") smile.gif
А вот что еще симпатично - объем исходников-то там не очень большой, можно допилить...
sigmaN
Цитата
Одинаково плохо на всех. При замене пробелами очень часто дело кончается тем, что иденты вообще теряют фиксированный размер - выглядит безобразно
Ну тогда вопрос решен! Не пользоваться блокнотом и не использовать пробелы там, где должна быть табуляция )
ReAl
Цитата(AHTOXA @ Feb 14 2010, 15:23) *
А пример ваш не совсем честный. Если есть справа комментарии, то они сползут всеsmile.gif
натюрлих, блин...
Попробовал как-то в Notepad++ включить пропорциональный шрифт и посмотреть так исходники. Довольно приятственно выглядит сам текст программы, даже не ожидал.
Из-за "узкого" пробела лучше переставить TAB=8, так как 4 начинають выглядеть как 2 :-)
Одно откровенно паршиво - независимот от установки TAB при переходе к пропорциональному шрифту разбегаются эти комментарии справа, отступы между типами и именами, например, при объявлении структур (точно так же, как они разбегаются при изменении TAB)

Можно подровнять табуляциями же - но тогда ужасно выглядит, если открыть в другом редакторе, в котором моноширинный шрифт :-)
aaarrr
Цитата(ReAl @ Feb 16 2010, 02:13) *
Попробовал как-то в Notepad++ включить пропорциональный шрифт и посмотреть так исходники. Довольно приятственно выглядит сам текст программы, даже не ожидал.

А уж как при этом таблички с шестнадцатеричными числами смотрятся - загляденье просто smile.gif
Цитата
const u_short t_ln[256] =
{
0x0000, 0xffd3, 0xdfea, 0xcd3a, 0xbff5, 0xb5ab, 0xad41, 0xa625,
0x9ffb, 0x9a8c, 0x95af, 0x9149, 0x8d45, 0x8993, 0x8628, 0x82f9,
0x7ffe, 0x7d32, 0x7a8e, 0x7810, 0x75b1, 0x7371, 0x714b, 0x6f3e,
...

Но это плохой пример - для пущего эффекта надо чтобы через строку чередовались 0x00 и 0xDD.
sigmaN
Раз уж разговор заходил про редакторы....
А как вы(ув. Гуру) решаете проблему неудобства использования оторванного от IDE редактора?
Ну вот я в основном с техасом работаю, т.е. IDE CCS 3.3, так там же сразу и отладка ежели что.....ну т.е. понятно, не зря это IDE наз.

Или открываете одни и теже файлы в IDE и в другом редакторе, а потом IDE замечает изменения извне и переспрашивает reload?
Или как? Или только написание в хорошем редакторе, а отладка в IDE и уже что Бог дал - то юзаем....

P.S. скачал SlickEdit2009... чувствуется мощность... ))
dxp
Цитата(sigmaN @ Feb 16 2010, 07:02) *
Или только написание в хорошем редакторе, а отладка в IDE

+1. Вся работа с исходниками в хорошем редакторе, а также сборка из него, навигация по сообщениям об ошибках и т.д. А IDE только для внутрисхемной отладки. Поскольку ничего, кроме как ходить по сорцам и работать с отладочными окнами, не требуется, то хилые возможности IDE в части редактирования не напрягают совсем.

Плюс еще в том, что в одном и том же редакторе работаешь с исходниками для совершенно разных проектов/платформ, включая и HDL дизайн - среда привычная. Меняются только отладчики.

Цитата(sigmaN @ Feb 16 2010, 07:02) *
P.S. скачал SlickEdit2009... чувствуется мощность... ))

Отож. smile.gif
zltigo
Цитата(dxp @ Feb 16 2010, 07:31) *
+1. Вся работа с исходниками в хорошем редакторе, а также сборка из него, навигация по сообщениям об ошибках и т.д.

Именно так.
aaarrr
Есть IDE, которыми вполне можно пользоваться. IAR и Keil к этой категории, правда, не относятся, а вот тот же CCS особого отвращения не вызывал, хотя он и убогий достаточно в плане редактирования.
sonycman
Цитата(dxp @ Feb 16 2010, 08:31) *
+1. Вся работа с исходниками в хорошем редакторе, а также сборка из него, навигация по сообщениям об ошибках и т.д.

Хм, только бы знать, как прикрутить парсер, к примеру, чтобы компилер кейла выдавал результаты компиляции в окошко слика, и по ним можно было переходить...
_Pasha
В общем, иногда Code::Blocks раздражает, но по простоте и логичности он мне нравится больше, чем слик. ЗЫ: кто помнит, где в слике находятся установки code folding style - (или как там они называются)?
ReAl
Цитата(aaarrr @ Feb 16 2010, 01:21) *
А уж как при этом таблички с шестнадцатеричными числами смотрятся - загляденье просто smile.gif
Да, действительно - ужас.
Только
1) я такие таблички не читаю - сгенерирвал, вставил и пусть живёт себе.
2) терпеть не могу и при моноширинном шрифте маленькие буквы в hex-числах (как и большую X, поєтому всегда пишу "0x%X" а не "%#x" или "%#X").

А так - так и ничего, если не выбирать шрифты Comic, Gothic и подобные.
Нажмите для просмотра прикрепленного файла
dxp
Цитата(sonycman @ Feb 16 2010, 15:19) *
Хм, только бы знать, как прикрутить парсер, к примеру, чтобы компилер кейла выдавал результаты компиляции в окошко слика, и по ним можно было переходить...

Project->Properties->Tools, настроить по вкусу запуск любимого тула с перехватом его вывода в окно слика. Переход по сообщениям настраивается на основе регулярных выражений в Build->Configure Error Parsing... Добавляете свой парсер в Categories, создаете регулярное выражение в Expressions (или несколько, если они бывают разного формата). Для отладки выражения там есть инструмент Tools->Regex Evaluator, где можно накидать примеров строк и интерактивно наблюдать, как на них реагирует маска по задаваемому выражению.

Если что не понятно по месту, то F1 - в доке все вполне внятно описано.
SasaVitebsk
А я тоже табуляциями пользуюсь. И, мне кажется, (стыдно признаться) что действительно редактировать удобнее и быстрее. Пробовал переходить на пробелы - мне как то неудобно. Вот думаю, что гоняю себе. smile.gif
И без фара жить не могу. smile.gif Тоже привычка дол@аная нортовская. Плагины я там не ставил никакие, так он меня раздражает жутко, например своим поиском ... Но как говорится "плакали, морщились, но всёже жрали кактус..." smile.gif

И что-то редакторы крутые у меня не приживаются. И вроде комп вполне приличный, но slick, иногда у меня подтормаживает. А я могу долго думать, а потом пишу быстро, так эти тормоза начинают раздражать. Встроенные функции он как-то ищет избирательно. То подсветит, то забудет...

Короче, понятно, что сейчас поступит диагностика "вы просто не умеете их готовить" - и я заранее с этим соглашусь, но всётаки стоит признать, что редакторы и прочие фичи - это елементы комфорта. И я признаю, кидайте в меня камень, что многое - дело вкуса, сложившихся предпочтений и т.п. И корней этого - теперь уже не найти. Да и не хочется так глубоко рыться в себе. smile.gif Уже не хочется.

Поэтому я поддерживаю _Pasha. Хотелось бы полегче, попроще (как зубило), но чтобы поудобнее. И чтобы не создавал 150 файлов проекта блин... smile.gif Редактируй - что дают. smile.gif

А то на одну настройку SlickEdita уйдёт пол жизни. Хочется отдельный комп покупать для редактирования.


И ещё один вопрос. Навеяло этой темой. Интересно, насколько программисты консервативны? Насколько зависят от привычек и пристрастий? Вот что-то подсказывает мне - что здорово зависят. А ведь не должны. Ведь софт, по-определению. А?
aaarrr
Цитата(ReAl @ Feb 16 2010, 13:13) *
2) терпеть не могу и при моноширинном шрифте маленькие буквы в hex-числах (как и большую X, поєтому всегда пишу "0x%X" а не "%#x" или "%#X").

А вот наоборот - не люблю прописные в hex'е. И еще я всегда вязал узелки на земляном проводе, да smile.gif
rezident
Цитата(aaarrr @ Feb 17 2010, 02:22) *
И еще я всегда вязал узелки на земляном проводе, да smile.gif
Аналогично! smile.gif Причина очень простая - общий провод один, а питаний может быть несколько. Причем как положительных, так и отрицательных. Повелось это еще со времен Радио-РК86 потому, что для К580ИК80А нужно было три питания: -5В, +5В и +12В.
aaarrr
Цитата(SasaVitebsk @ Feb 17 2010, 00:12) *
И ещё один вопрос. Навеяло этой темой. Интересно, насколько программисты консервативны? Насколько зависят от привычек и пристрастий? Вот что-то подсказывает мне - что здорово зависят. А ведь не должны. Ведь софт, по-определению. А?

Не сказал бы, что очень уж консервативны. Накопление опыта и формирование стиля - это достаточно длительный эволюционный процесс, некоторый здоровый консерватизм не помешает. Если, конечно, он не проявляется таким образом, что единожды научившись писать на "C для AVR", человек совершенно теряет желание осваивать что-либо еще.
Сергей Борщ
Цитата(rezident @ Feb 16 2010, 23:37) *
Аналогично! smile.gif Причина очень простая - общий провод один, а питаний может быть несколько.
Пошел оффтопик... Вот именно - и узелков может быть несколько. А без узелков провод - один. И еще - плюсик - это минусик, к которому добавили палочку. И плюсовой провод - такой же как минусовой, но к которому добавили узелок (это меня еще дед так учил). И 12в больше, чем 5В, поэтому на 12в два узелка, на 5в - один. И минус черный (или более темный), потому что земля, а земля - темная. А если есть в палитре красный - то он плюсовой, потому что красный - цвет горячего. Может и не правильно, но запоминается легко.
Консервативность есть - сопротивляюсь долго. Но если созрел для изменения - то резко и без переходного периода.
rezident
Цитата(Сергей Борщ @ Feb 17 2010, 02:58) *
А если есть в палитре красный - то он плюсовой, потому что красный - цвет горячего. Может и не правильно, но запоминается легко.
Есть еще более простое для запоминания правило: чем "плюсее", тем краснее biggrin.gif
aaarrr
Цитата(Сергей Борщ @ Feb 17 2010, 00:58) *
...И минус черный (или более темный), потому что земля, а земля - темная.

А вот мой коллега вяжет узелок на плюсе, но из пары черный-белый выбирает для минуса последний. Так и живем, привыкли smile.gif
ReAl
Цитата(Сергей Борщ @ Feb 16 2010, 23:58) *
Пошел оффтопик... Вот именно - и узелков может быть несколько. А без узелков провод - один. И еще - плюсик - это минусик, к которому добавили палочку. И плюсовой провод - такой же как минусовой, но к которому добавили узелок (это меня еще дед так учил). И 12в больше, чем 5В, поэтому на 12в два узелка, на 5в - один. И минус черный (или более темный), потому что земля, а земля - темная. А если есть в палитре красный - то он плюсовой, потому что красный - цвет горячего. Может и не правильно, но запоминается легко.
Консервативность есть - сопротивляюсь долго. Но если созрел для изменения - то резко и без переходного периода.
+1 к каждому предложению :-) Только меня отец :-)
sigmaN
Как лучше?
if (a > z)
{
}
или
if( a > z )
{
}

то-же и с for, while и т.д.
Лично мне кажется, что второй вариант более удобно читать, особенно когда выражение содержит скобки.
Однако первый вариант похоже рекомендован и встречается чаще.
Вот мне интересно кто как пишет?
aaarrr
На мой взгляд, в обоих приведенных вариантах присутствуют лишние пробелы. Пишу так:
Код
if(a > z)
{
}

Для for, while etc. аналогично.
Ko4egap
Цитата(aaarrr @ Feb 17 2010, 20:56) *
На мой взгляд, в обоих приведенных вариантах присутствуют лишние пробелы.

А на мой взгляд и у вас лишние пробелы. Когда условие чуточку сложнее, трудно читаемо.
Код
if(a<b && c!=d)
{
    error();
    return(0);
}

а for по умолчанию содержит несколько выражений
Код
for(i=0; i<20; i++);
demiurg_spb
ИМХО при написании программ на СИ надо пользоваться принципами правил русского или английского языка:
Пробелы между словами, фразами, выражениями, и, конечно, после знаков пунктуации (; . ,).
А вот после открывающейся скобки и перед закрывающей - пробелы не нужны (совсем). <- вот такsmile.gif
Я пишу так:
Код
for (uint8_t i=0; i<20; i++)
{
}

while (x)
{
}

if (a && !b)
{
}
На мой взгляд так приятнее читается.
zltigo
Цитата(Ko4egap @ Feb 18 2010, 13:13) *
А на мой взгляд и у вас лишние пробелы. Когда условие чуточку сложнее, трудно читаемо.

Тогда пишите так:
Код
if(a<b && c!=d){error();return(0);}

Идеал smile.gif
Ну а я буду так:
Код
if( ( a < b )&&( c != d ) )
{  error();
   return( 0 );
}

но
Код
for( int i=0; i < x; i++ )
{  call( z, i );
   a = sizeof(x);
......
}

typedef struct {
    union {
        unsigned long long num;
        BYTE dd[8];
        struct {
            ulong nlo;
            ulong nhi;         
        };
    };
    BYTE cnt;    
} Numb_t;
sigmaN
Вот и я почему-то как-то интуитивно захотел отделить кобки if() от выражения. т.е.
Код
if( ( a < b )&&( c != d ) )
на мой взгляд идеально

насчёт
Код
{  call( z, i );
...
}
Думаю кто-то может возразить, но лично я нахожу это очень привлекательным.
Сперва я, для "экономии строк", пользовался стилем К&R для скобок, но потом понял, что это не совсем удобно при отладке.
Хотя красиво и практично в том плане, что нет пустой строки занятой только {
А тут и скобки легко считать и строка не пустует. Возьму на заметку. Мне нравится.
ReAl
Цитата(sigmaN @ Feb 21 2010, 02:46) *
А тут и скобки легко считать и строка не пустует. Возьму на заметку. Мне нравится.
Да я вот тоже исключительно на K&R сижу1, по крайней мере там, где от меня не требуется работать в общем стиле.
И тоже на это форматирование, не первый раз уже на этом форуме показанное, с интересом посматриваю. Вроде нравится, а вроде и нет. Надо в каком-то небольшом текущем проекте на него перейти, "покатать на языке, вкус почувствовать".
______
1 Только в if с длинными условиями ставлю { не в конце, да ещё и за ним утаскиваю закрывающую круглую от условия.
Код
    if( abcdef && qwerty
        || zxcvbn && poiuytr
    ) {
        foo();
    }
rezident
Цитата(ReAl @ Feb 21 2010, 12:20) *
1 Только в if с длинными условиями ставлю { не в конце, да ещё и за ним утаскиваю закрывающую круглую от условия.
Довольно необычно сэкономлена строка. Напротив открывающей круглой стоит открывающая фигурная скобка и аналогично с закрывающими. Я бы таким исходниках огорчился. laughing.gif
Ko4egap
zltigo, не надо путать кислое с длинным. Так:
Код
if(a<b && c!=d){error();return(0);}
писать не буду, потому что я пропагандирую читабельность а не сокращение кол-ва строк.

У человеческого глаза довольно узкий угол обзора, в вашем случае, выражение
Код
if( ( a < b )&&( c != d ) )
расползается по всей строке, а сочетание символов ')&&( ' вообще сума сводит, создается ощущение будто бы это логическое "И" должно выполнится самым первым, вы разделели два цельных выражения на части и приклеили по осколку от каждого к третьему. Почему тогда && не выделен пробелами? А обилие абсолютно ненужных там скобок окончательно запутывает.

Вы в школе квадратное уравнение так записывали?
( a * x2 ) + ( b * x ) + c = 0

Или все-таки так?
a*x2 + b*x + c = 0

вот еще пример
a*(b+c)

или
a * ( b + c )

IMHO во втором случае неочевиден порядок действий

Итого: мое мнение: пробелами, стоит разделять отдельные логические выражения, так чтобы порядок действий, в котором они выполняются был как можно более нагляден.
Ko4egap
немного неверно пример привел. Стиль записи кода вроде
Код
if( ( a < b )&&( c != d ) )
соответствует такому стилю записи мат выражений
( a * x2 )+( b * x )+ c = 0
sigmaN
Ежу понятно, что операция && не может быть выполнена первой, т.к. для начала у неё должны быть операнды, которые какраз надо вычислить.
И скобки там очень даже помагают сразу это понять, а не лезть в таблицу приоритетов(в голове или по F1 - не важно).
AHTOXA
Цитата(sigmaN @ Feb 25 2010, 00:19) *
Ежу понятно, что операция && не может быть выполнена первой, т.к. для начала у неё должны быть операнды, которые какраз надо вычислить.
И скобки там очень даже помагают сразу это понять, а не лезть в таблицу приоритетов(в голове или по F1 - не важно).


Ежу - понятно, а вам, чтобы понять - нужны скобки? smile.gif))
zltigo
Цитата(AHTOXA @ Feb 24 2010, 23:41) *
Ежу - понятно, а вам, чтобы понять....

Проблемы не в понимании, проблемы в читаемости. Для читаемости полезна прежде всего легкость узнаваемости знакомых конструкций, слов. Конструктивными элементами формирующими легко узнаваемые и распознаваемые конструкции и являются скобочки, отступы, разделители... буквы, цифры, символы не являются конструктивными элементами - они наполнитель.
AHTOXA
Цитата(zltigo @ Feb 25 2010, 02:23) *
Проблемы не в понимании, проблемы в читаемости. Для читаемости полезна прежде всего легкость узнаваемости знакомых конструкций, слов.

Вот именно! Кто как привык - тот так и быстрее и легче узнаёт конструкции и слова. А обоснования - это уже потом придумываются. Так что, по большому счёту, мы сейчас спорим о вкусах.
Цитата
Конструктивными элементами формирующими легко узнаваемые и распознаваемые конструкции и являются скобочки, отступы, разделители... буквы, цифры, символы не являются конструктивными элементами - они наполнитель.

Тоже верно. Но зачем в конструкции
Код
if(x < 2)
добавлять к скобочкам (которые уже разделители) ещё и пробелы:
Код
if( x < 2 )

?
zltigo
Цитата(AHTOXA @ Feb 25 2010, 00:58) *
Тоже верно. Но зачем в конструкции
Код
if(x < 2)
добавлять к скобочкам (которые уже разделители) ещё и пробелы:
Код
if( x < 2 )

Для того, что-бы отделить собственно конструкцию
if( .... )
от ее содержимого
x<2
С этой-же целью после if перед скобкой отсутствует пробел.

Цитата(AHTOXA @ Feb 25 2010, 00:58) *
Так что, по большому счёту, мы сейчас спорим о вкусах.

Я не спорю, я просто привел в противовес пример своего форматирования.
x736C
Полностью тему не прочитал, только выборочно.

1. Пришла в голову банальная мысль, странно, что задумался только сейчас.
Хорошо оформленный текст программы (читаемость, легкость... и т. п.),
кстати как и хорошо оформленный простой текст, приводит к меньшей утомляемости
при работе с ним. Даже если конкретные участки не интересуют, но когда глаз часто
видит кашу, то быстро начинаешь уставать. Не говоря уже про ту часть, непосредственно
отладкой которой занимаешься.

2. Кому-нибудь приходилось выполнять перевод текста программы в MS Word
и в последующем оформленять по ГОСТ?!
Сложилось впечатление (может, у меня что-то криво складывалось), что
и табуляции и пробелы и на моноширинных шрифтах «копипастятся» изначально криво,
требуют доводки. Использовал для этих целей Courier New.
Хотя, быть может, в ворде как раз все правильно, а кривой IDE (AVR Studio).
andrew_b
Цитата(zltigo @ Feb 25 2010, 02:03) *
Для того, что-бы отделить собственно конструкцию
if( .... )
от ее содержимого
x<2
С этой-же целью после if перед скобкой отсутствует пробел.
На мой взгляд, это ужасно...

Код
if (x < 2)
Не стоит экономить на пробелах. Хуже от этого не будет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.