Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];

Вниз

Можно ли проверить указатель на корректность?   Найти похожие ветки 

 
SPeller ©   (2010-04-29 04:17) [0]

Есть ли стандартные механизмы проверки некого указателя на корректность? Например, что этот блок памяти выделен текущим менеджером памяти и при обращении к нему не будет AV?


 
Рууки   (2010-04-29 06:03) [1]

type
 PMemoryManager = ^TMemoryManager;
 TMemoryManager = record
   GetMem: function(Size: Integer): Pointer;
   FreeMem: function(P: Pointer): Integer;
   ReallocMem: function(P: Pointer; Size: Integer): Pointer;
 end;

procedure GetMemoryManager(var MemMgr: TMemoryManager);
procedure SetMemoryManager(const MemMgr: TMemoryManager);
function IsMemoryManagerSet: Boolean;


Напиши свои функции работы с памятью, в которых веди список выделенных блоков памяти. Добавь к ним функцию проверки блока на "выделенность". В общем-то, для такого минимального функционала, работы и тестирования на пару часов.


 
SPeller ©   (2010-04-29 06:08) [2]

Надеялся что не надо заводить свою заглушку менеджера памяти :) Я просто не знаком с этой темой совсем, как работает МП не представляю, знаю только что он есть )


 
Рууки   (2010-04-29 06:28) [3]

Посмотреть реализацию менеджера памяти можно во включаемом файле getmem.inc.

Но получить доступ к выделенным блокам памяти можно. Правда, учитывая отсутствие в оригинале определения DEBUG_FUNCTIONS, придется перекопилировать System.pas:

{$IFDEF DEBUG_FUNCTIONS}
{ Inspector Query; implementation in GETMEM.INC; no need to conditionalize that }
 THeapBlock = record
   Start: Pointer;
   Size: Cardinal;
 end;

 THeapBlockArray = array of THeapBlock;
 TObjectArray = array of TObject;

function GetHeapBlocks: THeapBlockArray;
function FindObjects(AClass: TClass; FindDerived: Boolean): TObjectArray;
{ Inspector Query }
{$ENDIF}


 
Anatoly Podgoretsky ©   (2010-04-29 07:33) [4]

> SPeller  (29.04.2010 04:17:00)  [0]

Такого механизма не существует.


 
oxffff ©   (2010-04-29 09:49) [5]

Всегда есть нестандартные механизмы.


 
brother ©   (2010-04-29 09:54) [6]

> [5] oxffff ©   (29.04.10 09:49)
> Всегда есть нестандартные механизмы.


> Есть ли стандартные механизмы

?


 
oxffff ©   (2010-04-29 10:01) [7]


> brother ©   (29.04.10 09:54) [6]
> > [5] oxffff ©   (29.04.10 09:49)
> > Всегда есть нестандартные механизмы.
>
>
> > Есть ли стандартные механизмы
>
> ?


Формально ты прав. А по человечески? :)
Хочешь оставить автора темы без решения?


 
oxffff ©   (2010-04-29 10:04) [8]

Есть например стандартный способ. Написать Pierre le Riche,
чтобы он добавил такую функцию.


 
Плохиш ©   (2010-04-29 10:12) [9]


> SPeller ©   (29.04.10 04:17)
>
> Есть ли стандартные механизмы проверки некого указателя
> на корректность?

А смысл? Типa, у дерьмокодера левая рука не знает, что кодит правая? Или чаво вчера накодил сегодня забыл?


 
brother ©   (2010-04-29 10:16) [10]

> Хочешь оставить автора темы без решения?

так может он и сам может через "велосипед" решить?


 
Anatoly Podgoretsky ©   (2010-04-29 10:26) [11]

А может и без зарплаты останется, нам же подробности неизвестны.


 
Ins ©   (2010-04-29 11:05) [12]

В моем понимании корректный указатель это тот, который указывает на адрес где лежат ожидаемые тобой данные. В противном случае указатель некорректный. Так вот, для выявления таких корректных указателей механизма не то что не существует, его и не может существовать. Отсутствие AV и указание на реально выделенный блок не дает гарантии, что он уже не указывает на что-то другое


 
oxffff ©   (2010-04-29 11:13) [13]


> Ins ©   (29.04.10 11:05) [12]
> В моем понимании корректный указатель это тот, который указывает
> на адрес где лежат ожидаемые тобой данные. В противном случае
> указатель некорректный. Так вот, для выявления таких корректных
> указателей механизма не то что не существует, его и не может
> существовать


Хочешь сказать, что технически нельзя реализовать такой механизм?
А если рассмотреть указатель не как значение,а как некоторую функцию от этого значения?


 
Anatoly Podgoretsky ©   (2010-04-29 12:19) [14]

> Ins  (29.04.2010 11:05:12)  [12]

Не на ожидаемые, а на правильные, а то можно получить ожидаемыt, но не совсем те, поскольку возможна завязка Obj := Create, Free, Create. И даже без второго Create


 
Anatoly Podgoretsky ©   (2010-04-29 12:20) [15]

> oxffff  (29.04.2010 11:13:13)  [13]

Можно, но только для действительного указателя, а для не действительно обычно реализуешь AV и то если повезет, хуже если не повезет.


 
oxffff ©   (2010-04-29 12:37) [16]


> Anatoly Podgoretsky ©   (29.04.10 12:20) [15]
> > oxffff  (29.04.2010 11:13:13)  [13]
>
> Можно, но только для действительного указателя, а для не
> действительно обычно реализуешь AV и то если повезет, хуже
> если не повезет.


Моя мысль глубже, чем вы написали.
В таком подходе указатель представляет не адрес, а билет, по которому происходит доступ. А валидность билета проверяется функцией, которая возвращает ссылку на объект. При уничтожении объекта связанный с ним билет анулируется. При создании объекта на том же месте, билет будет другим. Поэтому проверить валидность можно.
Аналогия сеансовый ключ в windows NT.


 
Anatoly Podgoretsky ©   (2010-04-29 13:04) [17]

> oxffff  (29.04.2010 12:37:16)  [16]

Никто еще не смог придумать надежного механизма определения корректности указателей.


 
oxffff ©   (2010-04-29 14:16) [18]


> Anatoly Podgoretsky ©   (29.04.10 13:04) [17]
> > oxffff  (29.04.2010 12:37:16)  [16]
>
> Никто еще не смог придумать надежного механизма определения
> корректности указателей.


1. Читать умеем? У потребителя билет, по которому доступ осуществляется к объекту кучи.
2. Интересно, а как тогда работает сборщик мусора в управляемой куче. (Память аллокирована пока есть ссылка. Равно как и обратное есть корретная ссылка пока аллокирована память)?


 
Ins ©   (2010-04-29 14:43) [19]


> oxffff ©   (29.04.10 14:16) [18]


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


 
oxffff ©   (2010-04-29 14:52) [20]


> Ins ©   (29.04.10 14:43) [19]
>
> > oxffff ©   (29.04.10 14:16) [18]
>
>
> Предлагаешь автору в своей программе реализовать что-то
> похожее на автоматический уборщик мусора? Ну а я предлагаю
> аккуратно работать с указателями. За всю практику ни разу
> не возникала потребность проверить валидность указателя
> или ссылки. Что я делаю неправильно?


Утверждаешь без IMHO.


> Так вот, для выявления таких корректных указателей механизма
> не то что не существует, его и не может существовать.


 
Ins ©   (2010-04-29 15:00) [21]


> Утверждаешь без IMHO.


)))))))
Довожу до сведения, совершенно ВСЕ сказанное на любом форуме любым рядовым участником является IMHO. И да, от своих слов не отказываюсь.


 
b z   (2010-04-29 16:05) [22]


> рядовым участником
А не рядовым (кстати что это?) уже догма? :)


 
Rouse_ ©   (2010-04-29 16:21) [23]


> Например, что этот блок памяти выделен текущим менеджером
> памяти и при обращении к нему не будет AV?

IsBadReadPtr / IsBadWritePtr устроит? Ну или VirtualQuery()...


 
Ega23 ©   (2010-04-29 17:09) [24]

try..except - чем не проверка?


 
Anatoly Podgoretsky ©   (2010-04-29 20:02) [25]

> Ega23  (29.04.2010 17:09:24)  [24]

Не корректный указатель не обязан приводить к исключению


 
Игорь Шевченко ©   (2010-04-29 21:14) [26]

У венды есть такой способ, HeapValidate+HeapWalk для юзеровских функций и VirtualQuery для системных.


 
Демо ©   (2010-04-30 00:02) [27]


> Anatoly Podgoretsky ©   (29.04.10 12:19) [14]
> > Ins  (29.04.2010 11:05:12)  [12]Не на ожидаемые, а на
> правильные, а то можно получить ожидаемыt, но не совсем
> те, поскольку возможна завязка Obj := Create, Free, Create.
>  И даже без второго Create


Ссылки на экземпляры классов - это не указатели.


> А смысл? Типa, у дерьмокодера левая рука не знает, что кодит
> правая? Или чаво вчера накодил сегодня забыл?


Думаешь, ты всегда помнишь свой дерьмокод?


> SPeller ©   (29.04.10 04:17) 
> Есть ли стандартные механизмы проверки некого указателя
> на корректность? Например, что этот блок памяти выделен
> текущим менеджером памяти и при обращении к нему не будет
> AV?


Если бы возникла необходимость, я бы для интереса реализовал простейший набор функций, которые через стандартные функции выделяли/освобождали память, но при этом вели справочник выделенных блоков памяти.

Неэффективное решение, и работать будет только для явных выделений памяти, но рабочее.


 
Игорь Шевченко ©   (2010-04-30 00:15) [28]


> Ссылки на экземпляры классов - это не указатели.


почему ?


 
Плохиш ©   (2010-04-30 00:35) [29]


> Демо ©   (30.04.10 00:02) [27]

> Ссылки на экземпляры классов - это не указатели.

А что это?

> > А смысл? Типa, у дерьмокодера левая рука не знает, что
> кодит
> > правая? Или чаво вчера накодил сегодня забыл?
>
>
> Думаешь, ты всегда помнишь свой дерьмокод?

За много лет ни разу не потребовалось обсуждаемого сабжа. Что я делаю не так?


 
Демо ©   (2010-04-30 00:39) [30]


>  Что я делаю не так?


Всё.


> Игорь Шевченко ©   (30.04.10 00:15) [28]
> > Ссылки на экземпляры классов - это не указатели.почему
> ?


К указателям применима адресная арифметика, к ссылкам - нет, так как не имеет смысла.


 
Плохиш ©   (2010-04-30 00:44) [31]

Мая рыдалъ...


 
Игорь Шевченко ©   (2010-04-30 00:45) [32]


> К указателям применима адресная арифметика, к ссылкам -
> нет, так как не имеет смысла.


"Покажи нашему человеку со средним образованием, покажи ему твердый шанкр и спроси: "какой это шанкр - твердый или мягкий?" - он обязательно брякнет: "мягкий, конечно"; а покажи ему мягкий - так он и совсем растеряется. А там - нет. Там, может быть, не знают, сколько стоит "зверобой", но уж если шанкр мягкий, так он для каждого будет мягок и твердым его никто не назовет... "

С указателем все то же самое...


 
Демо ©   (2010-04-30 01:14) [33]


> Плохиш ©   (30.04.10 00:44) [31]
> Мая рыдалъ...


Не плачь.


 
Германн ©   (2010-04-30 01:16) [34]


> К указателям применима адресная арифметика, к ссылкам -
> нет

Какая-то жуткая смесь из Си, Паскаля и иже с ними.
Но тут ведь форум ДМ, ne"s pa?
И вопрос автора именно по Дельфи.


 
Демо ©   (2010-04-30 01:45) [35]


> И вопрос автора именно по Дельфи.


Задайся вопросом, может ли ссылка быть указателем на произвольный кусок памяти? А указатель?
Можно ли указатель на PChar увеличить на единицу? А ссылку на объект?


 
Германн ©   (2010-04-30 01:54) [36]


> Задайся вопросом, может ли ссылка быть указателем на произвольный
> кусок памяти?

А где в сабже упомянут термин "ссылка"?
А у отвечающих на форуме ДМ нет принципиальной разницы между ссылкой и указателем. Бо ни о какой "адресной арифметике" они знать не хотят.


 
Демо ©   (2010-04-30 09:08) [37]


> Германн ©   (30.04.10 01:54) [36]
>
> > Задайся вопросом, может ли ссылка быть указателем на произвольный
>
> > кусок памяти?
>
> А где в сабже упомянут термин "ссылка"?
> А у отвечающих на форуме ДМ нет принципиальной разницы между
> ссылкой и указателем. Бо ни о какой "адресной арифметике"
> они знать не хотят.


Вот именно!
Про ссылки вопроса не было-)

Некий указатель - расплывчато достаточно.


 
Игорь Шевченко ©   (2010-04-30 11:12) [38]

Демо ©   (30.04.10 01:45) [35]

Займись на досуге увеличением на единицу переменной типа Pointer
И скажи, что такое ссылка в терминах Object pascal


 
Демо ©   (2010-04-30 13:26) [39]


> Займись на досуге увеличением на единицу переменной типа
> Pointer


А в чём проблема?


> И скажи, что такое ссылка в терминах Object pascal


Лень самому напрягаться...

http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html

Ссылки (References)
Многие типы в Delphi фактически являются указателями, но притворяются простыми типами. Я называю такие типы ссылочными. Примерами таких типов являются динамические массивы, строки, объекты и интерфейсы. Все они являются указателями "под капотом" языка, но с некоторой дополнительной семантикой и часто со скрытым содержанием.

Динамические массивы (dynamic arrays)
Многомерные динамические массивы
Строки (Strings)
Объекты (Objects)
Интерфейсы (Interfaces)
Ссылочные параметры
Нетипизированные параметры
Что отличает ссылки (references) от указателей (pointers):

Ссылки неизменяемы. Вы не можете увеличить или уменьшить ссылку. Ссылки указывают на определённые структуры, но никогда не указывают в середину них, как, например, указатели на данные массива в примерах выше.
Ссылки не используют синтаксис указателей. Это скрывает тот факт, что они являются указателями, и делает их сложнее для понимания для тех, кто не знаком с этой темой (и поэтому люди делают с ними вещи, которых делать нельзя).
Не путайте такие ссылки со ссылочными типами (reference types) в C++. Они во многом отличаются.


 
Игорь Шевченко ©   (2010-04-30 15:52) [40]

Демо ©   (30.04.10 13:26) [39]


> http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html


Gunsmoker - это не object pascal language guide.


> > Займись на досуге увеличением на единицу переменной типа
>
> > Pointer
>
>
> А в чём проблема?



> К указателям применима адресная арифметика


У тебя тип Pointer поддерживает арифметику ?
или это тоже не указатель ?


 
Демо ©   (2010-04-30 16:20) [41]


> Игорь Шевченко ©   (30.04.10 15:52) [40]
> Демо ©   (30.04.10 13:26) [39]

> Gunsmoker - это не object pascal language guide.


Ну я и не говорил, что по нему нужно Delphi изучать.

По поводу остального позже напишу...


 
SPeller ©   (2010-05-04 02:02) [42]

Почему мне это нужно. Указатель передаю через параметр оконного сообщения (внутри процесса, ессно) в сообщении WM_USER + N, который указывает на структуру с данными (маршалинг). Программа моя в виде длл может загружаться в произвольное приложение. Окно создается моей дллкой в основном гуишном потоке. Так вот, нет абсолютно никакой гарантии, что чужое приложение не пошлет окну сообщение с таким же номером, и что оно передаст в wParam тоже неизвестно. Ситуэйшин редкий, согласен, но зачем испытывать судьбу. И вот тут, чтобы не было ненужных ошибок в будущем, я и хотел вставить проверочку на то, что указатель - это указатель на память и оттуда можно хотябы читать. Поскольку структуры, которые я передаю, используются для маршалинга ком вызовов, то тут алгоритмы, снижающие быстродействие, применять нежелательно.

Наверное, нужно заводить какой-то быстрый список указателей на выделенные блоки, по которому и бегать при проверке.


 
Германн ©   (2010-05-04 02:10) [43]


> Так вот, нет абсолютно никакой гарантии, что чужое приложение
> не пошлет окну сообщение с таким же номером

Хм. Ты уверен?


 
SPeller ©   (2010-05-04 06:36) [44]

Кто запрещает приложению слать сообщения WM_USER?


 
Leonid Troyanovsky ©   (2010-05-04 07:31) [45]


> SPeller ©   (04.05.10 02:02) [42]

> Почему мне это нужно. Указатель передаю через параметр оконного
> сообщения (внутри процесса, ессно) в сообщении WM_USER +

RegisterWindowMessage?

> Наверное, нужно заводить какой-то быстрый список указателей

IMHO, выделить массив блоков потребного размера,
и использовать TBits для индексов свободных блоков.

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-05-04 12:30) [46]

SPeller ©   (04.05.10 02:02) [42]

А зачем гланды вырезать через непредназначенное для этого отверстие ?


 
SPeller ©   (2010-05-05 02:46) [47]


> Leonid Troyanovsky ©   (04.05.10 07:31) [45]
> RegisterWindowMessage?

Мсдн не рекомендует:
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF


> IMHO, выделить массив блоков потребного размера,
> и использовать TBits для индексов свободных блоков.

Спасибо, подумаю над этим.

Off:

> Игорь Шевченко ©   (04.05.10 12:30) [46]
> А зачем гланды вырезать через непредназначенное для этого
> отверстие ?

Игорь, у меня иммунитет к вашему снобизму. Есть что сказать по делу - говорите, нет - молчите. "Умные" советы вобщем и ни о чем одновременно мне не нужны.


 
Leonid Troyanovsky ©   (2010-05-05 08:12) [48]


> SPeller ©   (05.05.10 02:46) [47]

> must process the same message. For sending private messages
> within a window class, an application can use any integer

Дык, оно ж не приватное, бо приложение - чужое, и только
его создателю известно как оно на него среагирует.

Для гарантии нужно гарантированно уникальное (на уровне
сессии) сообщение, т.е., RWM.

> Off:

Во-ще-то, в COM есть еще всякие IMalloc.

--
Regards, LVT.


 
С любовью, твой дядя Исаак   (2010-05-05 08:33) [49]

Удалено модератором


 
Чилли-Всучилли   (2010-05-05 08:45) [50]

Указатель передаю через параметр оконного сообщения...Так вот, нет абсолютно никакой гарантии, что чужое приложение не пошлет окну сообщение с таким же номером, и что оно передаст в wParam тоже неизвестно. Ситуэйшин редкий, согласен, но зачем испытывать судьбу.

GlobalAlloc() / GlobalLock() / GlobalUnlock() / GlobalFree()
LocalAlloc() / LocalLock() / LocalUnlock() / LocalFree()

ОС сама будет следить за корректностью хендлов. При попытке залочить некорректный хендл памяти - вернет nil. Вот и вся проверка.


 
SPeller ©   (2010-05-05 08:56) [51]


> в COM есть еще всякие IMalloc

У меня свой ком :) IMalloc... тоже вариант. Кто будет лучше - IMalloc или своё на TBits? Или без разницы, только IMalloc уже готовый?

С RWM я подумаю. Сейчас использую диапазон сообщений, который отфильтровываю из очереди. RWM не гарантирует что возвращенные номера сообщений будут подряд. Поэтому, скорее всего, придется в одно сообщение всё засунуть. Наверное так и сделаю.


 
SPeller ©   (2010-05-05 09:00) [52]


> Чилли-Всучилли   (05.05.10 08:45) [50]
> GlobalAlloc() / GlobalLock() / GlobalUnlock() / GlobalFree()
> LocalAlloc() / LocalLock() / LocalUnlock() / LocalFree()
>
> ОС сама будет следить за корректностью хендлов. При попытке
> залочить некорректный хендл памяти - вернет nil. Вот и вся
> проверка.

Что-то msdn сходу пугает: The global functions are slower than other memory management functions. А мне замедлять не нуно :) Наоборот быстродействие здесь критично.


 
Leonid Troyanovsky ©   (2010-05-05 09:08) [53]


> SPeller ©   (05.05.10 08:56) [51]

> - IMalloc или своё на TBits?

Если размер блока будет удачный, то заранее распределенный массив
будет, IMHO, быстрее, бо не нужны многочисленные alloc-free.

Ну, это все при условии, что можно разово распределить
подходящий по размеру фрагмент.

--
Regards, LVT.


 
Чилли-Всучилли   (2010-05-05 09:14) [54]

are slower than other memory management function

Чем другие функции управления памятью. Некоторое замедление связано с тем, что работа ведется через хендлы ОС, а не через указатели, то есть, ОС должна заносить хендлы во внутренние списки и, при необходимости (xxxLock, xxxFree), проверять наличие хендлов в списках, переводить их в вид простых указателей, при необходимости отображая в нужные участки памяти процессов в случае GlobalXxx, а в случае LocalXxx и этого делать не надо. То есть, на деле, задержки хоть и есть, но весьма небольшие. Тем более, что все это уже даным-давно максимально оптимизировано разработчиками ОС.

То есть, на самом деле это и есть "какой-то быстрый список указателей на выделенные блоки, по которому и бегать при проверке" (С) [42], только реализованный на уровне ОС.


 
Leonid Troyanovsky ©   (2010-05-05 09:48) [55]


> Чилли-Всучилли   (05.05.10 09:14) [54]

>  при необходимости отображая в нужные участки памяти процессов
> в случае GlobalXxx,

Оно ничего не отображает, Global - это дань 16 битному прошлому.

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-05-05 10:45) [56]

SPeller ©   (05.05.10 02:46) [47]


> Есть что сказать по делу - говорите, нет - молчите


Не могу молчать, у меня вызывают живой и неподдельный интерес потомки Ивана Кулибина, изобретающие очередной пятиколесный велосипед. Хочешь, чтобы молчал - не пиши.


 
brother ©   (2010-05-05 12:37) [57]

> Не могу молчать,

ну, свобода слова)


 
SPeller ©   (2010-05-05 14:42) [58]


> Leonid Troyanovsky ©   (05.05.10 09:08) [53]
> Если размер блока будет удачный, то заранее распределенный
> массив
> будет, IMHO, быстрее, бо не нужны многочисленные alloc-free.
> Ну, это все при условии, что можно разово распределить
> подходящий по размеру фрагмент.

Скорее всего не выйдет. Всегда будет вероятность превышения размера. Заранее неизвестно сколько объектов будет работать и сколько вызовов будет одновременно производиться.

off:

> Игорь Шевченко ©   (05.05.10 10:45) [56]
> Не могу молчать, у меня вызывают живой и неподдельный интерес
> потомки Ивана Кулибина, изобретающие очередной пятиколесный
> велосипед. Хочешь, чтобы молчал - не пиши.

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



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.006 c
15-1310848190
Юрий
2011-07-17 00:29
2011.11.13
С днем рождения ! 17 июля 2011 воскресенье


15-1310504388
Gu
2011-07-13 00:59
2011.11.13
Delphi Pulsar и Xe2 beta


15-1310625725
oxffff
2011-07-14 10:42
2011.11.13
Пятница. Савеловский. Общение


15-1310660066
R_R
2011-07-14 20:14
2011.11.13
Услуга VPS windows


15-1310718132
lesstab
2011-07-15 12:22
2011.11.13
Вопрос опытным программистам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский