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

Вниз

Как в С++ правильно работать с функциями?!   Найти похожие ветки 

 
Konstantin555 ©   (2006-09-06 00:05) [0]

Пишу так:


#include <iostream>
#include <string>
using namespace std;

int main()
{
extern void swap(int*,int*);

void swap(int* p, int* q)
{
 int t=*p;
 *p=*q;
 *q=t;
}

cout<<swap(1,4);

string name;

cout<<"Please enter you name:\n";
getline(cin,name);
cout<<"Hello, "<<name<<"!\n";
return 0;
}


В результате ошибки:
error C2601: "swap" : local function definitions are illegal
error C2664: "swap" : cannot convert parameter 1 from "const int" to "int *"
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

КАК ИСПРАВИТЬ?!


 
DiamondShark ©   (2006-09-06 00:11) [1]


> КАК ИСПРАВИТЬ?!

Перенести за пределы main
Ну нету в Ц вложенных ф-ций. Нету.
(плохой язык)


 
Cyrax ©   (2006-09-06 00:24) [2]

А extern можешь убрать - он подразумевается по умолчанию...
Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...

DiamondShark ©   (06.09.06 00:11) [1]
(плохой язык)

Ты о русском или C++ ?


 
guav ©   (2006-09-06 00:25) [3]

> cout<<swap(1,4);

Это что ?
Литеральные константы не указатели (кроме 0).
И вообще не lvalue чтобы получать на их ссылку и менять их местами.
и swap возвращает void, что должно пойти на cout ?


> [1] DiamondShark ©   (06.09.06 00:11)


> (плохой язык)

ага...


 
Cyrax ©   (2006-09-06 00:29) [4]

Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...

...если етот implement красуется до main"a...


 
Аноним2000   (2006-09-06 00:59) [5]

2Konstantin555
вот ентот фрагмент

> extern void swap(int*,int*);
>
> void swap(int* p, int* q)
> {
>  int t=*p;
>  *p=*q;
>  *q=t;
> }
>
> cout<<swap(1,4);

бред редкостный. просто удали его и все заработает


 
Cyrax ©   (2006-09-06 01:19) [6]

guav ©   (06.09.06 00:25) [3]
> cout<<swap(1,4);
Это что ?
Литеральные константы не указатели (кроме 0).

1. Не литерные константы, а целые константы...
2. 0 это никакой не указатель - см. п.1

И вообще не lvalue чтобы получать на их ссылку и менять их местами.

Не ссылку, а указатель (см. функцию)...

и swap возвращает void, что должно пойти на cout ?

Ничего. Выйдет ошибка...

>> (плохой язык)
> ага...
Всё-таки о русском...


 
Джо ©   (2006-09-06 01:19) [7]

> [6] Cyrax ©   (06.09.06 01:19)
> >> (плохой язык)
> > ага...
> Всё-таки о русском...

О говяжьем.


 
guav ©   (2006-09-06 01:31) [8]


> [6] Cyrax ©   (06.09.06 01:19)


> 1. Не литерные константы, а целые константы...

Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.
http://msdn2.microsoft.com/en-us/library/c70dax92.aspx


> 2. 0 это никакой не указатель - см. п.1

0 это типа nil, пустой указатель. функция с таким объявлением может принять в качестве параметров (0, 0) (хотя данная функция и приведёт к AV при выполнении)


> Не ссылку, а указатель (см. функцию)...

ну да, ошибся... привык что это синонимы.


> Ничего. Выйдет ошибка...

так и я о том же.


> >> (плохой язык)
> > ага...
> Всё-таки о русском...

кто о чём, но я о С++, в часности о http://delphimaster.net/view/15-1157465777/


 
vidiv ©   (2006-09-06 02:21) [9]

Объясните, пожалуйста, смысл этой строки???

> cout<<"Please enter you name:\n";

А точнее символов <<


 
Cyrax ©   (2006-09-06 09:12) [10]

Всё, дальше идём в духе :)

guav ©   (06.09.06 01:31) [8]
>> 1. Не литерные константы, а целые константы...
>Литералы это и есть константы

Тогда получается тавтология:
литерная константа = литерный литерал (или константная константа)...

> Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.

Настораживает "The terms "literal" and "constant" are used interchangeably here"
В более строгом понимании константа может быть представлена, например, символьным или числовым литералом. В примере в конечном счёте используется анонимная константа...

0 это типа nil, пустой указатель

1. nil - это в pascal"е, а в C - null.
2. 0 имеет тип int. Но с помощью стандартных преобразований приводится к типу указателя.

кто о чём, но я о С++...
Сожалею... :)


...в часности о http://delphimaster.net/view/15-1157465777/

А что там такого, если не секрет ?

> vidiv ©   (06.09.06 02:21) [9]
> Объясните, пожалуйста, смысл этой строки???
>> cout<<"Please enter you name:\n";
>А точнее символов <<

Это оператор вывода в поток.


 
Cyrax ©   (2006-09-06 11:55) [11]

Хочу сделать вот такое замечание.
В паскале то, что называют указателем, является на самом деле (по реализации) не чем иным, как сцылкой...


 
DiamondShark ©   (2006-09-06 12:06) [12]


> >А точнее символов <<
>
> Это оператор вывода в поток.

Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.


 
DiamondShark ©   (2006-09-06 12:08) [13]


> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...

Всё с точностью до наоборот. УМЧ.


 
evvcom ©   (2006-09-06 12:13) [14]

> [11] Cyrax ©   (06.09.06 11:55)
> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...

А в чем разница? И пишется вообще-то так: "ссылка".


 
DiamondShark ©   (2006-09-06 12:18) [15]


> А в чем разница?

Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.


 
Cyrax ©   (2006-09-06 12:46) [16]

DiamondShark ©   (06.09.06 12:06) [12]
Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.

Да, но в контексте программы это всё-таки оператор потокового вывода...
Вспомним вопрос vidiv: "Объясните смысл строки..., а точнее символов <<"...

Всё с точностью до наоборот. УМЧ.

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

Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.

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


 
guav ©   (2006-09-06 12:52) [17]

> хотелось бы увидеть фрагмент кода на паскале, где этот указатель
> меняет своё значение путём, скажем, инкременирования...

пжалста
var
 I: Integer;
 P: ^Integer;
begin
 P := @I;
 ShowMessageFmt("P points at %P", [P]);

 Inc(P);
 ShowMessageFmt("P points at %P", [P]);
end;



> ...в часности о http://delphimaster.net/view/15-1157465777/
>
> А что там такого, если не секрет ?

Мой вопрос про сишную обработку исключений.


 
default ©   (2006-09-06 12:59) [18]

штука в том, что указатель это путь к анархии в доступе к памяти:)
его значение можно менять получая доступ к памяти, возможно, непринадлежащей объекту на который исходной указывал указатель
ссылка такого не допускает, ссылка это нечто дающее возможность работать с самим объектом, а не его копией(вольное и не полное определение)
поэтому в managed коде указателей нет, есть ссылки их в большинстве случае заменяющие


 
Alkid ©   (2006-09-06 13:33) [19]


> штука в том, что указатель это путь к анархии в доступе
> к памяти:)
> его значение можно менять получая доступ к памяти, возможно,
>  непринадлежащей объекту на который исходной указывал указатель
> ссылка такого не допускает, ссылка это нечто дающее возможность
> работать с самим объектом, а не его копией(вольное и не
> полное определение)
> поэтому в managed коде указателей нет, есть ссылки их в
> большинстве случае заменяющие

Не совсем верно, в .NET-managed code они могут быть в unsafe-коде (C# позволяет такой делать). В его рамках и указатели есть и их арифметика и возможность нетипобезопасных приведений указателей друг к другу. В Java их и правда нет. Собственно спор "ссылки vs. указатели" - это спор обобщённости и эффективности. В каждой задаче есть своя специфика и есть свои средства решения. Где-то и на асме надо писать, где у тебя нет никаких обобщений, сплошная "машинная специфика".


 
default ©   (2006-09-06 13:37) [20]

Alkid ©   (06.09.06 13:33) [19]
unsafe код это неуправляемый, CLR закрывает на него глаза
если таковой встретится в среде недоверяющей небезопасному коду, то такой код вообще исполнен не будет


 
default ©   (2006-09-06 13:46) [21]

+[20]
пардон, я по запарке попутал управляемость с безопасностью
в безопасном коде нет указателей, а не в управляемом


 
default ©   (2006-09-06 13:47) [22]

"CLR закрывает на него глаза"
в смысле, что этот код не проходит верификацию


 
default ©   (2006-09-06 13:51) [23]

Alkid ©   (06.09.06 13:33) [19]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа, приведение к размерному типу создаёт копию
в MC++ это можно...
есть один выход - интерфейсы, но это не очень удобное
я было в один подумал, что такое возможно в unsafe коде, но хрен...:(


 
Alkid ©   (2006-09-06 14:03) [24]

Упакованного - это про boxing/unboxing?


 
default ©   (2006-09-06 14:50) [25]

Alkid ©   (06.09.06 14:03) [24]
ага


 
Alkid ©   (2006-09-06 14:52) [26]

А ты вообще по каким критериям решаешь, чему у тебя быть размерным типом, а чему - ссылочным?


 
default ©   (2006-09-06 15:02) [27]

Alkid ©   (06.09.06 14:52) [26]
а причём здесь это?
а критерии в мсдн-е есть когда стоит применять структуры вместо классов если ты об этом


 
Cyrax ©   (2006-09-06 19:49) [28]

Тьфу, блин. Запутался я с этими ссылками и указателями.
Но... если подумать... Есть в паскале и ссылки, и указатели (и это разные вещи !!!). Ссылки используются только для передачи параметров в функцию/процедуру (передача по ссылке). Т.е. ссылки в программе нельзя объявлять и использовать в отличие от указателей. А вот указатели в паскале - обычное дело.

guav ©   (06.09.06 12:52) [17]
var
I: Integer;
P: ^Integer;
begin
P := @I;
ShowMessageFmt("P points at %P", [P]);
Inc(P);
ShowMessageFmt("P points at %P", [P]);
end;

Это что - фокус?  Хорошо... твоя взяла... :)

Мой вопрос про сишную обработку исключений.

Тебе нужна помощь или ты хочешь показать на примере исключений преимущества С... ?


default ©   (06.09.06 13:51) [23]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа...

Размерный - я так понимаю значимый (value). Т.е. хочешь сказать, что, допустим, если целое упакованное взять как объект, то не сможешь получить его значение (не распаковывая)... Правильно я тебя понял ?

приведение к размерному типу создаёт копию

Объект что - остаётся в куче ?

___________________________
А вообще, в C# много всяких ограничений и наворотов по сравнению с C++. Многие навороты в конце концов загромождают код и даже пересекаются друг с другом (частично дублируют свои функции), что не есть хорошо...
А вот по поводу ограничений, в частности отсутствие указателей (в безопасном коде) и шаблонов, - то это сильно урезает гибкость (часто и эффективность) средств разработки, доступных программисту.


 
guav ©   (2006-09-06 20:28) [29]

> Тебе нужна помощь

Мне уже вроде ответили, но если есть что добавить, давай.


> ты хочешь показать на примере исключений преимущества С...
> ?

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


 
default ©   (2006-09-06 20:35) [30]

Cyrax ©   (06.09.06 19:49) [28]

> Размерный - я так понимаю значимый (value). Т.е. хочешь
> сказать, что, допустим, если целое упакованное взять как
> объект, то не сможешь получить его значение (не распаковывая).
> .. Правильно я тебя понял ?
 
ну распаковка по-любому нужна
распаковка собственно нужна, то есть без создания копии
есть соответствующая команда IL для этого

StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22

в MC++ такую проблему можно избежать
но подобные манипуляции редко, думаю, используются так что можно сильно не переживать по этому поводу:)

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


 
default ©   (2006-09-06 20:37) [31]

последний абзац не читать:) забыл выкинуть


 
Cyrax ©   (2006-09-06 20:47) [32]

guav ©   (06.09.06 20:28) [29]
Думаю речь о преимуществах С++, а не о преимуществах С

Я имел ввиду семейство языков C, ну за искл., чистого С...

Так вот, про преимущества обработки исключений в С++...

В общем, сначала гляну http://msdn2.microsoft.com/en-us/library/c70dax92.aspx... Но не щас... Запарился я на форуме - не спишь, не ешь. Так и зачахнуть можно...

P.S. Всё будет !!! ...


 
evvcom ©   (2006-09-07 10:09) [33]

> [15] DiamondShark ©   (06.09.06 12:18)
> Ссылка -- абстрактное понятие.
> Указатель -- машинно-зависимое.

Любая реализация языка программирования написана для реальной машины/платформы, пусть даже виртуальной. Т.е. получается, что пока речь идет о теории и каких-то абстрактных языках, то оперируем термином "ссылка", как только начинаем говорить о реальном языке, то говорим "указатель"?

> [28] Cyrax ©   (06.09.06 19:49)
> Есть в паскале и ссылки, и указатели (и это разные вещи
> !!!). Ссылки используются только для передачи параметров
> в функцию/процедуру (передача по ссылке). Т.е. ссылки в
> программе нельзя объявлять и использовать в отличие от указателей.
> А вот указатели в паскале - обычное дело.

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


 
Alkid ©   (2006-09-07 10:44) [34]


> А вообще, в C# много всяких ограничений и наворотов по сравнению
> с C++. Многие навороты в конце концов загромождают код и
> даже пересекаются друг с другом (частично дублируют свои
> функции), что не есть хорошо...
  Хм. А какие навороты там друг с другом пересекаются?

> А вот по поводу ограничений, в частности отсутствие указателей
> (в безопасном коде) и шаблонов, - то это сильно урезает
> гибкость (часто и эффективность) средств разработки, доступных
> программисту.

Зато уменьшает количество возможностей отстрелить себе ногу. Огромные возможности - это всегда сила и слабость. Сила - потому что позволяет делать разные вещи быстро, красиво и эффективно. Слабость - потому что при неправльном приминении так же быстро и эффективно превращает программу в свалку мусора и глюков.  Взять С++ - множественное наследование. Вещь, безусловно, очень толковая, но при неумелом использовании можно себя загнать в угол. Указатели - быстро, эффективно, но черевато. И так далее.
Ссылки в этом смысле проще и безопаснее. Да, с их помощью ты не сможешь записать произвольный байт по произвольному адресу, но это обычно и не надо. Если пишешь просто ОО-приложеие без хакерства, то ссылок более чем достаточно.


 
Alkid ©   (2006-09-07 10:47) [35]


> Любая реализация языка программирования написана для реальной
> машины/платформы, пусть даже виртуальной. Т.е. получается,
>  что пока речь идет о теории и каких-то абстрактных языках,
>  то оперируем термином "ссылка", как только начинаем говорить
> о реальном языке, то говорим "указатель"?

Не совсем. А что если в какой-либо реализации .NET или Java ссылка - это
не указатель, а, например, индекс в таблице объектов? То есть реализация абстракции "ссылка" - это далеко не всегда обязательно указатель.


 
evvcom ©   (2006-09-07 10:50) [36]

> [35] Alkid ©   (07.09.06 10:47)

Вот с этим согласен.


 
Cyrax ©   (2006-09-07 11:21) [37]

> default ©   (06.09.06 20:35) [30]
StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22


А o.intfield не получится ?  Ведь при упаковке создаётся объект и у етого объекта должно быть поле с числом 7...

Здесь в [object o = st] st упаковывается в кучу, а o начинает ссылаться на st (в куче) (пока имеем 7). (StructType) o распаковывает o в стек, меняем на 22 (7 уже не должно быть). Короче жуть получается.
Выходит, при упаковке/распаковке происходит не перемещение, а копирование. Это же УЖАС !!! Нарушается целостность данных !!!
Кто нибудь может вразумительно объяснить ?

И вообще, что в C# является значением ссылки (например, object o) - адрес объекта в куче ? Если так, то чем это не указатель ?

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


не распаковывая, естественно, я не получу допуступ ко всей функциональности размерного типа

Имеется ввиду доступ к полю intfield в примере ?
(кстати, не читать - это значит неправильно ?)

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

Я другого мнения. Возьмём, к примеру С++ - там и указатели, и ссылки...

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

Например, в С++ предача по указателю и по ссылке - разные вещи. Да и в паскале есть и передача по указателю, и по ссылке...
Так что, ИМХО, разное всё это...

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

Чушь. Однозначно.
Значением ссылки являются данные, а указателя - адрес данных...


 
Alkid ©   (2006-09-07 11:26) [38]


> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?

А это принципиально неизвестно. Может быть указатель, может быть не указатель, программе на C# это должно быть фиолетово. И вообще, значение ссылки - это объект.

> Я другого мнения. Возьмём, к примеру С++ - там и указатели,
>  и ссылки...

Сдаётся мне, что reference в C++ и reference в Java/C# - это слишком разные вещи, что бы бросать их в одну кучу. Взять хотя бы то, что в C++ ссылки указывают всё время своей жизни на одно и то же, а в Java/C# могут менять объект, на котороый указывают и могут указывать на null.


 
evvcom ©   (2006-09-07 12:30) [39]

> [37] Cyrax ©   (07.09.06 11:21)
> Да и в паскале есть и передача по указателю, и по ссылке...
> Так что, ИМХО, разное всё это...

А... ну да... Поднялся на небеса (в смысле с низкого уровня программирования :) ) и стал понятен смысл того, о чем ты. :)

> Чушь. Однозначно.
> Значением ссылки являются данные, а указателя - адрес данных...

Да, да. Неверно выразился. Я в конструкции proc(var value) в паскале конечно же вижу данные по ссылке, но также четко представляю, что в процедуру (смотрим асм) передается на самом деле указатель. А уже интерпретация этого value (адрес или данные) лежит на совести шамана-компилятора. :)


 
default ©   (2006-09-07 13:16) [40]

Cyrax ©   (07.09.06 11:21) [37]
> А o.intfield не получится ?

да, не получится

> Ведь при упаковке создаётся объект и у етого объекта должно
> быть поле с числом 7...

да, но оно не доступно без распаковки(ты пойми, что в переменной типа object может храниться ссылка на экземпляр абсолютно любого типа, о каком o.intfield может идти речь?)


> Выходит, при упаковке/распаковке происходит не перемещение,
>  а копирование. Это же УЖАС !!! Нарушается целостность данных
> !!!
> Кто нибудь может вразумительно объяснить ?

ничего не нарушается, всё нормально, разве что код выдаёт несколько неестественный по виду кода результат

вот что я думаю
когда мы работаем с размерными типами изменение какого-либо экземпляра размерного типа не сказываются на чём-либо другом, это для нас понятно и естественно
не удивляемся же мы коду
int x = 5;
int y = x;
y = 7; // x = 5!
предположим такое
StructType st; // выделение в стеке памяти под переменную
st.intfield = 7;  // инициализация перед использованием переменной
object o = st;  // boxing
StructType v = (StructType) o; // предположим здесь не
//создаётся копия в стеке, а имеем доступ
// через переменную v  к запакованному размерному типу ссылка
// на который хранится в переменной o
v.intfield = 22; // вносим изменения, здесь нарушение единообразия
//происходит, изменение размерного экз-ра типа сказывается на  
//упакованном экз-ре размерном типе
Console.WriteLine(((StructType) o).intfield); // выведется 22

поэтому то, что в C# unboxing всегда действует в купе с копированием, для меня разумно, единообразие штука необычайно полезная


> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?

уже объяснил Alkid
> Имеется ввиду доступ к полю intfield в примере ?
> (кстати, не читать - это значит неправильно ?)

да
правильно, только я подумал лучше на примере показать о чем речь, а то забыл из поста убрать



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

Форум: "Прочее";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.053 c
15-1158611953
Евгений Р.
2006-09-19 00:39
2006.10.08
Позиционирование в RichEdit


3-1154774759
wild_arg
2006-08-05 14:45
2006.10.08
Access, ADO, Delphi и шифрация


15-1158229400
VitV
2006-09-14 14:23
2006.10.08
Книги Кэнту


15-1158643456
шаааа
2006-09-19 09:24
2006.10.08
Что такое u08 в с++?


3-1155033655
DelphiLexx
2006-08-08 14:40
2006.10.08
Как в DBGrid e подсвечивать конец линии сетки определенной записи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский