🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310197

Re: Coroutines w (GNU) C

#310197
From: Maciek Godek
Date: Wed, 29 Jan 2020 20:41
150 lines
6891 bytes
W dniu środa, 29 stycznia 2020 18:19:27 UTC+1 użytkownik heby napisał:
> On 29/01/2020 08:31, Maciek Godek wrote:
> > Wolę po prostu nie dokładać niepotrzebnych zależności.
> 
> Przecież własnie dołożyłeś niepotrzebną zależnośc of ficzera w kompilatorze.

Kod i tak już jest zależny od GCC, więc to bez różnicy.

> > Język C to jest technologia, i język C++ to jest inna technologia.
> 
> Język C++ to rozwinięcie jęyka C.

Nie jest, i to już od dawna.
Ze standardu C nie zadziała ci chociażby designated initializers struktur.
(I w C++20 też nie zadziała)

> Masz kiepski kod. Ten kod nazywasz "korutynami".
> 
> To nie są korutyny. W dodaku okazuje się że wymagają workaroundu aby być 
> w ogóle użyteczne do normalnego programowania, inaczej to pistolecik na 
> kapiszony. Z workaroundem to odbezpieczony granat w gaciach.

Witaj w świecie programowania w C/C++.

> > Po pierwsze, C i C++ są niekompatybilne.
> 
> Nikt tak nie twierdzi, ale śmiem twierdzić że w Twoim wypadku zmiana z 
> gcc na g++ nic nie spowoduje a może nawet pomoże (warningi, nielegalne 
> konstrukcje itd itp). Czyli są komatybilne w jedną stronę.

No wiem. Zauważyłem już, że "śmiesz twierdzić" wiele rzeczy, o których nie masz bladego pojęcia.
Ale zobaczmy.

x.c <<EOF
#include <stdio.h>

int main(int argc, const char *argv[]) {
  struct {
    int x;
    char c;
  } s = {
    .c = 'a',
    .x = 7
  };
  printf("%c%d\n", s.c, s.x);
  return 0;
}
EOF

# gcc x.c
# ./a.out
a7
# g++ x.c
x.c: In function ‘int main(int, char**)’:
x.c:10:3: sorry, unimplemented: non-trivial designated initializers not supported
   };
   ^
x.c:10:3: sorry, unimplemented: non-trivial designated initializers not supported

> > A jeżeli używam rozszerzeń GNU C
> 
> Przecież nie chcesz dodatkowych zależności, prawda?

Nie ma dodatkowych zależności. Jak pisałem, z GCC korzystam tak czy siak.

> >> nie uzywaj coroutines, użyj FreeRTOSa
> > Dokładnie tak. Zaproponowałeś wiele rozwiązań, zupełnie nie rozumiejąc uwarunkowań problemu.
> 
> a) nigdzie ich na poczatku nie było

Bo i problemu nie przedstawiałem.
Przedstawiałem pewne rozwiązanie, które jest stosowalne również poza kontekstem, w którym je sformułowałem.
Rozwiązanie oczywiście można zasadnie krytykować, ale odświeżanie starego flamewara "C vs. C++" ma umiarkowany sens.

> >> Masz dobre powody aby nie używać C++ i FreeRTOSa. Poza religią nie znam
> >> sensownych, "blog" nie pomógł w ich identyfikacji. Co robić...
> > To nie moja wina, że brakuje Ci wyobraźni.
> 
> Cały czas chcesz by Ci czytać w myślach. To nie jest możliwe.

Wystarczy, że nie będziesz proponował rozwiązań od czapy.

> >> Niemożność używania stosu. To ogranicza zastosowanie do marginalnej
> >> ilosci przypadków, w dodatku prawdopodobnie rozwiązywalnych ładniej
> >> switch/case.
> > No dobrze, to może pokaż, czego nie możesz zrobić bez stosu, a co mógłbyć zrobić, gdybyś miał korutyny ze stosem.
> 
> [...]
> yeld( 42 );
> for( i = 6 ; i < 10 ; ++i )
>     [...]
>     yeld( i );
>     [...]

Czas start.

int f(void) {
  COROUTINE_START();
  static int i;
  COROUTINE_YIELD(42);
  for (i = 6; i < 10; ++i ) {
      COROUTINE_YIELD(i);
  }
}

Hmm. Chyba wygląda dość tak samo.

> W zasadzie napisanie dowolnego nieco bardziej skomplikowanego generatora 
> wymaga natychmiast użycia workaroundu ze zmiennymi statycznymi.
> 
> PS. Zmienne statyczne tez nie są potrzebne. Wystarczy dowolny obiekt 
> trzymający stan korutyny. Zaznaczam że jest to tylko niewiele lepsze 
> rozwiązanie bo ten obiekt też musi być śledzony jeśli nie daj Panie 
> korutyny będą się przeplatać. Tak czy owak d...z tyłu.

Nadal nie podałeś żadnego przykładu.

> >>> Jeżeli chcę się komunikować z przerwania z innymi komponentami systemu, to muszę użyć zmiennej globalnej.
> >> To inny przypadek.
> > A czym się różni?
> 
> Tym że do tego systemy operacyjne wynalazły różne metody IPC ponieważ 
> jest nieuniknione.
> 
> W Twoim wypadku używanie zmiennych globalnych nie jest nieuniknione 
> tylko wynika z kiepskiej implementacji.

To pokaż mi jak przekazać informację z przerwania do procesu bez zmiennej globalnej.

> >> PS. Podpowiem Ci: Twój pomysł da się rozwiązać kilkoma makrami i
> >> ukrytymi w nich "switch/case" bez używania magicznych ficzerów
> >> kompilatora.
> > No to dajesz. Pokaż te kilka makr.
> 
> Może coś narzeźbię w wolnej chwili. Uzywałem tego przez jakiś czas z 
> miernym skutkiem i raczej nie znajduje powodów do powrotu.

Nie ma potrzeby. Już zrobiłem:

#define CO_START()                              \
  static int continuation = 0;                  \
  switch(continuation) {                        \
  case 0:

#define CO_YIELD(value)                         \
  continuation = __LINE__;                      \
  return value;                                 \
  case __LINE__:

#define CO_END() default: continuation = 0; }
Technical Details
Message-ID: <462689f9-f50d-4a96-8910-cb65757a017a@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!goblin2!goblin1!goblin.stu.neva.ru!g89no557791qtd.0!news-out.google.com!w29ni986qtc.0!nntp.google.com!g89no557785qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <b7cfec93-1d13-44e3-a924-0869447ed3c7@googlegroups.com> <r0seqp$av0$1@dont-email.me>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:1318:: with SMTP id o24mr1678428qkj.247.1580330474382;        Wed, 29 Jan 2020 12:41:14 -0800 (PST)
X-Received: by 2002:a81:a003:: with SMTP id x3mr582785ywg.479.1580330474120; Wed, 29 Jan 2020 12:41:14 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!goblin2!goblin1!goblin.stu.neva.ru!g89no557791qtd.0!news-out.google.com!w29ni986qtc.0!nntp.google.com!g89no557785qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Wed, 29 Jan 2020 12:41:13 -0800 (PST)
In-Reply-To: <r0seqp$av0$1@dont-email.me>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=83.25.200.96; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 83.25.200.96
References: <4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <b7cfec93-1d13-44e3-a924-0869447ed3c7@googlegroups.com> <r0seqp$av0$1@dont-email.me>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <462689f9-f50d-4a96-8910-cb65757a017a@googlegroups.com>
Subject: Re: Coroutines w (GNU) C
From: Maciek Godek <godek.maciek@gmail.com>
Injection-Date: Wed, 29 Jan 2020 20:41:14 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit