рдпрд╣ рдЖрд▓реЗрдЦ рд╕реА / рд╕реА ++ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ (рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдЧреНрд░реЗрд╡рд┐рдЬрд╝ рдЧреНрд░рд╛рдлрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ ред
рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдлрд╡рд┐рдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдбреЙрдЯ рдЧреНрд░рд╛рдл рднрд╛рд╖рд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рддреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИред рдЙрдирдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рд░реЗрдЦрд╛рдВрдХрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдореЗрдореЛрд░реА рд╕реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдЙрджреНрдзрд░рдг):
- рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рдЧреНрд░рд╛рдл рдХреЛ рдмрджрд▓рдирд╛ рдФрд░ рд╕рдордХрдХреНрд╖ рд╡рд░реНрдг "#" рдФрд░ "\" рдХреЗ рд╕рд╛рде рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛;
- рдмрдЪреА рд╣реБрдИ рдкрдВрдХреНрддрд┐ рдлрд╝реАрдб рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛;
- рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдФрд░ рдмреНрд▓реЙрдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬрдЧрд╣ (рдЖрд╕рдкрд╛рд╕ рдХреЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдЯреИрдм рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде);
- рдПрдХ рдордирдорд╛рдирд╛ рдлрд╝рд╛рдЗрд▓ ( #include ) рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рдореНрдорд┐рд▓рди (рд╕рдорд╛рд╡реЗрд╢ );
- рд╕реНрдереВрд▓ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди ( # рдЕрд▓реНрдкрд╛рдЗрди );
- рд╕рд╢рд░реНрдд рд╕рдВрдХрд▓рди ( #if, #ifdef, #elif, #else, #endif );
рдЕрдм рд╣рдо рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЦреЛрд▓реЗ рдЧрдП рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, MediaStrimer2 рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рд╕реЗ рдЧреНрд░рд╛рдл рд▓реЗрдВ , рдпрд╣ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рд╣реИред

рдЧреНрд░рд╛рдл рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк "рдорд╛рдереЗ рдкрд░" рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореИрдиреБрдЕрд▓ рддреНрд░реБрдЯрд┐ рдореБрдХреНрдд рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕реЗ рдЧреНрд░рд╛рдл 1, m2, m2_1, m2_2, m3, m4 рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ред рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЫреЛрдЯреЗ рдорд╢реАрдиреАрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдпреЗ рдкрд╣рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдбреЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ common.dot :
#define Q(x) #x
#define QUOTE(x) Q(x)
#define msg_staff \
<p> *prev \
|<n> *next \
|<c> *cont \
|<d> *data \
| other\nstuff
#define msg(name, ... ) \
name[xlabel=mblk_t label=QUOTE(<h> name | msg_staff) \
];
#define dbuf(name ...) \
name[label=QUOTE(<h> name) xlabel="dblk_t"];
#define queue(name, ...) \
name[ xlabel="queue_t" label=QUOTE(<h> name | \
msg_staff)];
рдЕрдм рдореБрдЦреНрдп рдЧреНрд░рд╛рдлрд╝ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ my_graph.dot рдХрд╣рддреЗ рд╣реИрдВ :
#include "common.dot"
digraph queue_demo
{
rankdir=LR;
node[shape=Mrecord];
dbuf(d1);
dbuf(d2);
dbuf(d2_1);
dbuf(d2_2);
dbuf(d3);
dbuf(d4);
msg(m1);
msg(m2);
msg(m2_1);
msg(m2_2);
msg(m3);
msg(m4);
queue(q1);
m1:d->d1;
m2:d->d2;
m2_1:d->d2_1;
m2_2:d->d2_2;
m3:d->d3;
m4:d->d4;
m1:n -> m2:h;
m1:p -> q1:h;
m2:n -> m3:h;
m2:c->m2_1:h;
m2_1:c->m2_2:h;
m3:n -> m4:h;
m2:p -> m1:h;
m3:p -> m2:h;
m4:p -> m3:h;
q1:n->m1:h;
q1:p->m4:h;
m4:n -> q1:h[color=blue];
}
рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
cpp my_graph.dot -o my_graph_res.dot
my_graph_res.dot. :
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "my_graph.dot"
# 1 "common.dot" 1
# 3 "my_graph.dot" 2
digraph queue_demo
{
rankdir=LR;
node[shape=Mrecord];
d1[label="<h> d1" xlabel="dblk_t"];;
d2[label="<h> d2" xlabel="dblk_t"];;
d2_1[label="<h> d2_1" xlabel="dblk_t"];;
d2_2[label="<h> d2_2" xlabel="dblk_t"];;
d3[label="<h> d3" xlabel="dblk_t"];;
d4[label="<h> d4" xlabel="dblk_t"];;
m1[xlabel=mblk_t label="<h> m1 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
m2[xlabel=mblk_t label="<h> m2 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
m2_1[xlabel=mblk_t label="<h> m2_1 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
m2_2[xlabel=mblk_t label="<h> m2_2 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
m3[xlabel=mblk_t label="<h> m3 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
m4[xlabel=mblk_t label="<h> m4 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff" ];;
q1[ xlabel="queue_t" label="<h> q1 | <p> *prev |<n> *next |<c> *cont |<d> *data | other\nstuff"];;
m1:d->d1;
m2:d->d2;
m2_1:d->d2_1;
m2_2:d->d2_2;
m3:d->d3;
m4:d->d4;
m1:n -> m2:h;
m1:p -> q1:h;
m2:n -> m3:h;
m2:c->m2_1:h;
m2_1:c->m2_2:h;
m3:n -> m4:h;
m2:p -> m1:h;
m3:p -> m2:h;
m4:p -> m3:h;
q1:n->m1:h;
q1:p->m4:h;
m4:n -> q1:h[color=blue];
}
, . . Graphviz ( dot) : https://sketchviz.com/new
:

, , .
.