Article View: pl.comp.lang.c
Article #310197Re: Coroutines w (GNU) C
From: Maciek Godek
Date: Wed, 29 Jan 2020 20:41
Date: Wed, 29 Jan 2020 20:41
150 lines
6891 bytes
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-mailReferences:
<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