|  |  |  | 
	| Железный канал: «C, С++» | 
	|  | 
	|  | 
	
		| Sh.Tac. 
  151 EGP 
   Рейтинг канала: 1(2)
 Репутация: 14
 Сообщения: 1426
 
 Зарегистрирован: 27.07.2005
 
    |  | 
	  | AnrDaemon : |  
	  | C какой целью ты рассчитываешь "точный размер отправляемого пакета"? |  очевидно чтобы не засирать сеть мелкими пакетами
   есть writev() которое умеет из кусочков памяти собирать стрим
 
 З.Ы. хотел ещё отметиться по предыдущей задаче, есть клёвый tool, называется ct-ng, в частности эпики юзают этот crosstoolchain в "канадском" варианте, когда на линухе собирается таргет для mingw который в свою очередь должен собирать таргет на линухе
 _________________
 This is what you get ...
 (c) Radiohead
 
 Последний раз редактировалось: Sh.Tac. (02:56 24-08-2014), всего редактировалось 1 раз
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | 
	  | Sh.Tac. : |  
	  | есть клёвый tool, называется ct-ng |  
 лучше make все равно ничего не придумали
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | 
	  | ТехноМаг : |  
	  | Content-Length уже дааавно не обязателен |  Content-Length НИКОГДА не был обязателен. И сейчас он не обязателен, как и всегда.
 Я тебе больше скажу - сейчас даже "Content-Transfer-Encoding: chunked" можно не указывать, так как подавляющим большинством браузеров она принимается по умолчанию.
 
 
 
	  | ТехноМаг : |  
	  | с картинкой-то понятно. Там размер сразу известен. 
 А вот с остальным текстовым уно черт поймет
 |  Не поминай чёрта всуе.
 Берёшь стандарт, читаешь. А там английским по серому написано, что от тебя требуется три вещи:
 1. Посылать строки заголовка целыми пакетами.
 2. Отправить правильную строку статуса.
 3. Послать после заголовка пустую строку.
 Дальше можешь делать что угодно. То есть вообще.
 _________________
 Люблю свободный полёт... :)
 
 Последний раз редактировалось: AnrDaemon (03:11 24-08-2014), всего редактировалось 1 раз
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | 
	  | AnrDaemon : |  
	  | делать что угодно. То есть вообще. |  
 ты это уже говорил, и я собсно уже таким магаром переписываю.
 
 Пошел пингвинов размножать
   
 
 
	  | AnrDaemon : |  
	  | Не поминай чёрта всуе. |  бытует мнение, что все зло вот в этих 3х строк:
 #define MC_START	0x0A
 #define MC_STOP		0x2C
 #define MC_STAT		0x2A
 
 а вообще 42 всем.
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 
 Последний раз редактировалось: ТехноМаг (03:32 24-08-2014), всего редактировалось 2 раз(а)
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | Замечательный инструмент Wireshark. Показывает всё самое интересное про общение в сети. _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | В общем все получилось, всем спасибо. Осталось только нормально POST научить обрабатывать (с Escape, я имею ввиду, но это не сложно) _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | Советую найти подходящую стандартную библиотеку и не морочиться. _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | 
	  | AnrDaemon : |  
	  | Советую найти подходящую стандартную библиотеку |  
 ну под Си их кот наплакал, и как правило они тянут за собой туеву кучу зависимостей. Тут одно из условий заказа - скопировал, запустил, профит...
 
 Да и поздно уже. Написал уже все что нужно...
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | Статическую линковку ещё никто не отменял   Как в итоге краши вылечил?
 _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | NOSIGNAL и в инициализатор еще хендл на SIGTERM поставил. _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 | 
		
		|  | 
    |  | 
	
		| Endeavour 
  1015 EGP 
        Рейтинг канала: 6(322)
 Репутация: 105
 Сообщения: 7041
 Откуда: guess
 Зарегистрирован: 26.05.2005
 
      |  | 
curl? Пользовался немного, оно работает™
	  | ТехноМаг : |  
	  | ну под Си их кот наплакал |    
 edit: я так и думал, что где-то ступил %)
 
 Последний раз редактировалось: Endeavour (19:16 26-08-2014), всего редактировалось 1 раз
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | cURL это клиентская библиотека. Человек же сервер пишет. Может, каких-то функций из неё можно надёргать, но общее предназначение библиотеки не в этом.
 _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | И снова я, и с глупым вопросом. 
 кратко:
 Дано 8 кубов со стороной GalaxyClusterSize в массиве
 0 - центр - 1 +-x 2 +-y 3+-z 4+-xy 5+-xz 6+-yz 7+-xyz
 
 Надо - динамически проверять где находится игрок, и в случае его перехода из одного куба в другой менять их в массиве местами. Делаю так:
 
 
 
	| 
 Cкрытый текст   (кликните здесь для просмотра)
 
	  | Код: |  
	  | void ALGalaxy::UpdateClustersInLocation(FVector Location) {
 FGalaxyCluster _c;
 
 float x, y, z;
 
 x = (Location.X - _Clusters[0].CoordX) / GalaxyClusterSize;
 y = (Location.Y - _Clusters[0].CoordY) / GalaxyClusterSize;
 z = (Location.Z - _Clusters[0].CoordZ) / GalaxyClusterSize;
 
 if (abs(x) > 0.25f) {
 if (_Clusters[1].IdX != _Clusters[0].IdX + (abs(x) / x))
 _Clusters[1] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ);
 }
 else {
 //Free Stars in Cluster
 FreeStars(&_Clusters[1]);
 }
 
 if (abs(y) > 0.25f) {
 if (_Clusters[2].IdY != _Clusters[0].IdY + (abs(y) / y))
 _Clusters[2] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
 }
 else {
 FreeStars(&_Clusters[2]);
 }
 
 if (abs(z) > 0.25f) {
 if (_Clusters[3].IdZ != _Clusters[0].IdZ + (abs(z) / z))
 _Clusters[3] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
 }
 else {
 FreeStars(&_Clusters[3]);
 }
 
 //additions
 if (abs(x) > 0.25f && abs(y) > 0.25f) {
 if (_Clusters[4].IdX != _Clusters[0].IdX + (abs(x) / x) &&
 _Clusters[4].IdY != _Clusters[0].IdY + (abs(y) / y))
 _Clusters[4] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
 }
 else {
 FreeStars(&_Clusters[4]);
 }
 
 if (abs(x) > 0.25f && abs(z) > 0.25f) {
 if (_Clusters[5].IdX != _Clusters[0].IdX + (abs(x) / x) &&
 _Clusters[5].IdZ != _Clusters[0].IdZ + (abs(z) / z))
 _Clusters[5] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
 }
 else {
 FreeStars(&_Clusters[5]);
 }
 
 if (abs(y) > 0.25f && abs(z) > 0.25f) {
 if (_Clusters[6].IdZ != _Clusters[0].IdX + (abs(z) / z) &&
 _Clusters[6].IdY != _Clusters[0].IdY + (abs(y) / y))
 _Clusters[6] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
 }
 else {
 FreeStars(&_Clusters[6]);
 }
 
 if (abs(x) > 0.25f && abs(y) > 0.25f && abs(z) > 0.25f) {
 if (_Clusters[7].IdX != _Clusters[0].IdX + (abs(x) / x) &&
 _Clusters[7].IdY != _Clusters[0].IdY + (abs(y) / y) &&
 _Clusters[7].IdZ != _Clusters[0].IdZ + (abs(z) / z))
 _Clusters[7] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
 }
 else {
 FreeStars(&_Clusters[7]);
 }
 
 //swap clusters
 if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[7];
 _Clusters[7] = _c;
 }
 else if (abs(y) > 1.0f && abs(z) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[6];
 _Clusters[6] = _c;
 }
 else if (abs(x) > 1.0f && abs(z) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[5];
 _Clusters[5] = _c;
 }
 else if (abs(x) > 1.0f && abs(y) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[4];
 _Clusters[4] = _c;
 }
 else if (abs(z) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[3];
 _Clusters[3] = _c;
 }
 else if (abs(y) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[2];
 _Clusters[2] = _c;
 }
 else if (abs(x) > 1.0f) {
 _c = _Clusters[0];
 _Clusters[0] = _Clusters[1];
 _Clusters[1] = _c;
 }
 
 X = _Clusters[0].IdX;
 Y = _Clusters[0].IdY;
 Z = _Clusters[0].IdZ;
 
 }
 
 void ALGalaxy::ReceiveBeginPlay()
 {
 _Clusters[0] = GetCluster(0, 0, 0);
 tick = true;
 }
 
 void ALGalaxy::Tick(float DeltaSeconds)
 {
 if (!tick) return;
 
 FVector plPos = GetWorld()->GetFirstPlayerController()->GetPawn()->GetTransform().GetLocation();
 FVector stPos;
 float dist;
 UpdateClustersInLocation(plPos);
 
 for (int32 i = 0; i < 8; i++) {
 for (int32 s = 0; s < _Clusters[i].Star.Num(); s++) {
 stPos = FVector(_Clusters[i].CoordX + _Clusters[i].Star[s].CoordX,
 _Clusters[i].CoordY + _Clusters[i].Star[s].CoordY,
 _Clusters[i].CoordZ + _Clusters[i].Star[s].CoordZ);
 dist = stPos.Dist(plPos, stPos);
 
 if (dist <= GalaxyStarVisibleRange) {
 if (!_Clusters[i].Star[s].spawned) {
 _Clusters[i].Star[s].self = static_cast<ALGalaxyStar*>( GetWorld()->SpawnActor(_Clusters[i].Star[s].Class, &stPos) );
 _Clusters[i].Star[s].spawned = true;
 }
 }
 else {
 if (_Clusters[i].Star[s].spawned) {
 _Clusters[i].Star[s].self->Destroy();
 _Clusters[i].Star[s].spawned = false;
 }
 }
 
 }
 }
 }
 |  |  
 и вроде бы все работает, но если игрок движется по диагонали (в левый верхий угол например) срабатывает вместо if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) - else if (abs(z) > 1.0f), ибо в x и y приходит 0.7f... И фиг его знает почему.
 
 В итоге получается, что центральным становится не тот куб, что надо и весь алгоритм ломается.
 
 А стоп. Вопрос снят. Там не 1.0f а 0.5 f должно быть
  Ибо от центра считается... _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 
 Последний раз редактировалось: ТехноМаг (15:18 09-10-2014), всего редактировалось 2 раз(а)
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | А зачем менять местами? _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | Делаю Процедурный генератор Вселенной. 
 Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.
 
 Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.
 
 PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится
  ) 
 Собственно это выглядит так:
 0 - кластер, где находится игрок
 1 - смежный кластер по оси X (
 2- смежный по Y
 3 - смежный по Z
 4-7 - дополнительные (угловые п всем осям)
 
 А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 
 Последний раз редактировалось: ТехноМаг (19:06 09-10-2014), всего редактировалось 4 раз(а)
 | 
		
		|  | 
    |  | 
	
		| Dimaxx 
  1025 EGP 
       Рейтинг канала: 8(904)
 Репутация: 204
 Сообщения: 5827
 Откуда: Северодвинск
 Зарегистрирован: 26.06.2002
 
    |  | А не проще нагенерить кластеры, которые будут содержать массивы видимых в нем индексов-ссылок на общий массив звезд? Не надо менять местами, не надо отсеивать. А просто грузить из данных нужный кластер. _________________
 "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | 
	  | Dimaxx : |  
	  | А просто грузить из данных нужный кластер. |  Теоретически можно, но накладно для ресурсов. Кластеров у меня 1024/1024  из текстуры + генерация Z по алгоритму для объемности. Звезд в кластере до 2048
 
 Полностью загенерированные кластеры занимают овер 5 Гб, поэтому не комельфо такое кол-во инфы в памяти держать.
 
 Поэтому я таки склоняюсь к реалтайм генерации. В принципе сейчас родилась одна идейка, как код упростить. Завтра, когда с работы вернусь проверю мыслю.
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 
 Последний раз редактировалось: ТехноМаг (22:56 09-10-2014), всего редактировалось 2 раз(а)
 | 
		
		|  | 
    |  | 
	
		| Dimaxx 
  1025 EGP 
       Рейтинг канала: 8(904)
 Репутация: 204
 Сообщения: 5827
 Откуда: Северодвинск
 Зарегистрирован: 26.06.2002
 
    |  | 
	  | ТехноМаг : |  
	  | не комельфо такое кол-во инфы в памяти держать |  А кто сказал - в памяти. Они лежат массивом на диске. Генерятся в момент, допустим, создания новой игры. 1 кластер содержит 2048 звезд. Ссылка (индекс) на главный массив звезд для устрашения примем 64-битной (8 байт) - звезд ведь миллиарды. Итого каждый кластер 2048*8=16384 байта максимум. 16КБайт на массив звезд. К тому же можно генерировать кластеры в момент первого появления там игрока. Значит изначально база кластеров на диске будет состоять из 1 кластера. Ну и постепенно разрастаться по мере продвижения игрока по космосу.
 
 
 
	  | ТехноМаг : |  
	  | + генерация Z по алгоритму для объемности |  В этом месте не понял. Объект имеет 3 координаты в пространстве. У каждой звезды их также 3. Главный массив звезд содержит 3 координаты. Так что объемность уже есть. Плюс нужно обязательно пересчитывать яркость ВСЕХ звезд в зависимости от положения игрока. Если звезда имела звездную величину 4m при расстоянии до нее, к примеру, 12 св. лет, то при расстоянии от игрока в 0,5 св. лет ее яркость будет гораздо выше.
 
 И еще. Не обязательно хранить все кластеры и задавать кластеры. Достаточно определить оптимальную дальность отрисовки кластера. Человеческий глаз различает звезды до 6 зв. величины включительно. Есть плавающий кластер-куб определенного размера. Вот и сделать отбор из базы всех объектов, видимая (с учетом положения игрока) звездная величина которых не превышает 6. Число таких звезд невелико (можно принять до 1 млн.). Значит текущий массив будет не более 8МБайт. Далее рассчитать яркости видимых звезд в этом массиве с учетом положения игрока (он всегда жестко "закреплен" в центре кластера). Кластер перемещается за игроком. В итоге получим отбор видимых объектов и работу по пересчету их параметров локальным массивом относительно главной базы весьма небольшого размера.
 _________________
 "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс
 
 Последний раз редактировалось: Dimaxx (23:22 09-10-2014), всего редактировалось 5 раз(а)
 | 
		
		|  | 
    |  | 
	
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 17.10.2004
 
    |  | 
	  | ТехноМаг : |  
	  | Делаю Процедурный генератор Вселенной. 
 Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.
 
 Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.
 
 PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится
  ) 
 Собственно это выглядит так:
 0 - кластер, где находится игрок
 1 - смежный кластер по оси X (
 2- смежный по Y
 3 - смежный по Z
 4-7 - дополнительные (угловые п всем осям)
 
 А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.
 |  Ты черезчур усложняешь себе жизнь.
 1. Зачем загонять в массив? Используй коллекцию.
 2. Почему 8? Генери 27. Хазерон вспомни.
 _________________
 Люблю свободный полёт... :)
 | 
		
		|  | 
    |  | 
	
		| ТехноМаг 
  360 EGP 
      Рейтинг канала: 2(21)
 Репутация: 93
 Сообщения: 2521
 Откуда: Кронштадт
 Зарегистрирован: 09.04.2007
 
    |  | 
 а вот тут приходит привет от UE4. 27 за раз он не может загенить. Если использовать цикл for для этого, то он упорно считает, что цикл бесконечен и зависает (либо я чего-то не понимаю в его логике). Етодом проб и ошибок нашел максимально допустимое кол-во прогонов - 10. Отсюда и 8 кластеров, собсно.
 
 добавлено спустя 5 минут:
 Как я ранее писал есть мысль как упростить код без массивов и прочей лабуды, используя только индексные индфикаторы кластера (idX, idY и idZ). Через 5 часов буду дома - проверю идею.
 
 добавлено спустя 6 минут:
 А пока это выглядит вот так:
 
 нормально загенеренный кластер:
 
 
 
	| 
 Cкрытый текст   (кликните здесь для просмотра)
 |  
 кластер, загенереный с "поломанным" алгороитмом
 
 
 
	| 
 Cкрытый текст   (кликните здесь для просмотра)
 |  
 добавлено спустя 58 минут:
 
 
	  | Dimaxx : |  
	  | В этом месте не понял |  
 Поясню. Кластер кубически кубичный. И в "центре" галлактике получается натуральный куб, причем с ярко выраженными гранями, ибо звезд дофига (на "поломанном" скрине это очень хорошо видно). Поэтому сверху и снизу я генерю дополнительные кластеры, в которых кол-во звезд уменьшается по експоненте и в итоге получается некое подобие овала (красивее смотрится, да и более реалистично).
 _________________
 (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
 
 Последний раз редактировалось: ТехноМаг (07:25 10-10-2014), всего редактировалось 6 раз(а)
 | 
		
		|  | 
    |  | 
	|  | 
	
		|  | 
    |  | 
	| Железный канал: «C, С++» | 
	
		|  |