Информация об изменениях

Сообщение Re[14]: Вопрос по корутинам от 28.08.2025 8:33

Изменено 28.08.2025 8:35 kov_serg

Re[14]: Вопрос по корутинам
Здравствуйте, rg45, Вы писали:

R>Именно эту мысль я и пытаюсь донести до широкой общественности. Уже несколько раз говорил об этом в этой теме.


_>>Корутины это просто сопособ записи. Без них можно спокойно писать точно такой же код. При этом достаточно обычного голого C.

R>Ну, напиши точно такой же код
Автор: rg45
Дата: 28.08 10:43
без корутин. А то я уже дважды реализовывал твои хотелки, а ты мои ни разу. У меня уже начинают шевелиться сомнения в простоте реализации того же самомго на голом С.


std::generator<std::pair<int, std::string>> runMachine(const int& param, int machineID) {
    co_yield std::pair{machineID, "Idle"};
    co_yield std::pair{machineID, "Started"};
    co_yield std::pair{machineID, "Processing"};
    while (param < 10)
    {
        co_yield std::pair{machineID, "Waiting"};
    }
    co_yield std::pair{machineID, "Stopped"};
}


Вот такой же код на голом C
typedef struct {
    int loop;
    int machineID, *param;
    const char* value;
} fn1_t;

void fn1_setup(fn1_t *self) { self->loop=0; }
int fn1_loop(fn1_t *self) {
    LOOP_BEGIN(self->loop)
    self->value="Idle"; LOOP_POINT
    self->value="Started"; LOOP_POINT
    self->value="Processing"; LOOP_POINT
    while (*self->param < 10) {
        self->value="Waiting"; LOOP_POINT
    }
    self->value="Stopped";
    LOOP_END
}
  вспомогательные макросы
/* loop-fn.h */
#ifndef __LOOP_FN_H__
#define __LOOP_FN_H__

typedef int loop_t;

#define LOOP_RESET(loop) { loop=0; }
#if defined(__COUNTER__) && __COUNTER__!=__COUNTER__
#define LOOP_BEGIN(loop) { enum { __loop_base=__COUNTER__ };     loop_t *__loop=&(loop); __loop_switch: int __loop_rv=1;     switch(*__loop) { default: *__loop=0; case 0: {
#define LOOP_POINT { enum { __loop_case=__COUNTER__-__loop_base };     *__loop=__loop_case; goto __loop_leave; case __loop_case:{} }
#else
#define LOOP_BEGIN(loop) {loop_t*__loop=&(loop);__loop_switch:int __loop_rv=1;    switch(*__loop){ default: case 0: *__loop=__LINE__; case __LINE__:{
#define LOOP_POINT { *__loop=__LINE__; goto __loop_leave; case __LINE__:{} }
#endif
#define LOOP_END { __loop_end: *__loop=-1; case -1: return 0;     { goto __loop_end; goto __loop_switch; } }     }} __loop_leave: return __loop_rv; }
#define LOOP_SET_RV(rv) { __loop_rv=(rv); } /* rv must be non zero */
#define LOOP_INT(n) { __loop_rv=(n); LOOP_POINT } /* interrupt n */
/* for manual labeling: enum { L01=1,L02,L03,L04 }; ... LOOP_POINT_(L02) */
#define LOOP_POINT_(name) { *__loop=name; goto __loop_leave; case name:{} }
#define LOOP_INT_(n,name) { __loop_rv=(n); LOOP_POINT_(name) }

#endif /* __LOOP_FN_H__ */


По поводу generateMachines. То там они не паралельно вызываются а по очереди.
  Предполагалось что-то вида
enum { sevInit, sevDone };
typedef struct {
    void *ctx;
    int (*setup)(void *ctx,int sev);
    int (*loop)(void *ctx);
} afn_t;

int run(afn_t *list,int count) {
    int i,j; afn_t *fi; int rc=0;
    for(i=0;i<count;i++) { fi=list[i]; if (fi.setup(fi.ctx,sevInit)) break; }
    if (i<count) { count=i+1; rc=1; } else {
        while(count>0) {
            for(i=0;i<count;i++) {
                fi=list[i];
                if (fi.loop(fi.ctx)==0) {
                    count--;
                    afn_t t=list[i]; list[i]=list[count]; list[count]=t;
                }
            }
        }
    }
    for(i=0;i<count;i++) { fi=list[i]; fi.setup(fi.ctx,sevDone); }
    return rc;
}
Re[14]: Вопрос по корутинам
Здравствуйте, rg45, Вы писали:

R>Именно эту мысль я и пытаюсь донести до широкой общественности. Уже несколько раз говорил об этом в этой теме.


_>>Корутины это просто сопособ записи. Без них можно спокойно писать точно такой же код. При этом достаточно обычного голого C.

R>Ну, напиши точно такой же код
Автор: rg45
Дата: 28.08 10:43
без корутин. А то я уже дважды реализовывал твои хотелки, а ты мои ни разу. У меня уже начинают шевелиться сомнения в простоте реализации того же самомго на голом С.


std::generator<std::pair<int, std::string>> runMachine(const int& param, int machineID) {
    co_yield std::pair{machineID, "Idle"};
    co_yield std::pair{machineID, "Started"};
    co_yield std::pair{machineID, "Processing"};
    while (param < 10)
    {
        co_yield std::pair{machineID, "Waiting"};
    }
    co_yield std::pair{machineID, "Stopped"};
}


Вот такой же код на голом C
typedef struct {
    int loop;
    int machineID, *param;
    const char* value;
} fn1_t;

void fn1_setup(fn1_t *self) { self->loop=0; }
int fn1_loop(fn1_t *self) {
    LOOP_BEGIN(self->loop)
    self->value="Idle"; LOOP_POINT
    self->value="Started"; LOOP_POINT
    self->value="Processing"; LOOP_POINT
    while (*self->param < 10) {
        self->value="Waiting"; LOOP_POINT
    }
    self->value="Stopped";
    LOOP_END
}
  вспомогательные макросы
/* loop-fn.h */
#ifndef __LOOP_FN_H__
#define __LOOP_FN_H__

typedef int loop_t;

#define LOOP_RESET(loop) { loop=0; }
#if defined(__COUNTER__) && __COUNTER__!=__COUNTER__
#define LOOP_BEGIN(loop) { enum { __loop_base=__COUNTER__ };     loop_t *__loop=&(loop); __loop_switch: int __loop_rv=1;     switch(*__loop) { default: *__loop=0; case 0: {
#define LOOP_POINT { enum { __loop_case=__COUNTER__-__loop_base };     *__loop=__loop_case; goto __loop_leave; case __loop_case:{} }
#else
#define LOOP_BEGIN(loop) {loop_t*__loop=&(loop);__loop_switch:int __loop_rv=1;    switch(*__loop){ default: case 0: *__loop=__LINE__; case __LINE__:{
#define LOOP_POINT { *__loop=__LINE__; goto __loop_leave; case __LINE__:{} }
#endif
#define LOOP_END { __loop_end: *__loop=-1; case -1: return 0;     { goto __loop_end; goto __loop_switch; } }     }} __loop_leave: return __loop_rv; }
#define LOOP_SET_RV(rv) { __loop_rv=(rv); } /* rv must be non zero */
#define LOOP_INT(n) { __loop_rv=(n); LOOP_POINT } /* interrupt n */
/* for manual labeling: enum { L01=1,L02,L03,L04 }; ... LOOP_POINT_(L02) */
#define LOOP_POINT_(name) { *__loop=name; goto __loop_leave; case name:{} }
#define LOOP_INT_(n,name) { __loop_rv=(n); LOOP_POINT_(name) }

#endif /* __LOOP_FN_H__ */


По поводу generateMachines. То там они не паралельно вызываются а по очереди.
  Предполагалось что-то вида
enum { sevInit, sevDone };
typedef struct {
    void *ctx;
    int (*setup)(void *ctx,int sev);
    int (*loop)(void *ctx);
} afn_t;

int run(afn_t *list,int count) {
    int i,j; afn_t *fi; int rc=0;
    for(i=0;i<count;i++) { fi=list[i]; if (fi.setup(fi.ctx,sevInit)) break; }
    if (i<count) { count=i+1; rc=1; } else {
        while(count>0) {
            for(i=0;i<count;i++) {
                fi=list[i];
                if (fi.loop(fi.ctx)==0) {
                    count--;
                    afn_t t=list[i]; list[i]=list[count]; list[count]=t;
                    i--;
                }
            }
        }
    }
    for(i=0;i<count;i++) { fi=list[i]; fi.setup(fi.ctx,sevDone); }
    return rc;
}