Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 15:49 31-03-2024
DeathMAD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Надо срочно выпить чаю ...

 
Тут надо покрепче что-то пить. Эти хаки называются - "наши компиляторщики не умеют оптимизацию. Совсем."

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 23:18 19-01-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно впердолить XE7 бета компилятор(dcc32220->dcc32210, DLL), ну и либы -- будет компилить, и даже отладка работает.
 
Добавлено:

Цитата:
Эти хаки называются - "наши компиляторщики не умеют оптимизацию. Совсем

а причем здесь оптимизация?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 23:21 19-01-2015
DeathMAD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а причем здесь оптимизация?

 
Притом, что вся эта низкоуровневая возня в памяти должна бы компилятором делаться. Он должен уметь понять всё по размеру и свойствам типа и сгенерировать оптимальный код. А так, такое ощущение что читаю код plain C.

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 23:35 19-01-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Притом, что вся эта низкоуровневая возня в памяти должна бы компилятором делаться. Он должен уметь понять всё по размеру и свойствам типа и сгенерировать оптимальный код. А так, такое ощущение что читаю код plain C.

там не в оптимизации дело, думается.
Eternal_Shield толком ничего не сказал, как у него водится.
TListHelper это хак чтобы не раздувать размер исполняемого файла, работая с обобщенными методами.
Они выводят из-под обобщения всю реализацию, которую можно вывести, работая с указателями и RTTI  -- разумно. Я сам такое делал.
 
Конечно, грязновато.. Но виновата тут скорее не оптимизация компилятора, а утиная модель и реализация обобщенных методов в Delphi (тоже компилятор, но  другая его сторона). Там даже type inference толком не работает.
 
Абракадабре срочно нужен "Compiler Guy", и лучше парочку.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 00:06 20-01-2015 | Исправлено: AlekXL, 00:14 20-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Result := PPointer(PByte(@Self) + SizeOf(Self));

Мдя, возвращаются времена Delphi2. Не говоря уже о целесообразности хелпера для собственного класса скрытого под толстым слоем других - своих же классов. А что такого нужного в хелпере чего нельзя перенести в базовый TList?
 
Добавлено:
Вообще я понимаю ценность хелперов в том случае когда Вы не желаете менять чужой код (например TApplication), но хотите привязать свой метод, который по справедливости и удобству написания должен принадлежать этому классу. Но выносить костыли в другой класс(хелпер) на основании, что это костыли, а я используя это юнит и всё равно компилирую в свой код эти костыли и ни как не смогу их обойти смысла нет. TList<T> генерик это не классический TList, код которого божественный и окончательно совершенный. TList<T> надо было до совершенства доводить, а не хелперы ваять, мне кажется. Я бы не против если меня переубедят, увидеть + одну ещё причину (вторую) применения хелперов было бы достаточно интересно.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 08:49 20-01-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL

Цитата:
Eternal_Shield толком ничего не сказал, как у него водится.  

Не в этом дело, как там у меня было бы. Дело в том, что ихний подход нарушает целостность в принципе и тут даже говорить не о чем ... Это простое незнание фундаментальных принципов программирования, имхо. Именно это меня и насторожило. Да и всех других, по идее, должно ...
 
Если так сильно хочется со структурой-хелпером, то передайте указатель на массив в структуру в конструкторе класса, например, через метод SetArrayRef или аналогичный. Всё! Никаких математик во время исполнения и -1 вызов метода.  
 
xpin2013

Цитата:
Я бы не против если меня переубедят, увидеть + одну ещё причину (вторую) применения хелперов было бы достаточно интересно.

Например, у вас есть TMyList<T> с N нетипизированными методами и два наследника: TMyList<Integer> и TMyList<string>. Для каждого наследника будет создана полная копия родителя. В итоге, у вас N нетипизированных методов присутсвуют в обоих новых типах. Вот вам и эксцесс. Выделите эти N методов в другое место и конечные классы "похудеют".  
 
Собственно, что ем-ро и сделала, но блин, что, наследником никак нельзя? Взяли бы создали какой-нить абстрактный TListBaseClass вместо этой хитрожопой структуры и унаследовали бы от него TList<T>. Всё! Все рады и прыгают от счастья, а все остальные сложной математиком всеми усилиями замедляют свои приложения. Но не судьба вестимо....
 


И давайте уже уберём XE5, XE6, XE7 из шапки и названия обоих тем. Оставим только Embarcadero RAD Studio ...

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 10:17 20-01-2015 | Исправлено: Eternal_Shield, 10:34 20-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
Выделите эти N методов в другое место и конечные классы "похудеют".  

Попытался. Что-то я не понимаю. Может хелпер у Вас это не "class helper", а нечто другое? Пытаюсь воспроизвести, но параметр-тип не компилится у меня с хелпером.
Поправьте, если не сложно, а то я запутался.
Подробнее...
 
Добавлено:
Если что простите за нубство , только вчера перевёл комплекс ПО на XE7 окончательно.

Цитата:
И давайте уже уберём XE5, XE6, XE7

XE5, XE6, XE7 как то в глаза бросается, легче искать.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 11:11 20-01-2015 | Исправлено: xpin2013, 11:12 20-01-2015
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlekXL

Цитата:
Абракадабре срочно нужен "Compiler Guy", и лучше парочку.

А нечего было Barry обижать.
Вернее игнорировать.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 11:21 20-01-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Попытался. Что-то я не понимаю.

Class helper'ы не работают для генериков. Если вы зацепились за слово хелпер, то применитольно к структуре имел я ввиду не прямо хелпер class/record helper for, а в смысле тип-сателит, т.е. просто отдельный тип в котором реализованы общие методы.
 
Что касается вашего примера, то моя идея примерно такая была:
Имеем:

Код:
 
TMyList<T> = class
...
protected
  procedure A;
  procedure B;
  procedure C;
public
  procedure Add(const Value: T);  
end;
 
TMyListString = class (TMyList<String>);
TMyListInteger = class (TMyList<Integer>);
TMyListPointer = class (TMyList<Pointer>);
 

 
При таком раскладе будет создано 3 новых типа с полным копированием родителя, то есть методы A,B,C перекочуют в наследников в полном виде вместе в методом Add. Чтобы исключить в наследниках повтор методов A, B, C надо их выделить либо в non-generic родителя, либо в любой внешний класс/структуру.
 
Например так:

Код:
 
TMyListBaseClass = class abstract
protected
  procedure A;
  procedure B;
  procedure C;
end;
 
TMyList<T> = class (TMyListBaseClass)
public
  procedure Add(const Value: T);  
end;
 
TMyListString = class (TMyList<String>);
TMyListInteger = class (TMyList<Integer>);
TMyListPointer = class (TMyList<Pointer>);
 

 
Во втором случае, исполняемый файл уже будет меньше в размере, т.к. методы A, B, C уже не дублируются. И чем толще "пересекающиеся" методы, тем больше экономии будет.
 
Если интересно, то поэксперементируйте. В зависиммости от толщины "пересекающихся" методов у вас будут замечательные результаты. Особенно, если у одного generic родителя наследников много.
 
Вот такая вот особенность реализации генериков в Делфи: классы-наследники не диференциальны, а fixed;
 



Цитата:
А нечего было Barry обижать.

А Барри-кун тоже не вечен. Замены то нет. Если уже вот таких "магов" до кода допускают, то ситуация в ем-ро полный швах.  
 
Добавлено:
xpin2013
А да, ещё не забывайте, что одно и тоже объявление  

Код:
TMyListString = class (TMyList<String>);  

в разных юнитах считается разными типами ... ну вы поняли намек

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 11:57 20-01-2015 | Исправлено: Eternal_Shield, 12:13 20-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
А да, ещё не забывайте, что одно и тоже объявление  

Это касается всех объявлений, а не генериков в частности. Я делаю так:

Код:
unit unit1;
uses DBGridEh...
type
  TDBGridEh = class(DBGridEh.TDBGridEh)
  protected
    procedure InplaceEditWndProc(Control: TWinControl; var Message: TMessage); override;
  end;
  TfmTable = class(TForm)
    DBGridEh1: TDBGridEh;

Так unit1.TDBGridEh и DBGridEh.TDBGridEh разные классы, но на форме компилируется именно unit1.TDBGridEh, что удобно для промежуточных решений, до того как найдётся нормальное решение.

Цитата:
а в смысле тип-сателит, т.е. просто отдельный тип

Я так и понял, но не сразу - привык называть своими именами, но в случае "сателитов" такое тоже уместно. Но тогда, то о чём Вы говорили про хацк изначально,
>Result := PPointer(PByte(@Self) + SizeOf(Self));
   вызывает у меня гораздо больший ужас. Пока не увижу своими глазами, не поверю что "Белые воротнички" способны на такое. Поискал в XE7 "PByte(@Self)" - такое в одном месте - в модуле Winapi.Windows.pas, и без подвыпедверта с PPointer().

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 14:44 20-01-2015 | Исправлено: xpin2013, 14:46 20-01-2015
sergionn

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Абракадабра купила Касталию
http://www.embarcadero.com/ru/press-releases/embarcadero-acquires-castalia-and-usertility-from-twodesk-software
 
бл, лучше бы купили того, кто им поможет компилер для x86 Android сделать ((((((((

Всего записей: 472 | Зарегистр. 02-11-2011 | Отправлено: 15:53 21-01-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Абракадабра купила Касталию

Вот говорят, что абракадабра обанкротится. Есть ведь деньги, чтобы покупать другие конторы. Значит покупают delphi и builder.

Цитата:
бл, лучше бы купили того, кто им поможет компилер для x86 Android сделать ((((((((

И отладку в придачу.

Всего записей: 1475 | Зарегистр. 24-03-2009 | Отправлено: 15:58 21-01-2015
sergionn

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот говорят, что абракадабра обанкротится.  

да, я высказывал такие предположения,
но потом стало понятно, что "плывет" (пока) она за счет 2-х факторов:
подписка + агрессивный (с элементами "развода"), маркетинг

Цитата:
Есть ведь деньги, чтобы покупать другие конторы. Значит покупают delphi и builder.  

не думаю, что там были серьезные деньги были потрачены...

Всего записей: 472 | Зарегистр. 02-11-2011 | Отправлено: 16:11 21-01-2015 | Исправлено: sergionn, 16:12 21-01-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
да, я высказывал такие предположения,
но потом стало понятно, что "плывет" (пока) она за счет 2-х факторов:
подписка + агрессивный (с элементами "развода"), маркетинг  

Emb делает ставку на большие компании. Те которые знают, что хотят и под это тратят деньги. Значит есть выгоды от использования Delphi и билдера. Не работает тут агрессивный маркетинг. А подписка у них, как и у любой большой компании. Например, AutoDesk.

Всего записей: 1475 | Зарегистр. 24-03-2009 | Отправлено: 16:23 21-01-2015 | Исправлено: SuPriTo, 16:24 21-01-2015
sergionn

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Emb делает ставку на большие компании. Те которые знают, что хотят и под это тратят деньги.

посмеялся - это дешевая публичная отмазка, чтобы не вкладывать в разработку серьезные деньги (нанять новых толковых разрабов) и захватывать новые рынки, капает денежка и хорошо
По сути новых больших компаний в портфолио то и нет, - "старички", которые не хотят переделывать инфраструктуру
Посмотри код fmx - там нет целостной идеологии - видно, что разработка ведется силой пары-тройки человек, причем наугад.
Все матерые спецы по-уходили давно, а новые работают на аутсорсе за 5 копеек...

Цитата:
Не работает тут агрессивный маркетинг.

работает , посмотри на их форум и комьюнити - там куча нубов или вернувшихся на/обновившие Дельфи с ранних версий, купившиеся на возможность "кроссплатформенной разработки",
in desperation от толком неработающей системы

Цитата:
А подписка у них, как и у любой большой компании

ну я и говорю - держаться за счет подписки - а есть ли подобные схемы у других компаний - у большинства есть - но это к вопросу не имеет отношения...

Всего записей: 472 | Зарегистр. 02-11-2011 | Отправлено: 17:25 21-01-2015 | Исправлено: sergionn, 17:36 21-01-2015
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
sergionn
SuPriTo
 
Ребята, а как же Embarcadero до покупки Delphi жила?
 
Я ее раньше знал как производителя инструментария для работы с БД.
У меня в заначке ее
Embarcadero Change Manager v1.4.0
Embarcadero Rapid SQL v5.7.1
Embarcadero SQL Tuner v1.0.1
с 2001 года.
 
А еще здесь узнал что она(Embarcadero) ErWin купила - в июле 2014 года.
 

Цитата:
Значит есть выгоды от использования Delphi и билдера

Есть такое.
 
У Delphi сильные позиции в ISV, InHouseDeveleopment.
Европа, Латинская Америка, Азия.
Кроме Индии, в которой оутсорса на NET, Java до фига.
 
В Америке до расцвета MS тоже знали и любили языки Pascal - семейства.
В частности Apple.
 
Добавлено:
SuPriTo

Цитата:
лучше бы купили того, кто им поможет компилер для x86 Android сделать

Купили же он Delphi for PHP
http://www.qadram.com/vcl4php
http://joseleon.es/?page_id=39
 
Пусть купят RemObjects!
 
Добавлено:
Хотя нет... они же с RemObjects разругались потому что Embarcadero теперь "Going to native".

----------
C уважением, Алексей.
-----------------------------------------------
Хороших %s не бывает — бывает не худший вариант.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 17:52 21-01-2015 | Исправлено: Alexey_Gawrilow, 17:59 21-01-2015
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
бл, лучше бы купили того, кто им поможет компилер для x86 Android сделать ((((((((  

 
Сейчас переписываю мобильное приложение с Delphi на JAVA.  
 
Ничего не получится у Embarcadero с мобильными платформами с таким подходом. Визуальная часть должна быть нативная, иначе имеет то что имеем

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 18:10 21-01-2015 | Исправлено: NickNNN, 18:11 21-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexey_Gawrilow

Цитата:
Ребята, а как же Embarcadero до покупки Delphi жила?  

Раньше они самостоятельной конторой были, а теперь увы.
 

Цитата:
У Delphi сильные позиции в ISV, InHouseDeveleopment.  

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

Цитата:
В Америке до расцвета MS тоже знали и любили языки Pascal - семейства.
В частности Apple.

Когда это было, в 79-м году, кажется?
 
Вообще, очень печально, что за паскалем не стоит какого-нибудь комитета определяющего стандарт и направление развития.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 18:26 21-01-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Хотя нет... они же с RemObjects разругались потому что Embarcadero теперь "Going to native".

Хотя жаль это. Я на Delphi Prism писал. Мне больше понравилось, чем на C#.

Цитата:
Визуальная часть должна быть нативная, иначе имеет то что имеем  

А в Xamarin как у них?
В целом я так понимаю, что в делфи можно делать нативные компаненты для android, избегая fm.

Всего записей: 1475 | Зарегистр. 24-03-2009 | Отправлено: 18:29 21-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NickNNN

Цитата:
Сейчас переписываю мобильное приложение с Delphi на JAVA.

Ждем результатов сравнения
 
Добавлено:
SuPriTo

Цитата:
Хотя жаль это. Я на Delphi Prism писал. Мне больше понравилось, чем на C#.  

Так в чем же дело? Delphi Prism назывался ремобжектовый кислород. RemObjects Oxygen - стоит дешевле чем дельфя, поддерживает нативную разработку под три платформы (.NET, WinRT, Cocoa (iOS, OS X), Java (JVM, Android Dalvik)).

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 18:30 21-01-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru