рдЧреНрд░рд╛рдлрд╡рд┐рдЬрд╝ рдФрд░ рд╕реА / рд╕реА ++ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рд╣рдХреНрд░рд┐рдпрд╛

рдпрд╣ рдЖрд▓реЗрдЦ рд╕реА / рд╕реА ++ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ (рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдЧреНрд░реЗрд╡рд┐рдЬрд╝ рдЧреНрд░рд╛рдлрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ ред


рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдлрд╡рд┐рдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдбреЙрдЯ рдЧреНрд░рд╛рдл рднрд╛рд╖рд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рддреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИред рдЙрдирдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рд░реЗрдЦрд╛рдВрдХрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдореЗрдореЛрд░реА рд╕реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдЙрджреНрдзрд░рдг):


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

рдЕрдм рд╣рдо рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЦреЛрд▓реЗ рдЧрдП рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, MediaStrimer2 рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рд╕реЗ рдЧреНрд░рд╛рдл рд▓реЗрдВ , рдпрд╣ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рд╣реИред



рдЧреНрд░рд╛рдл рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк "рдорд╛рдереЗ рдкрд░" рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореИрдиреБрдЕрд▓ рддреНрд░реБрдЯрд┐ рдореБрдХреНрдд рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕реЗ рдЧреНрд░рд╛рдл 1, m2, m2_1, m2_2, m3, m4 рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ред рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЫреЛрдЯреЗ рдорд╢реАрдиреАрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдпреЗ рдкрд╣рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдбреЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ common.dot :


//  common.dot       .

#define Q(x) #x         //    ""   .

#define QUOTE(x) Q(x)   //   ""    .

//         mblk_t.
//       . 
#define msg_staff \
   <p> *prev \
  |<n> *next \
  |<c> *cont  \
  |<d> *data \
  | other\nstuff

//        mblk_t.
#define msg(name, ... ) \
name[xlabel=mblk_t label=QUOTE(<h> name | msg_staff) \
];

//        dblk_t.
#define dbuf(name ...) \
name[label=QUOTE(<h> name) xlabel="dblk_t"];

//       queue_t.
//         mblk_t, 
//      msg_staff.
#define queue(name, ...) \
name[ xlabel="queue_t" label=QUOTE(<h> name | \
msg_staff)];

рдЕрдм рдореБрдЦреНрдп рдЧреНрд░рд╛рдлрд╝ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ my_graph.dot рдХрд╣рддреЗ рд╣реИрдВ :


//  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);

    //     .
    //     q1.
    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


:



, , .


.


All Articles