рдЗрд╕ рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛
habrahabr.ru/post/131212 рд╣реИ , рдЬрд╣рд╛рдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ "рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ", рд▓реЗрдХрд┐рди рд╡реЗ рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдХрд┐ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ C ++ рдЕрдкрд╡рд╛рдж" рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛ C рдпрд╛ C ++ рд╣реИ рд╣рдорд╛рд░реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ (рдпрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдореНрдмреЗрдбреЗрдб рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрдо рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреАрди semaphores, рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдХрдИ рдлрд┐рд▓реНрдЯрд░ (рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЬреЛ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЖрдЧреЗ рдХрд░реЗрдВрдЧреЗред рддреЛ:
// boolean subsystem_init(subsystem* self) { // boolean ok = true; ok = ok && sema_create(&self->sema1, 0); ok = ok && sema_create(&self->sema2, 0); ok = ok && sema_create(&self->sema3, 1); // ok = ok && ((self->buffer1 = malloc(self->buff_size1)) != NULL); ok = ok && ((self->buffer2 = malloc(self->buff_size2)) != NULL); // ok = ok && filter1_init(&self->f1, &self->x, &self->y, self->buffer1); ok = ok && filter2_init(&self->f2, &self->level, self->buffer2); return ok; }
рдпрд╣ рдХреЛрдб рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЗрд╕рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЗрд╕рдХрд╛ рддрд░реНрдХ рд░реИрдЦрд┐рдХ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ (рд╕реНрдкрд╖реНрдЯ) рдирд╣реАрдВ рд╣реИ
рдпрджрд┐ , рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗрд╡рд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдиреБрдХреНрд░рдо рд▓рд┐рдЦрддрд╛ рд╣реИред рдЙрд╕реА рдорд╣рддреНрд╡ рдХрд╛ рдПрдХ рдФрд░ рдЧреБрдг рдпрд╣ рд╣реИ рдХрд┐
рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдкрд╕ рдореЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдКрдкрд░реА рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рд╣рдо рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
buffer2
рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛), рддреЛ рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдХреНрддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ (рдпрд╛рдиреА рдЙрд╕ рдкрд░ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдорд╛рдиреНрдп рдкреЙрдЗрдВрдЯрд░ рдлрд┐рд╕рд▓рдиреЗ рд╕реЗ
filter2
рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░
subsystem_init
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реИ - рд╡рд┐рдЪрд╛рд░ рд╣реА рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ), рдХреЛрдИ рдореБрд╢реНрдХрд┐рд▓ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ,
malloc
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗ, рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдордиреЗ рдЗрд╕ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛
рдХрд┐ рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐
рдХрд╣рд╛рдБ рд╣реБрдИ - рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ рдпрд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдУрдПрд╕ рд╕реЗрдореАрдлрд╛рдЗрд░ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рдорд╕реНрдпрд╛ рд░реЗрдЦрд╛ рдХреА рд╕рд╣реА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирд╡ рдХреЙрд▓ рд╕реНрдЯреИрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИрдВ рдЬреЛ рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ)ред
рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ:
typedef struct err_info { int count; int32_t stack[MAX_STACK];
рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдЬреЛрдбрд╝реЗрдВ (рдпрджрд┐ рдЕрднреА рднреА рдЬрдЧрд╣ рд╣реИ),
false
рд▓реМрдЯ рдХрд░ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред
рдЕрдзрд┐рд╡реЗрд╢рди рдХреЗ рджреНрд╡рд╛рд░рд╛, рд╕рднреА рдХрд╛рд░реНрдп рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдорд╛рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдИ ) рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рддрд░реНрдХ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╣реА рд╣реИ, рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рддрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
// boolean subsystem_init(subsystem* self, err_info* e) { // REQ(sema_create(&self->sema1, 0), 0x157DF5F3); REQ(sema_create(&self->sema2, 0), 0x601414A4); REQ(sema_create(&self->sema3, 1), 0x7D8E585D); // REQ(self->buffer1 = malloc(self->buff_size1), 0x5DEB6FC7); REQ(self->buffer2 = malloc(self->buff_size2), 0x7939EDC5); // REQ(filter1_init(&self->f1, &self->x, &self->y, self->buffer1, e), 0x4D83E154); REQ(filter2_init(&self->f2, &self->level, self->buffer2, e), 0x5B4D8F8D); return true; }
(рдЖрдИрдбреА рд╣рд╛рде рд╕реЗ рдирд╣реАрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдЙрдкрдпреБрдХреНрдд рдХреБрдВрдЬреА рджрдмрд╛рдХрд░ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ)
рдФрд░ REQ рдореИрдХреНрд░реЛ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ:
#define REQ(X, ID) \ if (X) \ ; \ else { \ if (e->count < MAX_STACK) \ e->stack[e->count++] = ID; \ return false; \ }
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд░рдВрднреАрдХрд░рдг рдкрд░рд┐рдгрд╛рдо (рд╕рдлрд▓рддрд╛ / рдЕрд╕рдлрд▓рддрд╛) рдФрд░ рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА, рддреЛ рдмрд╣реБрдд рдЬрдЧрд╣ рддрдХред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- ANSI C (рдХрд┐рд╕реА рднреА рдЧреИрд░-рдорд╛рдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ) рдХреЗ рднреАрддрд░ рдмрдиреЗ рд░рд╣реЗ,
- рдорд┐рд▓рд╛ (рд▓рдЧрднрдЧ рдореБрдлреНрдд) рдХреЙрд▓ рд╕реНрдЯреИрдХ,
- рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ,
- рдХреЛрдб рд░реИрдЦрд┐рдХ рд╣реИ, рдпрд╣ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреА рдирд┐рд░рдВрддрд░ рдЬрд╛рдВрдЪ рд╕реЗ рдЕрдЯреЗ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ,
- рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "C ++ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛" рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХреЙрд▓ рдорд┐рд▓рддреЗ рд╣реИрдВред
ps: рд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдпрд╣ рд╢рд╛рдпрдж рдорда рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред