Różnice w alokacji pamięci dla zmiennych globalnych w avr-gcc - z static i bez
avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E_?=
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E_?=
Date: Fri, 01 Jul 2005 22:36:29 +0200
Witam!
Okazało się ze to nie był problem z wywoływaniem funckji z przerwań. To
chyba co innego. Z nieznanych mi przyczyn jest istotna róznica jeśli:
a) Mam program w modułach
b) definiuje zmienną globalną w jednym z modułów w postaci:
extern long zmienna (to w pliku .h)
long zmienna (to w jednym z plików .c)
c) modyfikuje ją w przerwaniu
To w takiej konfiguracji zmiana "zmiennej" powoduje wesołe zawieszenie
się reszty programu/błedne działanie.
jednak wystarczy zdeklarować:
static long zminna
A program się stabilizuje i działa poprawnie.
W kodzie wygląda to tak, że bez static allokowane jest to w innym
obszarze niż ze static. Konkretnie static allokuje wyższe komórki (rzędu
0xd0) a ze static okolice 0x60.
Wygląda mi to dość dziwnie, tak jak gdyby nie dało się deklarować
widocznych pomiedzy modułami zmiennych. Nie potrafie wyłapać dokladnych
warunków, kiedy to zachodzi, ponieważ w róznych kombinacjach wielkości
programu raz działa a raz nie działa (bez static). Ze static działa
zawsze poprawnie.
Ktoś ma jakiś pomysł co robie źle ?
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Jaroslaw Berezowski" <jaroslaw_berezowski_at_nospam_poczta.onet.pl>
Subject: Re: =?iso-8859-2?B?YXZyLWdjYzogQ3p5IG1vv25hIHd5d2+zYeYgLi4uIGNpsWcgZGFsc3p5?= =?iso-8859-2?B?IGFsZSBpbmFjemVq?=
Date: Sat, 02 Jul 2005 13:34:59 +0200
Dnia Fri, 01 Jul 2005 22:36:29 +0200, Sebastian Bialy
<heby_at_nospam_poczta.onet.pl> napisał:
a) Mam program w modułach
b) definiuje zmienną globalną w jednym z modułów w postaci:
extern long zmienna (to w pliku .h)
Hmm definicja w pliku naglowkowym jest w zasadzie "papierowa" jezeli mozna
tak to nazwac. Przeciez kompilator powinien ja zrobic dopiero w miejscu
wlaczenia do pliku .c
long zmienna (to w jednym z plików .c)
Hmm a includujesz ten sam plik .h? Moze jakis problem z overridami? Zrob
moze definicje w .h warunkowa i ustawiaj odpowiedni warunek.
--
Jaroslaw "Jaros" Berezowski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 09:48:58 +0200
Sebastian Bialy wrote:
Ktoś ma jakiś pomysł co robie źle ?
Już wiem, aczkolwiek jestem bardzo zdziwiony ...
Oczywiscie jestem temu winien. Mój program składa się z 5 modułów.
Przypadkowo (zapewne efekt pisania nocami) w jednym z plików .c
zapomniałem doinkludować charakterystyczme pliki do AVR. Ponieważ nie
było w nim żadnych zaleznych sprzetowo elementów poza SIGNAL i
matematyce na zmiennych to nie wrzeszczał o ich brak (swoją drogą bradzo
dziwne, czyżby SIGNAL był wbudowany w avr-gcc ?).
Efekt: W tym jednym mudule zmienna lądowała w innym obszarze pamięci. Po
dodaniu #include zmienna poleciała tam gdzie wszystkie.
Oczywiście wie ponosze ja, za nieuwagę, ale bardzo dzinym dla mnie
zjawiskiem jaest fakt, że w ogóle kod się skompilował bez błędów.
Pisze to ku przestrodze, gdyby komus robily się również takie numery z
lokalizacją zmiennych ...
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 12:36:48 +0200
Sebastian Bialy napisał(a):
Efekt: W tym jednym mudule zmienna lądowała w innym obszarze
pamięci. Po dodaniu #include zmienna poleciała tam gdzie
wszystkie.
to wygląda tak, jakbyś sobie tą zmienną zadeklarował mimo wszystko w tym
pliku. gdybyś nie miał wcześniej żadnej deklaracji, kompilator powinien
się wywalić.
swoją drogą, dodajesz -Wall do flag kompilatora? dzięki dużej ilości
ostrzeżeń łatwo wykryć potencjalne błędy.
w.
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 18:37:59 +0200
Wojtek Kaniewski wrote:
to wygląda tak, jakbyś sobie tą zmienną zadeklarował mimo wszystko w tym
pliku. gdybyś nie miał wcześniej żadnej deklaracji, kompilator powinien
się wywalić.
nie chodzi o mój plik .h tylko w ogóle o zestaw plików .h:
avr/interrupt.h
avr.signal.h
arv/io.h
...
swoją drogą, dodajesz -Wall do flag kompilatora? dzięki dużej ilości
ostrzeżeń łatwo wykryć potencjalne błędy.
Dodaje ale wtedy, kiedy kod kompiluje mi się bez błędów, a w trakcie
pisania programu na wczesnym etapie jest cała masa błędów typu "nieużyte
i" albo "nigdy tego nie wywołasz" i tym podobnym. Więc wyłączyłem :) Ale
masz rację, Wall mogło podpowiedziec co jest nie tak.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Sun, 3 Jul 2005 15:46:21 +0200
Sebastian Bialy wrote:
Oczywiście wie ponosze ja, za nieuwagę, ale bardzo dzinym dla mnie
zjawiskiem jaest fakt, że w ogóle kod się skompilował bez błędów.
Podziękuj Kernighanowi i Ritchiemu. :-)
Jeszcze lepszą zabawę będziesz miał, gdy uda Ci się wywołać
konflikt nazwy Twojej funkcji z jedną z funkcji bibliotecznych
-- linker bez ostrzeżeia wybierze Twoją wersję, mimo, że inne
fragmenty biblioteki moga chcieć się odwoływać do prawidłowej
wersji. No cóż, jaki jest C każdy widzi...
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 18:47:47 +0200
Piotr Wyderski wrote:
Podziękuj Kernighanowi i Ritchiemu. :-)
No niestety, tego typu "czeskie błędy" cały czas są moją zmorą. Ale C
znam od 10 lat i na razie mimo jego upierdliwości nie zamienie go na nic
innego, jeśli mam grzebac blisko sprzetu (a jak daleko, to C++).
Jeszcze lepszą zabawę będziesz miał, gdy uda Ci się wywołać
konflikt nazwy Twojej funkcji z jedną z funkcji bibliotecznych
-- linker bez ostrzeżeia wybierze Twoją wersję, mimo, że inne
fragmenty biblioteki moga chcieć się odwoływać do prawidłowej
wersji. No cóż, jaki jest C każdy widzi...
A to akurat jest bardzo ok i w zasadzie zgodne ze zdrowym rozsądkiem jak
dla mnie. Moim zdaniem pisanie programów w C jest swego rodzaju
pozytywnym wyzwaniem szczególnie w czasach Delphi/VB i wszelkiej maści
.NET ów, gdzie myślenie i znajomośc bebechów jest wysoce niewskazane.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Sun, 3 Jul 2005 19:55:13 +0200
Sebastian Bialy wrote:
na razie mimo jego upierdliwości nie zamienie go na nic
innego, jeśli mam grzebac blisko sprzetu (a jak daleko, to C++).
A to mnie zaciekawiło: dlaczego C++ stosujesz pisząc bardziej
wysokopoziomowo, a C na niższym poziomie? Przecież wszystko,
co można zrealizować w C przenosi się do C++ praktycznie bez
modyfikacji, a w C++ dostajesz kilka bardzo silnych mechanizmów,
m.in. szablony. Pokazałem Ci kilka dni temu w jaki sposób Twój
nierozwiązywalny problem w C rozwiązać w kilku linijkach w C++,
i to bez generowania jakiegokolwiek kodu i zajmowania pamięci.
A to akurat jest bardzo ok
Nie jest bardzo OK, bo może stać się przyczyną powstania bardzo
trudnych do wykrycia błędów. W C++ można się przed tym zabezpieczyć
za pomocą przestrzeni nazw
Moim zdaniem pisanie programów w C jest swego rodzaju
pozytywnym wyzwaniem
Pisanie programów w czymkolwiek nie jest żadnym wyzwaniem,
to rzemiosło. Wyzwaniem jest zaprojektowanie programu, ale
to się robi w oderwaniu od języka programowania.
szczególnie w czasach Delphi/VB i wszelkiej maści .NET ów,
gdzie myślenie i znajomośc bebechów jest wysoce niewskazane.
To jakieś zabobony... :-) Języki trzymające się daleko od poziomu
maszyny są równie potrzebne, jak te, które ujawniają niskopoziomową
strukturę sprzętu -- każdy z nich ma swój obszar stosowalności.
Pozdrawiam
Piotr Wyderski
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 20:49:55 +0200
Piotr Wyderski napisał(a):
(...) Pokazałem Ci kilka dni temu w jaki sposób Twój
nierozwiązywalny problem w C rozwiązać w kilku linijkach w C++,
i to bez generowania jakiegokolwiek kodu i zajmowania pamięci.
szkoda, że tak późno zauważyłem tamten wątek, to bym napisał, że można
po prostu zrobić tak:
unsigned long x;
if (sizeof(x) == sizeof(unsigned long)) {
// foo
}
if (sizeof(x) == sizeof(unsigned short)) {
// bar
}
gcc nawet bez -O już w trakcie kompilacji rozwinie sizeof() i usunie
martwy kod warunkowy. fakt, to nie jest dokładne sprawdzanie typu (nie
odróżni char[2] i short od unsigned short), ale w większości przypadków
wystarczy.
w.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 04 Jul 2005 16:15:57 +0200
On Sun, 03 Jul 2005 20:49:55 +0200, Wojtek Kaniewski wrote:
Piotr Wyderski napisał(a):
(...) Pokazałem Ci kilka dni temu w jaki sposób Twój
nierozwiązywalny problem w C rozwiązać w kilku linijkach w C++,
i to bez generowania jakiegokolwiek kodu i zajmowania pamięci.
szkoda, że tak późno zauważyłem tamten wątek, to bym napisał, że można
po prostu zrobić tak:
unsigned long x;
if (sizeof(x) == sizeof(unsigned long)) {
// foo
}
if (sizeof(x) == sizeof(unsigned short)) {
// bar
}
gcc nawet bez -O już w trakcie kompilacji rozwinie sizeof() i usunie
martwy kod warunkowy. fakt, to nie jest dokładne sprawdzanie typu (nie
odróżni char[2] i short od unsigned short), ale w większości przypadków
wystarczy.
Nie bardzo - nie zrozumiales dokladnie o co chodzi.
a) wpisujemy w zrodlo czestotliwosc kwarcu, w #define
b) kompilator na jej podstawie sam wylicza potrzebne wartosci
c) w zaleznosci od tego co wyjdzie uzywa w kodzie arytmetyki
typu int lub long.
Tymczasem u ciebie:
0) i tak nie wyliczysz tej wartosci, bo to ponad mozliwosci
preprocesora C.
1) nie zadeklarujesz potrzebnych zmiennych roznych typow w zaleznosci
od wynikow obliczen.
2) o ile zadziala to na zmiennych, to na stalych nie.
sizeof(1000*500) wynosi .. 2
J.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 4 Jul 2005 16:29:21 +0200
J.F. wrote:
Nie bardzo - nie zrozumiales dokladnie o co chodzi.
a) wpisujemy w zrodlo czestotliwosc kwarcu, w #define
b) kompilator na jej podstawie sam wylicza potrzebne wartosci
c) w zaleznosci od tego co wyjdzie uzywa w kodzie arytmetyki
typu int lub long.
W C++ to proste do zrobienia, jeśli się zna pare sztuczek z szablonami.
Natomiast w C nie da się czegoś takiego uzyskać. No cóż, ale jeśli ktoś
sobie sam nakłada kaganiec, a później narzeka, że nie może gryźć, to
już jego problem... :-)
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Mon, 04 Jul 2005 16:40:43 +0200
Piotr Wyderski wrote:
sobie sam nakłada kaganiec, a później narzeka, że nie może gryźć, to
już jego problem... :-)
No ładnie :/ Chyba musze jednak poćwiczyc c++ na AVRach ... skoro tak
namiawiasz strasznie :)
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Mon, 04 Jul 2005 17:43:19 +0200
J.F. napisał(a):
Nie bardzo - nie zrozumiales dokladnie o co chodzi.
a) wpisujemy w zrodlo czestotliwosc kwarcu, w #define
b) kompilator na jej podstawie sam wylicza potrzebne wartosci
c) w zaleznosci od tego co wyjdzie uzywa w kodzie arytmetyki
typu int lub long.
to może coś takiego?
#define F_CPU 10000000L
#define CYCLES F_CPU/100
#if CYCLES > 65535
#warning "unsigned long"
unsigned long cnt;
#else
#warning "unsigned short"
unsigned short cnt;
#endif
int main(void)
{
return 0;
}
taki kod zadeklaruje unsigned long, bo cykli mamy 100000. jeśli zmienisz
stałą F_CPU na 5000000, zadeklaruje unsigned short. o to chodziło?
Tymczasem u ciebie:
0) i tak nie wyliczysz tej wartosci, bo to ponad mozliwosci
preprocesora C.
preprocesor gcc nie poradzi sobie ze stałymi zmiennnoprzecinkowymi, ale
większość rzeczy można policzyć na stałoprzecinkowych przy odpowiednim
przesunięciu wartości.
2) o ile zadziala to na zmiennych, to na stalych nie.
sizeof(1000*500) wynosi .. 2
kod wyżej radzi sobie ze stałymi.
zaznaczam, że cały czas mowa o gcc. inne kompilatory faktycznie mogą
ignorować obliczenia w preprocesorze i zrzucać je na kompilator, ale nie
wiem czy to rozszerzenie gcc czy nowość w C99.
w.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 4 Jul 2005 17:54:06 +0200
Wojtek Kaniewski wrote:
preprocesor gcc nie poradzi sobie ze stałymi zmiennnoprzecinkowymi, ale
większość rzeczy można policzyć na stałoprzecinkowych przy odpowiednim
przesunięciu wartości.
Na przykład najmniejszą wspólną wielokrotność? :-)
Pozdrawiam
Piotr Wyderski
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Mon, 04 Jul 2005 18:24:25 +0200
Piotr Wyderski napisał(a):
preprocesor gcc nie poradzi sobie ze stałymi zmiennnoprzecinkowymi, ale
większość rzeczy można policzyć na stałoprzecinkowych przy odpowiednim
przesunięciu wartości.
Na przykład najmniejszą wspólną wielokrotność? :-)
teraz to już szukasz dziury w całym (;
a na poważnie, to jak na podstawie wyniku czegoś w stylu
boost::math::static_lcm<x,y> zadeklarować zmienną? czy może trzeba
własne szablony tworzyć?
w.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 4 Jul 2005 19:00:28 +0200
Wojtek Kaniewski wrote:
teraz to już szukasz dziury w całym (;
Nie, pokazuję tylko, że nie da się w ten sposób zapisać nawet
najprostszej rekurencyjnej zależności, bo w preprocesorze rekursji
nie ma. W obliczeniach za pomocą szablonów jest.
a na poważnie, to jak na podstawie wyniku czegoś w stylu
boost::math::static_lcm<x,y> zadeklarować zmienną?
Tj. jak wybrać typ zmiennej? Na przykład tak (rozwiązanie ogólne):
template <bool, typename T, typename F> struct select_type {
typedef T type; };
template <typename T, typename F> struct select_type<false,T,F> {
typedef F type; };
I użycie:
select_type<(2*2 == 4), char, double>::type zmienna;
Oczywiście warunek może być dowolnie bardziej skomplikowany, być
wyznaczany przez zależność rekurencyjną itd. -- ogranicza fantazja.
Na podobnej zasadzie (tj. za pomocą częściowej specjalizacji szablonu)
można sobie zrobić odpowiednik instrukcji case (zamiast if), jeśli komuś
jest potrzebna -- tylko parametryzacja powinna wówczas korzystać
z typu unsigned int, a nie bool.
czy może trzeba własne szablony tworzyć?
Tak, ale -- jak widzisz -- bardzo proste i do tego uniwersalne. Ja
sobie dziesiątki tego typu rzeczy zamknąłem we własną biblioteczkę
i korzystam z niej od paru lat, od czasu do czasu dopisując do niej
coś wartego uwagi.
Pozdrawiam
Piotr Wyderski
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Mon, 04 Jul 2005 19:31:11 +0200
Piotr Wyderski napisał(a):
a na poważnie, to jak na podstawie wyniku czegoś w stylu
boost::math::static_lcm<x,y> zadeklarować zmienną?
Tj. jak wybrać typ zmiennej? Na przykład tak (rozwiązanie ogólne):
(...)
widzę, że pora zainwestować w jakąś sensowną książkę o C++. do tej pory
miałem nieszczęście przeglądać takie, które skupiały się na klasach, a o
szablonach wspominały po łebkach.
tak czy inaczej wielkie dzięki za wyjaśnienia.
w.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 4 Jul 2005 20:03:21 +0200
Wojtek Kaniewski wrote:
widzę, że pora zainwestować w jakąś sensowną książkę o C++.
Polecam Andrei Alexandrescu, "Modern C++ design".
http://www.amazon.com/exec/obidos/tg/sim-explorer/explore-items/-/0201704315
/0/101/1/none/purchase/ref%3Dpd%5Fsxp%5Fr0/103-0547055-5611007
I zapiąć pasy, bo jazda będzie ostra.
Pozdrawiam
Piotr Wyderski
From: jerry1111 <pleaseJERRY1111nomorespam_at_nospam_wp.pl>
Subject: Re: avr-gcc: Czy =?UTF-8?B?bW/Cv25hIHd5d2/Cs2HDpiAuLi4gY2nCuWcgZA==?=
Date: Tue, 05 Jul 2005 14:42:46 +0100
Piotr Wyderski wrote:
widzÄ, Ĺźe pora zainwestowaÄ w jakÄ
Ĺ sensownÄ
ksiÄ
ĹźkÄ o C++.
Polecam Andrei Alexandrescu, "Modern C++ design".
http://www.amazon.com/exec/obidos/tg/sim-explorer/explore-items/-/0201704315
/0/101/1/none/purchase/ref%3Dpd%5Fsxp%5Fr0/103-0547055-5611007
I zapiÄ
Ä pasy, bo jazda bÄdzie ostra.
Fajny ten internet - nie zdaze sie Piotra zapytac o dobra ksiazke
i juz mam odpowiedz ;-)
A czy jest taka ksiazka (w zasadzie wiedza czy jest, to tez cenna
informacja) ktora by opisywala uzywanie C++ w malych procesorkach?
Czyli co mozna, czego lepiej nie robic - wiesz, takie male kompendium
wiedzy coby jeszcze raz kola nie wymyslac.
--
Jerry
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: =?utf-8?Q?Re:_avr-gcc:_Czy_mo=C2=BFna_wywo=C2=B3a=C3=A6_.?=
Date: Tue, 5 Jul 2005 18:17:50 +0200
jerry1111 wrote:
A czy jest taka ksiazka (w zasadzie wiedza czy jest, to tez cenna
informacja) ktora by opisywala uzywanie C++ w malych procesorkach?
Czyli co mozna, czego lepiej nie robic - wiesz, takie male kompendium
wiedzy coby jeszcze raz kola nie wymyslac.
Niestety niczego mi na ten temat nie wiadomo. JeĹli mam na danym
procku C++, to po prostu siadam i w nim piszÄ, a kod wychodzi taki,
jaki chciaĹem mieÄ. Nie zauwaĹźyĹem wiÄkszych róşnic w podejĹciu
w porĂłwnaniu z wiÄkszymi maszynami. Nie uĹźywam tylko wyjÄ
tkĂłw,
typowania dynamicznego i metod wirtualnych, bo na oĹmiobitowcach
zazwyczaj jest za maĹo pamiÄci na dane. WykorzystujÄ za to róşne
niskopoziomowe mechanizmy standardowe, ktĂłrych siÄ praktycznie
nie uĹźywa na wiÄkszych maszynach, np. placement new. CaĹa reszta
bez zmian, zwĹaszcza szablony.
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Sun, 03 Jul 2005 20:33:17 +0200
Piotr Wyderski wrote:
na razie mimo jego upierdliwości nie zamienie go na nic
innego, jeśli mam grzebac blisko sprzetu (a jak daleko, to C++).
A to mnie zaciekawiło: dlaczego C++ stosujesz pisząc bardziej
wysokopoziomowo, a C na niższym poziomie? Przecież wszystko,
co można zrealizować w C przenosi się do C++ praktycznie bez
modyfikacji, a w C++ dostajesz kilka bardzo silnych mechanizmów,
m.in. szablony. Pokazałem Ci kilka dni temu w jaki sposób Twój
nierozwiązywalny problem w C rozwiązać w kilku linijkach w C++,
i to bez generowania jakiegokolwiek kodu i zajmowania pamięci.
Nie zrozum mnie źle, ale pisanie w kompilatorze C++ nie używając klas
dalej uważam za pisanie w C. To że dostaje do rąk pare fajnych narzedzi
(szablony na ten przykład jak sam wspomniałeś) jeszcze nie czyni ze mnie
programisty C++ w tym przypadku. W zasadzie dla mnie pisanie w C++ to
używanie klas/szblonów/STL. To się średnio nadaje do mikrokontrolerów
8-bitowych na razie. Tak więc po prostu inaczej definiuje "pisanie w C++"
A to akurat jest bardzo ok
Nie jest bardzo OK, bo może stać się przyczyną powstania bardzo
trudnych do wykrycia błędów. W C++ można się przed tym zabezpieczyć
za pomocą przestrzeni nazw
Owszem, ale kiedyś pisałem bardzo dużo w assemblerze i swoboda grzebania
po RAM była dla mnie bardzo ważną cechą. Kiedy przesiadłem się na C
jęczałem na widok "niepotrzebnych" konwersji zmiennych, etc. Teraz kiedy
przyszło mi nabazgrac plikację w Javie szlag mnie trafia na brak
destrukorów, które są dla mnie ważne w C++. Każdy nastepny język
ogranicza troche swobode (i dobrze, ogranicza to też błędy związane z
prostymi pomyłkami) i coraz bardziej wymusza stosowanie
czasochłonnych/pamięciochłonnych/zasobożernych rozwiązań, zamiast
prostej podmiany funkcji bibliotecznej w C. Akurat tego nie stosuje
powszechnie (2 razy w życiu :) acz zakładam, że są sytuację, kiedy się
przydaje. Co nie znaczy że jestem przeciwnikiem języków myślących za
programistów, ale po prostu jestem "wychowany" na asm Z80/6502/680x0/x86
i mam jakieś zboczenie w tym kierunku.
Cenie sobie C własnie dlatego że MOGĘ to zrobic. A to że czasami jest to
źródłem błędu - no cóż, przy okazji jego rozwiązania uczę się. Inna
sprawa, że przeciętny biznesmen powiedziałby, że trace czas na pierdoły.
Więc zalezy to od punktu widzenia.
Moim zdaniem pisanie programów w C jest swego rodzaju
pozytywnym wyzwaniem
Pisanie programów w czymkolwiek nie jest żadnym wyzwaniem,
to rzemiosło. Wyzwaniem jest zaprojektowanie programu, ale
to się robi w oderwaniu od języka programowania.
Hmmm, mam inne zdanie, a wyprowadzam je z mojej obserwacji wielu osób
piszących programy. Przeciętny programista BASCOMa nie musi wiedziec nic
na temat komunikacji układu X z Y - i to jest rzemiosło. Programista C w
tej samej sytuacji zazwyczaj musi dośc dokładnie poznać dokuentację
obydwu - i to jest wyzwanie. Pisanie w C/ASM w przypadku
mikrokontrolerów to jedna większe wyzwanie niż w BASCOMie/etc.
Może BASCOM to zły przykład, ale w ogólnym przypadku pisanie w C wymaga
od programisty znacznie więcej niż znajomosci paru funkcji wbudowanych w
język. Z resztą nie trzeba daleko szukac, bo w wielu firmach pracują
"programisci" pisząc przez pare lat programy skłądające się z kawałków
truwialnego kodu w delphi przelatanych SQLem (w dodatku takich samych).
To jest dopiero nuda i rzemiosło.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: [OT] avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Sun, 3 Jul 2005 21:54:49 +0200
Sebastian Bialy wrote:
Nie zrozum mnie źle, ale pisanie w kompilatorze C++ nie używając klas
dalej uważam za pisanie w C.
A co jest złego w klasach, jeśli nie używa się funkcji wirtualnych
i typowania dynamicznego? Przecież one się kompilują w dokładnie
taki sam sposób, jak struktury w C, a na poziomie języka dają kilka
dodatkowych możliwości: dziedziczenie implementacji, szczegółowa
kontrola dostępu do składowych itd.
W zasadzie dla mnie pisanie w C++ to używanie klas/szblonów/STL.
To się średnio nadaje do mikrokontrolerów 8-bitowych na razie.
Tak więc po prostu inaczej definiuje "pisanie w C++"
Szczerze mówiąc to dość osobliwa definicja. ;-) Dla mnie pisanie
w C++ polega na używaniu mechanizmów C++ -- a tutaj użycie
klas i szablonów nie różni się niczym od tego, czego używa się na
64-bitowcu. Natomiast jeśli chodzi o STL, to go oczywiście na
"maluchach" nie używam, ale nie ma przecież takiego obowiązku.
Nawet standard języka wspomina na ten temat, wyróżniając
środowiska hosted i freestanding.
i coraz bardziej wymusza stosowanie czasochłonnych
/pamięciochłonnych/zasobożernych rozwiązań, zamiast
Nie zawsze, kwestia przemyślenia struktury programu. Natomiast oddalenie
się od maszyny wbrew pozorom bywa pomocne, bo dzięki temu środowiska
uruchomieniowe mogą stosować takie transformacje kodu (zwłaszcza
dynamiczne!), o których sobie w C++ można pomarzyć. Widziałem juz
benchmarki, w których kod w Javie pobił wydajnością program w C++
-- wszystko dzięki optymalizacjom dynamicznym. Nawet mnie to kiedyś
dość mocno interesowało, ale później zmieniłem kurs na specyfikowanie
rozmaitych systemów i ich weryfikację.
acz zakładam, że są sytuację, kiedy się przydaje.
Tylko żeby wówczas komuś nie urwało ręki na ten przykład...
ale po prostu jestem "wychowany" na asm Z80/6502/680x0/x86
i mam jakieś zboczenie w tym kierunku.
Ja również, ale staram się nie przykładać jednej miarki do rozwiązań
służących do zupełnie różnych celów. Są rzeczy, gdzie C++ pozwoli
w doskonały sposób rozwiązać problem, a są i takie, gdzie to będzie
horrorem, natomiast inne narzędzie pozwoli na wygodne zapisanie
rozwiązania. Przyroda jest przebogata i należy z tego korzystać, a
nie ograniczać się do jednego rozwiązania jednego sposobu myślenia.
Liczba istniejących języków programowania jest dowodem, że nie
istnieje coś takiego, jak najlepszy język. Są tylko mniej lub bardziej
dobre do rozwiązywania problemów ze ściśle określonej dziedziny.
Jeśli tą dziedziną jest programowanie niskopoziomowe, to C jest
dobre, a C++ bardzo dobre, więc trochę dziwi mnie, że podchodzisz
do tego ostatniego jak do jeża -- mity o rzekomej złożoności kodu
wynikowego wyprodukowanego przez kompilator C++ skutecznie
rozwiewa zapoznanie się z listingami disasemblera. Wiele kompilatorów
(w tym GCC) ma wspólny optymalizator i generator kodu dla wielu
języków programowania -- w takich przypadkach to nie są nawet
mity, ale zwyczajne bzdury.
Inna sprawa, że przeciętny biznesmen powiedziałby, że trace czas na
pierdoły.
Wprost z ust mi to wyjąłeś. ;-P
Programista C w tej samej sytuacji zazwyczaj musi dośc dokładnie
poznać dokuentację obydwu - i to jest wyzwanie.
Zgoda, ale to się robi podczas projektowania programu, a nie jego
implementowania (choć oczywiście te dwie fazy mogą się ze sobą
przeplatać). Gdyby taki przemyślany program zapisać w Bascomie,
to również doskonale zadziała. Programowanie w C albo czymkolwiek
innym żadnej nowej jakości nie dodaje.
Z resztą się zgadzam.
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Sun, 03 Jul 2005 23:35:09 +0200
Piotr Wyderski wrote:
A co jest złego w klasach, jeśli nie używa się funkcji wirtualnych
i typowania dynamicznego? Przecież one się kompilują w dokładnie
taki sam sposób, jak struktury w C, a na poziomie języka dają kilka
dodatkowych możliwości: dziedziczenie implementacji, szczegółowa
kontrola dostępu do składowych itd.
Ależ o te własnie wirtualne chodzi :) Co mi po klasach, które nie dają w
zasadzie nic ciekawego do kodu poza pewnym porzadkowaniem metod+danych.
Z resztą co do klas - troche głupio ich uzywać nie mając pod ręką
operatorów new/delete, wyjątków czy poprawionych includów (mówie teraz o
AVR-GCC). Na razie AVR-GCC nie jest dobrym pomysłem do pisania w C++.
Choć już za chwile, juz za momencik zamierzam zawalczyć z ARM i
rozpasanymi przestrzeniami RAM rzędu 128kB :)
i coraz bardziej wymusza stosowanie czasochłonnych
/pamięciochłonnych/zasobożernych rozwiązań, zamiast
Nie zawsze, kwestia przemyślenia struktury programu. Natomiast oddalenie
się od maszyny wbrew pozorom bywa pomocne, bo dzięki temu środowiska
uruchomieniowe mogą stosować takie transformacje kodu (zwłaszcza
dynamiczne!), o których sobie w C++ można pomarzyć. Widziałem juz
benchmarki, w których kod w Javie pobił wydajnością program w C++
-- wszystko dzięki optymalizacjom dynamicznym. Nawet mnie to kiedyś
dość mocno interesowało, ale później zmieniłem kurs na specyfikowanie
rozmaitych systemów i ich weryfikację.
Akurat Java i C++ to żadne różnica, prawie identyczny zapis, prawie
identyczne zastosowanie (poza przenośnym kodem wynikowym). Dla
programisty tak samo się pisze w obydwu. Z resztą teraz mam troche
dłubania w Javie (OpenGL) i jestem pod wrażeniem, że w zasadzie chodzi
tak samo jak kod natywny (jest fajna wersja QuakeII pod Javę :).
Jednak ponieważ rozmawiamy o uC w końcu, to dalej nie wiem, czy jest
sens stosowania języków _za wysokiego_ poziomu do uC. Tam często trzeba
dlubac po rejestracj/pamięci albo liczyć cykle czy stosować sztuczki
przedziwne żeby zmniejszyć ilość instrukcji asm. Chyba nie ma chwilowo
nic lepszego niż C do pisania programów na uC. Mam na mysli jakies
większe projekty, a nie miganie diodą w BASCOMIE w delach dydaktycznych.
Oczywiście BASCOM rulez ale czy ktoś napisal w nim obsługe FAT na MMC
czy jakiś algorytm szyfrujący ?
acz zakładam, że są sytuację, kiedy się przydaje.
Tylko żeby wówczas komuś nie urwało ręki na ten przykład...
No bez przesady :) takie błędy też można znaleźć w sofcie każdym. Z
resztą jakoś ludzie piszą w C aplikacjie bardzo powazne i nie ma kłopotu :)
ale po prostu jestem "wychowany" na asm Z80/6502/680x0/x86
i mam jakieś zboczenie w tym kierunku.
Jeśli tą dziedziną jest programowanie niskopoziomowe, to C jest
dobre, a C++ bardzo dobre, więc trochę dziwi mnie, że podchodzisz
do tego ostatniego jak do jeża -- mity o rzekomej złożoności kodu
wynikowego wyprodukowanego przez kompilator C++ skutecznie
rozwiewa zapoznanie się z listingami disasemblera.
Jestem ciekawy co wypluje gcc po kompilaci kodu z obiektami i metodami
wirtualnymi :) Trzeba będzie się poświęcić dla sztuki i pobawić
obiektami na ATTiny ... Swoją drogą od dawna pisze obiektowo i czuje się
troche jak bez ręki przy dłubaniu w czystym C ...
Programista C w tej samej sytuacji zazwyczaj musi dośc dokładnie
poznać dokuentację obydwu - i to jest wyzwanie.
Zgoda, ale to się robi podczas projektowania programu, a nie jego
implementowania (choć oczywiście te dwie fazy mogą się ze sobą
przeplatać). Gdyby taki przemyślany program zapisać w Bascomie,
to również doskonale zadziała. Programowanie w C albo czymkolwiek
innym żadnej nowej jakości nie dodaje.
Jasne, że każdy problem można zapisać równie dobrze w każdym języku,
jednak nie w każdym optymalnie i nie w każdym jest baza gotowych
rozwiązań. Z resztą BASCOM chyba nie powstał po to, aby pisać w nim
wielkie projekty na uC, widać to po składni.
Z resztą się zgadzam.
A to ja już nic nie pisze wobec tego w tej odnodze. EOT :) Pozdrawiam.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: [OT] avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Mon, 4 Jul 2005 17:07:34 +0200
Sebastian Bialy wrote:
Ależ o te własnie wirtualne chodzi :)
Szczerze mówiąc to nie widzę większej potrzeby intensywnego
używania metod wirtualnych na mikrokontrolerach. A jesli jednak
ich trzeba, to też dużo nie kosztują: jeden dodatkowy wskaźnik
w klasie, a w kodzie to jedna dereferencja i jeden skok pośredni.
Problemy ze złożonością pojawiają się, gdy korzysta się z metod
wirtualnych w hierarchii klas z dziedziczeniem wielobazowym, ale
tego rzadko kiedy potrzeba na "prawdziwych" komputerach.
Co mi po klasach, które nie dają w zasadzie nic ciekawego do
kodu poza pewnym porzadkowaniem metod+danych.
Właśnie o to porządkowanie chodzi, żebyś się w większym
projekcie nie zabił zaplątując we własne spodnie. ;-)
Z resztą co do klas - troche głupio ich uzywać nie mając pod ręką
operatorów new/delete
A dlaczego na mikrokontrolerze masz ich nie mieć? Są za darmo.
Oprócz tego masz idiom "placement new", na mikrokontrolerach
również bardzo przydatny i zupełnie darmowy.
wyjątków
Wyjątki są za drogie w obsłudze, maluchy mają za mało RAMu na stos.
Każdy znany mi kompilator pozwala wyłączyć ich obsługę.
czy poprawionych includów (mówie teraz o AVR-GCC).
A co Ty chcesz inkludować na mikrokontrolerze, gdzie
wszystko jest wysoce niestandardowe? :-)
Na razie AVR-GCC nie jest dobrym pomysłem do pisania w C++.
Jest bardzo dobrym pomysłem, tylko przed pisaniem trzeba
skończyć z wiarą w mity. ;-)
Akurat Java i C++ to żadne różnica, prawie identyczny zapis, prawie
identyczne zastosowanie (poza przenośnym kodem wynikowym).
Szablony w Javie działają na zupełne innej zasadzie niż w C++ -- tam
nie tylko składnia, ale cała filozofia za nimi stojąca jest zupełnie inna.
Dla programisty tak samo się pisze w obydwu.
Oprócz wspomnianych już szablonów w C++ masz dziedziczenie
wielobazowe, dziedziczenie wirtualne, zupełnie inne zasady wiązania
nazwy obiektu z obiektem (m.in. lookup Koeniga -- to chyba jedyny
język, który implementuję ten wynalazek) i przestrzenie nazw. W C++
się pisze zupełnie inaczej niż w Javie, no chyba, że ktoś zna C++
na poziomie "C z klasami" i w takim zakresie go używa -- wówczas
zgoda, ale czuję się w obowiązku donieść, że to zaledwie ułamek
dostępnych możliwości i daje się zapisać w tym języku takie cuda,
że mało kto zdaje sobie sprawę, że to w ogóle możliwe. Ot, choćby
takie sprawdzanie w czasie kompilacji hierarchii dziedziczenia za
pomocą bardzo pokrętnie skonstruowanego szablonu i niecodziennego
wykorzystania operatora sizeof. Majstersztyk.
Jednak ponieważ rozmawiamy o uC w końcu, to dalej nie wiem, czy jest
sens stosowania języków _za wysokiego_ poziomu do uC.
Jeśli oferowane przez nie możliwości przekładają się w łatwy sposób
na kod wynikowy, to oczywiście, że tak. W C++ większość nowych
możliwości jest dostępna zupełnie za darmo.
Tam często trzeba dlubac po rejestracj
To jest nieosiągalne nawet w C, potrzeba wstawki asemblerowej.
A to się robi równie łatwo w C++.
pamięci
C++ nie różni się pod tym względem od C.
albo liczyć cykle
Do tego też trzeba wstawki asemblerowej.
czy stosować sztuczki przedziwne żeby zmniejszyć ilość instrukcji asm.
Będzie ich tyle samo w C++, co w C.
Chyba nie ma chwilowo nic lepszego niż C do pisania programów na uC.
Jest, C++.
Oczywiście BASCOM rulez ale czy ktoś napisal w nim obsługe FAT na MMC
czy jakiś algorytm szyfrujący ?
A niby czemu miałoby się nie dać, i to nawet wydajnie? Znowu jakieś mity.
;-)
No bez przesady :)
Nie przesadzam, w różnych miejscach takie programy są stosowane.
W jednym program się zawiesi i będzie odtwarzał tę samą piosenkę,
w innym bank straci kilkadziesiąt tysięcy dolarów, a w jeszcze innym
trzeba się będzie zastanawiać, co zrobić z denatem...
Z resztą jakoś ludzie piszą w C aplikacjie bardzo powazne i nie ma kłopotu
)
Są kłopoty, czasami w postaci ofiar śmiertelnych i kalek.
Swoją drogą od dawna pisze obiektowo i czuje się
troche jak bez ręki przy dłubaniu w czystym C ...
Więc je wywal i przejdź na jego następcę, w czym -- oprócz
mitów -- widzisz problem?
Jasne, że każdy problem można zapisać równie dobrze w każdym języku,
Nie, nie równie dobrze. W jednych lepiej, w innych gorzej i dlatego
jest ich tyle.
jednak nie w każdym optymalnie
A jak definiujesz kryterium optymalności i w jaki sposób chcesz
sprawdzać jego spełnialność? Chyba nadużywasz tego słowa. ;-)
A to ja już nic nie pisze wobec tego w tej odnodze. EOT :)
Szkoda.
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Mon, 04 Jul 2005 18:16:49 +0200
Piotr Wyderski wrote:
[Soko nie chcesz EOT ...]
Ależ o te własnie wirtualne chodzi :)
Szczerze mówiąc to nie widzę większej potrzeby intensywnego
używania metod wirtualnych na mikrokontrolerach. A jesli jednak
ich trzeba, to też dużo nie kosztują: jeden dodatkowy wskaźnik
w klasie, a w kodzie to jedna dereferencja i jeden skok pośredni.
Problemy ze złożonością pojawiają się, gdy korzysta się z metod
wirtualnych w hierarchii klas z dziedziczeniem wielobazowym, ale
tego rzadko kiedy potrzeba na "prawdziwych" komputerach.
Widzisz, mamy zupełnie inne podejście do programowania obiektowego - w
moim przypadku, kiedy już decyduje się na C++ to zycze sobie PEŁNEGO c++
włacznie z STL, metodami wirtualnymi, wyjątkami i cała masą innych
fajnych rzeczy. Jesli natomiast za pomocą kompilatora C++ składam proste
programy to nie uważam tego za pisanie w C++ a jedyne za używanie
kompilatora C++.
Chyba się tutaj nie zgodzimy, bo to po prostu nasze indywidualne zdania
na temat "definicji C++".
Co mi po klasach, które nie dają w zasadzie nic ciekawego do
kodu poza pewnym porzadkowaniem metod+danych.
Właśnie o to porządkowanie chodzi, żebyś się w większym
projekcie nie zabił zaplątując we własne spodnie. ;-)
Owszem, dlatego tak bardzo cenie C++, jednak z drugiej strony: co to
znaczy większy projekt ? Jesteś ograniczony dostępnym ram/rom w uC i w
zasadzie kazdy większy projekt na taki uC da się objąć i zapanowac nad
nim. Co innego pisanie duzych aplikacji na peceta. Po prostu ilośc kodu
jaki można wrzucić do przeciętnego AVRa nie jest moim zdaniem "dużym"
projektem. Fakt - C++ ładnie pozwala odciązyć programistę od myślenia o
róznych pierdołach, ale z drugiej strony pisząc na 90S2313 w zasadzie
jesteś w stanie zapamiętać wszystkie zmienne jakie używasz i w jakim
pliku ;)
To nie znaczy że nie należy pisać w C++ na uC - tylko że imho argument
komplikacji jest tu troche nie w tej skali.
Z resztą co do klas - troche głupio ich uzywać nie mając pod ręką
operatorów new/delete
A dlaczego na mikrokontrolerze masz ich nie mieć? Są za darmo.
Oprócz tego masz idiom "placement new", na mikrokontrolerach
również bardzo przydatny i zupełnie darmowy.
Zwróć uwagę na masę kłopotów, które się "robią same" takie jak tworzenie
tymczasowych obiektów przy arytmetyce przeciążonych operatorów (które
tak lubie stosować :), konstruktory kopiujące (często niepotrzebne) i
tym podobne rzeczy, których IMHO kompilator raczej nie zoptymalizuje
(może się mylę ?). Przy <1kB pamięci RAM może się okazać, że stworzenie
tymczasowego obiektu w RAM jest niewykonalne. Można powiedziec, że o ile
C++ ułatwia pewne rzeczy składniowo, to czasami potrafi wygenerować kod
nadmiarowy wynikający z samej definicji obiektu przez programistę.
wyjątków
Wyjątki są za drogie w obsłudze, maluchy mają za mało RAMu na stos.
Każdy znany mi kompilator pozwala wyłączyć ich obsługę.
Szkoda :) Czyli "-" dla C++ ? :)
czy poprawionych includów (mówie teraz o AVR-GCC).
A co Ty chcesz inkludować na mikrokontrolerze, gdzie
wszystko jest wysoce niestandardowe? :-)
Jesli poczytasz helpa do WinAVR to dowiesz się, że w ostatniej wersji
jaką dałem radę ściągnąć częśc plików jest "not C++ safe" a konkretnie
nie mają 'extern "C"'. Czyli raczej nie da się korzystać swobodnie (choć
mam nadzieje, to nie będzie wiele dla twórców poprawić).
Na razie AVR-GCC nie jest dobrym pomysłem do pisania w C++.
Jest bardzo dobrym pomysłem, tylko przed pisaniem trzeba
skończyć z wiarą w mity. ;-)
I ostro zacisnąć pasa w tym C++ :)
Akurat Java i C++ to żadne różnica, prawie identyczny zapis, prawie
identyczne zastosowanie (poza przenośnym kodem wynikowym).
Szablony w Javie działają na zupełne innej zasadzie niż w C++ -- tam
nie tylko składnia, ale cała filozofia za nimi stojąca jest zupełnie inna.
Oj, wiadomo że kazdy język ma spore róznice, ale chodzi o to, że
większośc programistów Java jest w stanie pisać w C++ i na odwrót. To są
języki BARDZO podobne, że wręcz wspomne o samej składni, która jest
prawie identyczna. A to że są szczegóły rózne (brak destruktorów w Javie
mnie dobił, choć rozumiem dlaczego ich nie ma) to wiadomo. Co do
filozofi to nie wiem czy mówisz o całym jezyku czy tylko o jego częsci,
ale dla mnie nie było zadnych kłopotów w pare dni przegryźć się przez
róznice Java-C++ i pisac programy w Javie, więc filozofia nie jest aż
taka rózna. Acz daleko mi do miana programisty javy.
Dla programisty tak samo się pisze w obydwu.
Oprócz wspomnianych już szablonów w C++ masz dziedziczenie
wielobazowe, dziedziczenie wirtualne, zupełnie inne zasady wiązania
nazwy obiektu z obiektem (m.in. lookup Koeniga -- to chyba jedyny
język, który implementuję ten wynalazek) i przestrzenie nazw. W C++
się pisze zupełnie inaczej niż w Javie, no chyba, że ktoś zna C++
na poziomie "C z klasami" i w takim zakresie go używa -- wówczas
zgoda, ale czuję się w obowiązku donieść, że to zaledwie ułamek
dostępnych możliwości i daje się zapisać w tym języku takie cuda,
że mało kto zdaje sobie sprawę, że to w ogóle możliwe. Ot, choćby
takie sprawdzanie w czasie kompilacji hierarchii dziedziczenia za
pomocą bardzo pokrętnie skonstruowanego szablonu i niecodziennego
wykorzystania operatora sizeof. Majstersztyk.
Jakie ma znaczenie majsteresztyk, skoro można badać typy/rzutować z
użyciem mechanizmów w C++ ? Tzn jestem wrogiem sztuczek
programistycznych, bo to zamiast ułatwiać zycie - zaciemnia tak, że
komuś rękę urwie kiedyś :P
Co do przestrzeni nazw - ile to programów w C wyrosło bez tego "bajeru"
i jakoś nikt specjelnie nie płakał... Fajno ze jest ale można się było
obejść bez. To troche tak, że brak "for" byłby bolesny, ale brak
"namespace" jakoś nie spowodował zastoju C (dalej jajko linuxa w nim
skrobią, choć istniało by wiele lepszych języków).
Jednak ponieważ rozmawiamy o uC w końcu, to dalej nie wiem, czy jest
sens stosowania języków _za wysokiego_ poziomu do uC.
Jeśli oferowane przez nie możliwości przekładają się w łatwy sposób
na kod wynikowy, to oczywiście, że tak. W C++ większość nowych
możliwości jest dostępna zupełnie za darmo.
Hmmm ok. Zakładam, że teoretycznie masz rację. Jednak jestem przekonany
że przeciętny dobry programista C++ na dużych pecetach wybije sobie zęby
od razu o mały RAM/mały stos w uC. Pisanie na uC jednak rózni się od
pisania na duże komputery. Dużo zależy od umiejśtności programisty,
jednak jesli wykastrujemy C++ z STL, wyjątków i paru innych duperelek to
okaże się, że w zasadzie pozostał C + troche "bajerów składniowych" typu
szablony. To dla mnie nie C++ (ale to wyjasniłem, że to kwestia definicji).
Tam często trzeba dlubac po rejestracj
To jest nieosiągalne nawet w C, potrzeba wstawki asemblerowej.
A to się robi równie łatwo w C++.
Hmmm moment, nie chodzi mi o rejestry uC tylko o rejestry specjalne, z
resztą chodziło mi o języki odległe od sprzętu a nie o C++ który
oczywiście jest "lepszym C" choć zdaje sobie sprawę, że wiele osób mogło
by mnie zamordować za to stwierdzenie :)
pamięci
C++ nie różni się pod tym względem od C.
albo liczyć cykle
Do tego też trzeba wstawki asemblerowej.
czy stosować sztuczki przedziwne żeby zmniejszyć ilość instrukcji asm.
Będzie ich tyle samo w C++, co w C.
J/w.
Chyba nie ma chwilowo nic lepszego niż C do pisania programów na uC.
Jest, C++.
Łomatko :) No dobra, C++ wykastrowany, robocza nazwa "1/2C++" może byc ? :)
Oczywiście BASCOM rulez ale czy ktoś napisal w nim obsługe FAT na MMC
czy jakiś algorytm szyfrujący ?
A niby czemu miałoby się nie dać, i to nawet wydajnie? Znowu jakieś mity.
;-)
Heh, no ja się nie podejmuje, chyba że dobrze zapłacisz :) A
potrzebujesz FAT w BASCOMIE ? :P Cos mi się zdaje że BASCOM nie powstał
do takich zastosowań (co nie zienia faktum że można).
No bez przesady :)
Nie przesadzam, w różnych miejscach takie programy są stosowane.
W jednym program się zawiesi i będzie odtwarzał tę samą piosenkę,
w innym bank straci kilkadziesiąt tysięcy dolarów, a w jeszcze innym
trzeba się będzie zastanawiać, co zrobić z denatem...
Dziwnym trafem nie przeszkadzają te negatywne doświadczenia na całym
swiecie stosować windowsa do obsługi szaf muzycznych (zaliczyłem już 4
sztuki wesoło zawieszone na niebieskim ekranie), bankomatów ze znakiem
zachęty C:> na ekranie (przoduje tu PKO, 2 trafienia) tudzież
informatorów turystycznych nie mogących znaleźć pliku "xxxx.dll" (chyba
wszystkie jakie widziałem miały jakiś mankament typu "programista dał
dupy"). Jakoś nikt się nie przejmuje stabilnoscią bankomatu, bo
przeciętny klient jest mało znaczacy. Co do aparatury medycznej - mysle
że zakładając odpowiedni poziom kontroli - kazdy jezyk nalezy
gruntownie przetestowac, a im wyżej się wspinasz w łatwości
programowania, tym mniej rzeczy zalezy od programisty a więcej od
dostawcy bibliotek/kompilatora/etc. Ciekawe czy takie aplikacje dla .NET
na ten przykład można stosować w medycynie ? W sumie ja bym nie zaufał
tym gotowcom z MS.
Z resztą jakoś ludzie piszą w C aplikacjie bardzo powazne i nie ma kłopotu
Są kłopoty, czasami w postaci ofiar śmiertelnych i kalek.
Podobnie jak piszących w C++/BASCOMie/whatever, ale nie mam statystyk
więc nie mam odwagi wyrokowac, czy więcej ...
Swoją drogą od dawna pisze obiektowo i czuje się
troche jak bez ręki przy dłubaniu w czystym C ...
Więc je wywal i przejdź na jego następcę, w czym -- oprócz
mitów -- widzisz problem?
We wszystkim o czym dyskutujemy, co praktycznie zawsze ma źródło w
"małej ilości RAMu" co wymusza kastrację.
Jasne, że każdy problem można zapisać równie dobrze w każdym języku,
Nie, nie równie dobrze. W jednych lepiej, w innych gorzej i dlatego
jest ich tyle.
"Równie dobrze" w tym przypadku oznaczało, że można napisac każdy
program w kazdym języku, ale:
jednak nie w każdym optymalnie
A jak definiujesz kryterium optymalności i w jaki sposób chcesz
sprawdzać jego spełnialność? Chyba nadużywasz tego słowa. ;-)
Optymalnie: szybki kod, mało zajetości RAMu (w szczególności na pierdoły
typu obiekty tymczasowe), zwarty kod. Każdemu przypisuje wage w
zalezności od projektu i tak pisze, aby zoptymalizowac funkcję celu :P.
W C/C++ mam pod kontrolą bardzo wiele elementów. W wyższych językach
coraz mniej. Dlatego w przypadku uC raczej nie chce pisać w BASCOMie, bo
mam mniejszy wpływ na generowany przez niego kod.
A to ja już nic nie pisze wobec tego w tej odnodze. EOT :)
Szkoda.
No dobra, ale się rozpisujemy, ja proponuje powoli kończyć, choć z
przyjemnością sie dyskutuje.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: [OT] avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Mon, 4 Jul 2005 21:17:06 +0200
Sebastian Bialy wrote:
[Soko nie chcesz EOT ...]
A czemu mam chcieć, dyskusja wygląda ciekawie. :-)
Widzisz, mamy zupełnie inne podejście do programowania obiektowego
Nie, do programowaia w C++. O programowaniu obiektowym niewiele
mówiliśmy, a poza tym C++ dość mało ma z nim wspólnego.
moim przypadku, kiedy już decyduje się na C++ to zycze sobie PEŁNEGO c++
włacznie z STL, metodami wirtualnymi, wyjątkami i cała masą innych
fajnych rzeczy.
A jesli piszesz w C, to życzysz sobie pełnego zestawu funkcji
matematycznych,
funkcji wejścia-wyjścia oraz plików, mimo, że w danym systemie pojęcie pliku
nie
ma sensu?
To nie znaczy że nie należy pisać w C++ na uC - tylko że imho argument
komplikacji jest tu troche nie w tej skali.
Jaka komplikacja?
Zwróć uwagę na masę kłopotów, które się "robią same" takie jak tworzenie
tymczasowych obiektów przy arytmetyce przeciążonych operatorów (które
tak lubie stosować :),
Przeciążone operatory arytmetyczne na AVR-ku?!
konstruktory kopiujące (często niepotrzebne) i tym podobne
rzeczy, których IMHO kompilator raczej nie zoptymalizuje
(może się mylę ?).
Zoptymalizuje, choć kiedyś miał kłopoty z NRVO i powstał taki tymczasowy
idiom "operator(parametry) return nazwa_zmiennej { treść_operatora }"
-- ostatnio go wycofano.
Można powiedziec, że o ile C++ ułatwia pewne rzeczy składniowo,
to czasami potrafi wygenerować kod nadmiarowy wynikający z
samej definicji obiektu przez programistę.
Jasne, ale należy do tego dodać, że programista powinien był
wiedzieć na czym polega działanie użytego mechanizmu i być
świadom skutków ubocznych. Pierwsze przykazanie: mysleć. ;-)
Wyjątki są za drogie w obsłudze, maluchy mają za mało RAMu na stos.
Każdy znany mi kompilator pozwala wyłączyć ich obsługę.
Szkoda :) Czyli "-" dla C++ ? :)
A czy fakt, że karaluchy miewają problemy z opanowaniem
chińskiego cos chińskiemu ujmuje? :-)
To żaden minus, po prostu nie ma miejsca na stos wyjątków.
A jak nie ma stosu wyjątków, to nie ma i wyjątków.
Jesli poczytasz helpa do WinAVR to dowiesz się, że w ostatniej wersji
jaką dałem radę ściągnąć częśc plików jest "not C++ safe" a konkretnie
nie mają 'extern "C"'
no to nadaj im go hurtem, pisząc w swoim kodzie
extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include <cośtam.h>
}
int main() { [...]
Tego Ci brakowało? :-)
I ostro zacisnąć pasa w tym C++ :)
Rezygnując z wyjątków to ostro? A co m.in. z nieporównywalnie
bardziej potrzebnym programowaniem generycznym i dziedziczeniem,
które żadnych nakładów nie wymaga?
Oj, wiadomo że kazdy język ma spore róznice, ale chodzi o to, że
większośc programistów Java jest w stanie pisać w C++ i na odwrót.
Ano jest, wykorzystując jakieś 20% dostępnych możliwości.
Reszty się przenieść nie da.
Co do filozofi to nie wiem czy mówisz o całym jezyku czy tylko o jego
częsci,
Tylko o Java generics -- działają na zupełnie innej zasadzie niż
szablony znane z C++.
ale dla mnie nie było zadnych kłopotów w pare dni przegryźć się przez
róznice Java-C++
Generics weszły do Javy tak niedawno, że chyba nie ma
o nich jeszcze wiele w żadnej książce. :-)
Jakie ma znaczenie majsteresztyk, skoro można badać
typy/rzutować z użyciem mechanizmów w C++ ?
Cały czas mówię o tym, co da się osiągnąć w standardowym C++,
a nie dzięki rozszerzeniom albo zewnętrznym narzędziom. Stąd
wszystko jest "mechanizmem C++", więc niezupełnie rozumiem, o
co Ci chodzi, ale przypuszczam, że o dynamic_cast<>. Jeśli tak,
to wartość dynamic_cast jest obliczana w czasie działania programu,
a nie jego kompilacji, więc się nie nadaje do większości ciekawych
zastosowań, m.in. generowania optymalnej struktury programu
dla danego zbioru parametrów (Twój wątek też nalezy do tego
zbioru). Mozna chcieć otrzymać w C++ takie mechanizmy o
dużym znaczeniu praktycznym:
1. Optymalne przekazywanie parametrów do funkcji i metod.
Niemodyfikowalne parametry można przekazywać w C++ przez
stałą wartość albo przez referencję do obiektu stałego. Jeśli
parametr jest "mały" (np. jakaś liczba naturalna), to najtaniej
będzie przekazać go przez wartość. Gdy jest "duży" (obiekt
klasy o wielu składowych niestatycznych itp.), to znacznie
taniej wyjdzie przekazać referencję niż tworzyć jego tymczasową
kopię w rekordzie aktywacji wywoływanej procedury. Bardzo
małe obiekty klas (np. zawierające tylko jedno pole typu int)
jednak lepiej przekazywać przez wartość, bo dostęp pośredni
jest kosztowniejszy niż bezpośredni. Ponieważ z góry nie
wiadomo, jaka metoda będzie optymalna w konkretnym
przypadku (bo zmieniamy docelowy procesor na większy,
albo po prostu rozbudowaliśmy klasę o nowe pola, czy też
pozbyliśmy się niepotrzebnych), chcielibyśmy mieć prosty
w użyciu mechanizm, który pozwoli kompilatorowi wybrać
optymalną dla danego parametru metodę przekazywania.
Czy da się to zrobić nie uciekając się do rozszerzeń albo
nie edytując w pocie czoła wszystkich plików źródłowych
po każdej zmianie definicji typów?
2. Wymuszanie rozwijania pętli. Chcielibyśmy napisać klasę
działającą na wektorch danych podanego typu, o podanej
długości N. Chcemy mieć m.in. operację ich dodawania.
Moglibyśmy napisać w pętli
for(k = 0; k < N; ++k)
c[k] = a[k] + b[k];
ale gdy N jest małe, to stracimy znacznie więcej czasu
na obsługę pętli niż na właściwe dodawanie. Moglibyśmy
więc w takich przypadkach rozwinąć tę pętlę i dla N = 3
zastąpić ją
c[0] = a[0] + b[0];
c[1] = a[1] + b[1];
c[2] = a[2] + b[2];
Gdyby jednak N było duże, to takie rozwinięcie spowodowałoby
gigantyczny wzrost objętości kodu, więc tu jednak lepsza byłaby
pętla. Poza tym jesteśmy leniwi i nie chcemy na sztywno
wkodowywać rozwinięć, bo może się nam zmienić maszyna albo
po prostu więcej się dowiemy i nasza definicja tego, jakie N jest
małe, a jakie duże może się zmienić. Chcielibyśmy móc tylko
podać kompilatorowi w jednym miejscu to, co w chwili obecnej
uważamy za małe i jakiego N potrzebujemy, a o wygenerowanie
odpowiednich wariantów niech on się już zatroszczy sam -- w
końcu lenistwo jest motorem postępu. My będziemy tylko
pisać
wektor<4> a, b, c;
c = a + b;
albo
wektor<1000> a, b, c;
c = a + b;
a nasz kod niech sobie sam tak zmodyfikuje strukturę, by
w pierwszym przypadku (N=4) w pełni się rozwinął, a drugi
został policzony w pętli, bo akurat za małe uznajemy wszystko,
co ma mniej niż 6 elementów. Da się coś takiego zrobić?
3. Optymalny typ zakresowy. Do iterowania po różnych zakresach
parametrów przydałoby się mieć typ range, któremu powiemy tylko,
jakie wartości minimalne i maksymalne może przyjąć parametr, a
kompilator niech dobierze mu odpowiedni typ. Jeśli ten typ będzie
za duży, np. 64-bitowy, to się program będzie bardzo wolno
wykonywał, a jeśli za mały, to nastąpi przepełnienie i program się
popsuje. Dlatego typ iteratora ma być w sam raz i być dobierany
automatycznie na podstawie podanego przez nas zakresu oraz
na podstawie zakresów właściwych dla danej maszyny (np. int
ma 16 bitów). Nas to nie obchodzi -- ma działać, i to działać
optymalnie.
for(range<-10,150> k = -5; k < p; ++k)
[...]
Da się to zrobić?
Tzn jestem wrogiem sztuczek programistycznych
Sztuczek? Każdy z powyższych kodów będzie małym dziełem sztuki
(o ile da się go napisać -- da się? :-)), a nie żadną sztuczką... :-)
bo to zamiast ułatwiać zycie - zaciemnia tak, że komuś rękę urwie kiedyś
P
Zaciemnia? Trudno sobie wyobrazić czytelniejsze deklaracje niż, odpowiednio:
fn(best_mode<int>::type k);
wektor<457> w;
range<0, 2779> i;
Co do przestrzeni nazw - ile to programów w C wyrosło bez tego "bajeru"
Nieakceptowalnie wiele.
ale brak "namespace" jakoś nie spowodował zastoju C
Zrobisz konflikt deklaracji, to będziesz miał zastój. ;-)
Hmmm ok. Zakładam, że teoretycznie masz rację. Jednak jestem przekonany
że przeciętny dobry programista C++ na dużych pecetach wybije sobie zęby
od razu o mały RAM/mały stos w uC.
Nie wiem, nie prowadziłem na ten temat badań statystycznych.
Ja sobie radzę równie dobrze w obu tych środowiskach, dlatego
pozwalam sobie klasyfikować wiele Twoich uwag jako mity --
nie próbowałeś czegoś zrobić, a z uporem bronisz przekonań,
które nie mają oparcia w faktach. Spróbuj, chętnie podyskutuję,
ale z rzeczywistymi doświadczeniami, a nie z uprzedzeniami. ;-)
Dużo zależy od umiejśtności programisty,
Jak zawsze.
jednak jesli wykastrujemy C++ z STL, wyjątków i paru innych duperelek to
okaże się, że w zasadzie pozostał C + troche "bajerów składniowych" typu
szablony.
Heh, Sebastianie, jeśli uważasz szablony za bajerek składniowy, to
z pewnością nigdy z nich nie korzystałeś w bardziej zaawansowany
sposób. Wyrzuć z C++ cokolwiek sobie życzysz, ale szablony mi
zostaw, bo to głównie z ich powodu używam tego języka. :-)
Hmmm moment, nie chodzi mi o rejestry uC tylko o rejestry specjalne
Procesora? No to tym bardziej się do nich nie dostaniesz z poziomu C,
tylko wstawka asemblerowa (albo rozszerzenie, jak sfr w Keilu) będzie
dostatecznie silna.
Łomatko :) No dobra, C++ wykastrowany, robocza nazwa "1/2C++" może byc ?
)
Ale _z czego_ wykastrowany, z wyjątków? To jest dla Ciebie połowa tego
języka? :-)
Cos mi się zdaje że BASCOM nie powstał do takich
zastosowań (co nie zienia faktum że można).
Pewnie i nie powstał, ale jeśli ktoś mi zaproponuje dostatecznie
wysoki stosik zachęcaczy, to i w kodzie binarnym mu to napiszę. :-)
Dziwnym trafem nie przeszkadzają te negatywne doświadczenia na całym
swiecie stosować windowsa do obsługi szaf muzycznych (zaliczyłem już 4
sztuki wesoło zawieszone na niebieskim ekranie), bankomatów ze znakiem
zachęty C:> na ekranie (przoduje tu PKO, 2 trafienia) tudzież
informatorów turystycznych nie mogących znaleźć pliku "xxxx.dll"
Owszem, świat schodzi na psy... ;-)
We wszystkim o czym dyskutujemy, co praktycznie zawsze ma źródło w
"małej ilości RAMu" co wymusza kastrację.
Przecież ani szablony, ani dziedziczenie, ani przestrzenie
nazw Ci nawet bitu tego RAMu nie zjedzą... :-)
No dobra, ale się rozpisujemy, ja proponuje powoli kończyć, choć z
przyjemnością sie dyskutuje.
Ciekawe, czy ktoś tu dotarł? :-)
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Mon, 04 Jul 2005 22:59:38 +0200
Piotr Wyderski wrote:
Widzisz, mamy zupełnie inne podejście do programowania obiektowego
Nie, do programowaia w C++. O programowaniu obiektowym niewiele
mówiliśmy, a poza tym C++ dość mało ma z nim wspólnego.
Racja, przejęzyczenie.
moim przypadku, kiedy już decyduje się na C++ to zycze sobie PEŁNEGO c++
włacznie z STL, metodami wirtualnymi, wyjątkami i cała masą innych
fajnych rzeczy.
A jesli piszesz w C, to życzysz sobie pełnego zestawu funkcji
matematycznych,
funkcji wejścia-wyjścia oraz plików, mimo, że w danym systemie pojęcie pliku
nie
ma sensu?
Oczywiście ;) :P Myslisz że nie próbowałem liczyć na atmedze sinusów ? A
i owszem, kiedys się przydazyło, co gorsza szykuje mi sie projekt w
którym jest naprawde dużo liczenia na liczbach zmiennoprzecinkowych
(na szczęscie mam na to mase czasu).
Ale jesli miałbym spoglądnąc na to krytycznie - to akurat ja nie miałem
racji z STL(bo to w sumie wykorzystanie mechanizmów języka, a nie sam
język C++) ani Ty (bo funkcje matematyczne to tez nie jest składnik
jezyka C a raczej dodatek).
To nie znaczy że nie należy pisać w C++ na uC - tylko że imho argument
komplikacji jest tu troche nie w tej skali.
Jaka komplikacja?
Wspominałeś coś o plątaniu sie w spodniach ...
Zwróć uwagę na masę kłopotów, które się "robią same" takie jak tworzenie
tymczasowych obiektów przy arytmetyce przeciążonych operatorów (które
tak lubie stosować :),
Przeciążone operatory arytmetyczne na AVR-ku?!
Hmm a czemu nie, o ile prościej jest napisać a+b, gdzie a i b to obiekty
par liczb (powiedzmy współrzednych na ekranie LCD). Ale nie o to chodzi,
chodzi raczej o ukryte manipulacje w tle, które produkują niepotrzene
obiekty tymczasowe, najczesiej własnie przy kombinowaniu z operatorami.
W sumie to sporo roboty jest, żeby stworzyc obiekt i go następnie za
chwile zniszczyć.
konstruktory kopiujące (często niepotrzebne) i tym podobne
rzeczy, których IMHO kompilator raczej nie zoptymalizuje
(może się mylę ?).
Zoptymalizuje, choć kiedyś miał kłopoty z NRVO i powstał taki tymczasowy
idiom "operator(parametry) return nazwa_zmiennej { treść_operatora }"
-- ostatnio go wycofano.
Hmmm musze się przyglądnąc co się dzieje przy takim podejściu jak
x=(a+b)*y (wszystko obiekty), czy aby a+b nie tworzy na stosie jakiegoś
tymczasowego obiektu.
Można powiedziec, że o ile C++ ułatwia pewne rzeczy składniowo,
to czasami potrafi wygenerować kod nadmiarowy wynikający z
samej definicji obiektu przez programistę.
Jasne, ale należy do tego dodać, że programista powinien był
wiedzieć na czym polega działanie użytego mechanizmu i być
świadom skutków ubocznych. Pierwsze przykazanie: mysleć. ;-)
) jednak: przy C mamy pełną jasnośc co do tego jak zostanie wykonana
operacja (może za wyjątkiem konwersji/rzutowania, gdzie często łatwo
zrobic błąd). Przy C++ mamy często przypadkowe błędy wynikające z
nieznajomości pracy C++ przy manipulacji obiektami/wzorcami/whatever. W
zasadzie C++ wydaje mi się w niektórych zastosowaniach bardziej
niebezpieczny ( o ile niebezpieczeństwo zdefiniujemy jako nadmierne
obciązenie pamięci). Choć jak najbardziej wygodny.
Wyjątki są za drogie w obsłudze, maluchy mają za mało RAMu na stos.
Każdy znany mi kompilator pozwala wyłączyć ich obsługę.
Szkoda :) Czyli "-" dla C++ ? :)
A czy fakt, że karaluchy miewają problemy z opanowaniem
chińskiego cos chińskiemu ujmuje? :-)
Alez ja cały czas pisze w kontekście AVR-C++. Mozliwe że się nie
rozumiemy, jeśli rozmawiamy o C/C++ na duże pecety to ja się obydwoma
rękami podpisuje pod wszystkim co piszesz. Ale na AVRy nie.
To żaden minus, po prostu nie ma miejsca na stos wyjątków.
A jak nie ma stosu wyjątków, to nie ma i wyjątków.
Szkoda, co prawda nie lubie pisać wyjątkami, ale sa sytuację, że bez
nich jak bez ręki. W kazdym razie jak by niebyło to oficjalny składnik
C++ więc skoro go nie ma na AVR to wygląda na to ze nie ma C++ tylko
jakaś proteza :P
no to nadaj im go hurtem, pisząc w swoim kodzie
extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include <cośtam.h>
}
int main() { [...]
Tego Ci brakowało? :-)
Pfuj, jakie to nieładne :) Nie jest to dla mnie żadną przeszkodą, ale
fakt, że w winavr tego niepoprawili (chyba od dawna) świadczy o tym, że
chyba jest mało developerów piszących w C++ na AVRy. Jesteś w mniejszości :P
I ostro zacisnąć pasa w tym C++ :)
Rezygnując z wyjątków to ostro? A co m.in. z nieporównywalnie
bardziej potrzebnym programowaniem generycznym i dziedziczeniem,
które żadnych nakładów nie wymaga?
Hmm zależy co kto pisze, w sumie cięzko mi sobie wyobrazić bardzo
zaawansowany kod w paru kB flasha używający wszystkich możliwych funkcji
C++. Jednak zwróć uwagę, ż mamy już pare ograniczeń: nie ma wyjątków,
szkoda ramu na metody wirtualne (można sie kłucic czy faktycznie dużo
zajmuja), nie ma new/delete z definicji w winavr (pewno mozna dorobic,
nie robiłem tego, w zasadzie nie używam nawet malloc). Ten c++ na małe
AVR po prostu nie jest tym samym, w dodatku stosowanie niektórych
sztuczek w których powstają obiekty tymczasowe może doprowadzić do
szybkiego wypełnienia RAMu ( o ile nie jest to optymalizowane, nie wiem).
Oj, wiadomo że kazdy język ma spore róznice, ale chodzi o to, że
większośc programistów Java jest w stanie pisać w C++ i na odwrót.
Ano jest, wykorzystując jakieś 20% dostępnych możliwości.
Reszty się przenieść nie da.
Hmmm moment, 20% ? Jakoś cięzko mi tak podliczyc podobieństwa C++ i
Javy. Wiele ksiązek dojavy rozpoczyna się od podsumowania róznić w
stosunku do C++ lub co chwile w treści mamy ostrzeganie "tu jest troche
inaczej". pewnie, że żaden ze mnie programista w javie bo ledwo liznąłem
i cięzko się wypowiadać, ale moje zdanie jest takie, że mają bardzo dużo
wspólnego. Choć zapewne po paru tysiącach linijek Javy mogę zmienić
zdanie (choć już na dzień dzisiejszy mam ochotę rzucić ją w kąt i wrócić
do C++). Zobaczymy za rok, na razi tematykę javy zamykam, bo za mało
jeszcze wiem.
[ciach ciekawe rzeczy]
Wszystko ładnie, tylko podajesz proste przykłady, a wczesniej wpominałeś
o znacznie bardziej rozbudowanym :): "sprawdzanie w czasie kompilacji
hierarchii dziedziczenia za pomocą bardzo pokrętnie skonstruowanego
szablonu i niecodziennego wykorzystania operatora sizeof"
(podkreslenia moje). Ale masz oczywiście jak najbardziej racje, C++ jest
do tego wymyślony i nie zmamierzam się spierać bo jest oczywiste, że C
do pięt nie dorasta C++ przy elastyczności na etapie kompilacji kodu.
A swoją drogą ciakwostka: i w C da radę, o ile pamiętam FFTW jest
napisanyw C i samodzielnie (choć oczywiście PO kompilacji, na żywym
kodzie) się optymalizuje do CPU.
Tzn jestem wrogiem sztuczek programistycznych
Sztuczek? Każdy z powyższych kodów będzie małym dziełem sztuki
(o ile da się go napisać -- da się? :-)), a nie żadną sztuczką... :-)
Hehe, powiedź to sąsiadowi z sąsiedniego biurka, swoją drogą pamiętam
jak kolega debatował kiedyś 3 godziny z innym nad 4 linikowym kodem,
który okazał się w końcu metodą zmiany 2 zmiennych bez użycia trzeciej
(stara sztuczka z XOR). Wszystko ładnie i pięknie jesli piszesz sam, lub
masz ludzi w zespole potrafiących jednym rzutem oka zrozumieć o co
chodzi. Tak na marginesie: na jakiś 5 programistów w C++ w firmach
jakich znam/znałem żaden już nie pisze z użyciem wzorców(za wyjątkiem
bardzo prostych duperelek - nakaz szefów) bo statystycznie uzyskiwali
mniejszą wydajność niż bez nich. Prawdopodobnie właśnie dlatego, że kod
stawał się nieczytelny przez różne sztuczki. Pewnie że wina szefa, że
nie ustandaryzował, ale co poradzić. Co nie zmienia faktu że to swietna
zabawka :P
bo to zamiast ułatwiać zycie - zaciemnia tak, że komuś rękę urwie kiedyś
Zaciemnia? Trudno sobie wyobrazić czytelniejsze deklaracje niż, odpowiednio:
fn(best_mode<int>::type k);
wektor<457> w;
range<0, 2779> i;
O fuj :) Zaciemnia jak diabli :) Ale to kwestia gustu.
Co do przestrzeni nazw - ile to programów w C wyrosło bez tego "bajeru"
Nieakceptowalnie wiele.
Hmmm niewiem co masz na mysli: czy że za mało, czy że za dużo. Stawiam
na to pierwsze i musze przyznać, że grzebanie w źródłach narzedzi GNU
jest może przykładem sredniej wielkości projektów, ale bez wątpienia
dużej ilości ... Grzebałem w kodach parudziesięciu programów unixowych i
sporadycznie widac jakieś dodatki typu namespace/C++. A w ogóle to nie
widziałem ani jednego korzystającego z STL (co nie znaczy że ich nie ma,
ale pech - nie trafiłem :). C++ jest nadal mało popularny jako język
apliakcji (popularnych), a jeśli w ogóle używany to na poziomie buildera
i SQLa (gdzie podwójna pętla jest zadaniem dla szefa zespołu) a w takim
stanie raczej przypomina wyłacznie C+obiekty. Niestety wyrosła
konkurencja w postaci javy i C# oraz ogólne przechodzenie na .NET
(choćby z powodu zaszpanowania przed konkurencją czy klientem). Szkoda,
C++ był naprawde wielkim krokiem do przodu, dla niektórych za dużym.
ale brak "namespace" jakoś nie spowodował zastoju C
Zrobisz konflikt deklaracji, to będziesz miał zastój. ;-)
To go usunę, żaden problem. Chyba że mam 50 plików .c, ale to chyba
wychodzi poza ramy małego uC.
Hmmm ok. Zakładam, że teoretycznie masz rację. Jednak jestem przekonany
że przeciętny dobry programista C++ na dużych pecetach wybije sobie zęby
od razu o mały RAM/mały stos w uC.
Nie wiem, nie prowadziłem na ten temat badań statystycznych.
Ja sobie radzę równie dobrze w obu tych środowiskach, dlatego
pozwalam sobie klasyfikować wiele Twoich uwag jako mity --
nie próbowałeś czegoś zrobić, a z uporem bronisz przekonań,
które nie mają oparcia w faktach. Spróbuj, chętnie podyskutuję,
ale z rzeczywistymi doświadczeniami, a nie z uprzedzeniami. ;-)
No masz, przecież dyskutujemy sobie swobodnie o wadach zaletach C/C++ a
ty mi tu wmawiasz jakąs "obronę z uporem" :). Ależ ja jestem otwarty na
C++ tak samo jak na C w przypadku uC. W sumie nie chce jakiejś wojny
wywoływać, tylko posłuchac o ciekawych rozwiązaniach i po drodze troche
poprowokować ... :P
jednak jesli wykastrujemy C++ z STL, wyjątków i paru innych duperelek to
okaże się, że w zasadzie pozostał C + troche "bajerów składniowych" typu
szablony.
Heh, Sebastianie, jeśli uważasz szablony za bajerek składniowy, to
z pewnością nigdy z nich nie korzystałeś w bardziej zaawansowany
sposób. Wyrzuć z C++ cokolwiek sobie życzysz, ale szablony mi
zostaw, bo to głównie z ich powodu używam tego języka. :-)
Owszem, szablony są wazne, pozwoliłem sobie troche przesadzić w nazwie.
Nie zmienia to faktu, że C++ w całości jest trudny w użyciu na uC.
Faktycznie pozostają wyłącznie szablony i może obiekty. Jeśli z uporem
podkreślasz ich zalety, to muszę zrobić pare testów i może też zaczne
powszechnie korzystać. Człowiek się uczy cały czas, prawda ? :)
Hmmm moment, nie chodzi mi o rejestry uC tylko o rejestry specjalne
Procesora? No to tym bardziej się do nich nie dostaniesz z poziomu C,
tylko wstawka asemblerowa (albo rozszerzenie, jak sfr w Keilu) będzie
dostatecznie silna.
nie nie, źle to nazwałem, chodzi o komórki pamięci pełniące role
"strowników" hardware w mikrokontrolerze. Ale mniejsza o to, bo widze,
że coś namieszałem z tym kawałkiem i się nie dogadamy.
Łomatko :) No dobra, C++ wykastrowany, robocza nazwa "1/2C++" może byc ?
)
Ale _z czego_ wykastrowany, z wyjątków? To jest dla Ciebie połowa tego
języka? :-)
Z paru innych rzeczy też (wcześniej pisałem). Czy połowa to znowu
kwestia gustu i przyzwyczajeń.
Cos mi się zdaje że BASCOM nie powstał do takich
zastosowań (co nie zienia faktum że można).
Pewnie i nie powstał, ale jeśli ktoś mi zaproponuje dostatecznie
wysoki stosik zachęcaczy, to i w kodzie binarnym mu to napiszę. :-)
Jasne, ale w sumie o ile to bardziej bedzie bolesne od C/C++. Niektórych
rzeczy nie warto robic za nawet duże pieniądze :). Kiedyś widziałem w
sklepie internetowym koszulkę z napisem "Jestem szmata, pisze w VB". Coś
w tym jest :) Inna sprawa, że głupio taką zakładac, jeśli 99%
społeczeństwa rozumie tylko część przed przecinkiem...
We wszystkim o czym dyskutujemy, co praktycznie zawsze ma źródło w
"małej ilości RAMu" co wymusza kastrację.
Przecież ani szablony, ani dziedziczenie, ani przestrzenie
nazw Ci nawet bitu tego RAMu nie zjedzą... :-)
Ależ nie twierdze, że nie nalezy tego używać. Chyba musze posumowac
dyskusję żeby była jasnośc :)
Ciekawe, czy ktoś tu dotarł? :-)
Ja :)
A teraz podsumowanie z mojeje strony:
a) jestem absolutnie za pisaniem w C++ na wiekszych maszynkach (większa
maszynka=>64KB RAM, z reszta silnie zalezy od problemu). Stosowaniem
takich technik, jakie udostepnia dany jezyk. C jest po prostu zbyt
niebezpieczny na duże projekty.
b) jestem absolutnie za używaniem wzorców przy pisaniu kodu na małe uC.
Z jednym małym wyjątkiem: że po roku czasu patrząc w kod będe wiedział o
co chodzi. Na razie tego nie robie, bo nie było potrzeby, pierwsza się
pojawiła przy dobieraniu wielkości licznika w poprzednim wątku i w tej
chwili wacham się nad przejściem na kompilator C++. Zobaczymy jak bardzo
będzie to bolesne.
c) nie lubie języków BASCOM/whatever bo nie dają mi swobody
implementacji na niskim poziomie i często nie wiem, w jaki sposób działa
dany fragment. Pisanie wiekszych projektów mija się z celem, w zasadzie
brak wsparcia ze strony języka.
d) Nie jestem wrogiem C++, wręcz przeciwnie większośc programów pisze
wlasnie w C++ i nie zamierzam się z tego wycofywać w najbliżyszm czasie
(chyba że .NET zrobią na unixa, ale nawet wtedy chyba nieprędko).
Zaznaczam jednak, że wzorców używam w zasadzie głównie do implementacji
algorytmów zniezależnych od typów. Jakoś nie mogę się przekonać co do
przejrzystości kodu z użyciem wzorców w innych rolach.
e) pisuje w C głównie na kontrolery AVR, bo po prostu jest tak dla mnie
przejrzyściej. Skoro twierdzisz, że wzorce są takie świetne i nie
utrudniają życia/kompilacji/wielkości kodu, to postaram się do nich
przekonać.
f) Obawiam się, że zanim zaczne się bawic na poważnie w C++ na AVR to
przejdę już na ARM i wtedy problemu nie będzie (po prostu będę miał
pełny C++).
Pozdrawiam :)
Ale się rozgadalismy...
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: [OT] avr-gcc: Czy można wywołać ... ciąg dalszy ale inaczej
Date: Tue, 5 Jul 2005 00:24:14 +0200
Sebastian Bialy wrote:
Oczywiście ;) :P Myslisz że nie próbowałem liczyć na atmedze sinusów ?
Akurat sinusa się prosto liczy, niedawno nawet opisywałem algorytm. :-)
Ale jesli miałbym spoglądnąc na to krytycznie - to akurat ja nie miałem
racji z STL(bo to w sumie wykorzystanie mechanizmów języka, a nie sam
język C++) ani Ty (bo funkcje matematyczne to tez nie jest składnik
jezyka C a raczej dodatek).
Tu sprawa wcale nie jest jasna: kiedyś długo dyskutowałem z kimś
na ten sam temat, ale sprawa zredukowała się do udzielenia odpowiedzi
na pytanie, czy STL-owy string to część C++, czy też niezależny od
samego języka program. Każdą z dwu możliwych odpowiedzi można
poprzeć bardzo silnymi argumentami, więc sprawa została nierozstrzygnięta.
Ja jestem za drugą z tych możliwości, ale "obóz przeciwny" też ma
dużo racji. Ale widze, że jesteś w moim. ;-)
Przy C++ mamy często przypadkowe błędy wynikające z nieznajomości
pracy C++ przy manipulacji obiektami/wzorcami/whatever.
Nie należy używac mechanizmów, których zasady działania się nie rozumie.
Szkoda, co prawda nie lubie pisać wyjątkami
Wiedziałem, że się droczysz. ;-) Bez wyjątków daje się żyć i na
dużych maszynach, więc na mikrokontrolerach tym bardziej.
W kazdym razie jak by niebyło to oficjalny składnik C++ więc skoro
go nie ma na AVR to wygląda na to ze nie ma C++ tylko jakaś proteza :P
Chyba nie istnieje na Ziemi kompilator będący całkowicie zgodny ze
standardem C++ i implementujący wszystkie własności tego języka,
np. konstrukcję "export template" -- mówię całkowicie poważnie. :-)
Pfuj, jakie to nieładne :)
Gdy ostatnio zaglądałem w "nowe" inkludy, to właśnie tak to zrobili:
nowy_inklud = extern "C" {
#include "stary_inklud.h"
}
-)
ale fakt, że w winavr tego niepoprawili (chyba od dawna) świadczy o tym,
że
chyba jest mało developerów piszących w C++ na AVRy. Jesteś w mniejszości
P
nie ma new/delete z definicji w winavr (pewno mozna dorobic,
nie robiłem tego, w zasadzie nie używam nawet malloc).
Bez problemu można to sobie dopisać, tylko mając 128 bajtów RAM
nie bardzo jest czym zarządzać. :-)
Hmmm moment, 20% ? Jakoś cięzko mi tak podliczyc podobieństwa C++ i
Javy.
Owszem, maksymalnie 20%. Liczą się nie tylko podobieństwa
strukturalne, ale głównie wyrażalność -- w C++ masz do dyspozycji
cały arsenał technik, które nie mają swoich odpowiedników w Javie.
Wszystko ładnie, tylko podajesz proste przykłady, a wczesniej wpominałeś
o znacznie bardziej rozbudowanym :): "sprawdzanie w czasie kompilacji
hierarchii dziedziczenia za pomocą bardzo pokrętnie skonstruowanego
szablonu i niecodziennego wykorzystania operatora sizeof"
Wbrew pozorom on nie jest bardziej rozbudowany, jeśli chodzi o
wielkość kodu, to zaledwie ~10 linijek -- znacznie mniej, niż zajmie
rozwiązanie każdego z wcześniejszych przykładów. Jego "pokrętność"
sprowadza się do przebłysku geniuszu autora, a nie do wykorzystania
jakiegoś olbrzymiego i nieczytelnego kodu. Masz poniżej moją
implementację (choć nie ja wpadłem na tę technikę), spróbuj
dojść, jak to działa. :-)
struct aux_large_type { char m_Dummy[2]; };
template <class U, class V> struct aux_affinity_conversion {
private:
static char check(V*); // Not implemented, only the
signature is used
static aux_large_type check(...); // Not implemented, only the
signature is used
public:
enum { is = (sizeof(check(static_cast<U*>(0))) == sizeof(char)) };
};
Poza tym rzekoma "pokrętność" nie jest widoczna dla końcowego
użytkownika -- on pisze tylko "affinity<pierwszy_typ,
drugi_typ>::is_derivation"
i w czasie kompilacji dostaje stałą boole'owską z odpowiedzią na pytanie
o istnienie relacji dziedziczenia typu drugi_typ z pierwwszy_typ, której
może użyć np. do parametryzowania innego wzorca.
Hehe, powiedź to sąsiadowi z sąsiedniego biurka
Swego czasu zademonstrowałem im kilka tego typu technik...
a później się na mnie długo patrzyli jak na raroga. ;o)
Ale zrozumieli i teraz sami używają. :-)
Tak na marginesie: na jakiś 5 programistów w C++ w firmach
jakich znam/znałem żaden już nie pisze z użyciem wzorców(za
wyjątkiem bardzo prostych duperelek - nakaz szefów)
Niestety niewielu ludzi potrafi to robić porządnie albo nawet nie
wie o istnieniu takich technik w C++ -- to zostało opracowane
dopiero w tym wieku. Nie żeby to była jakaś sztuka tajemna, po
prostu te techniki miały zbyt mało czasu, by się upowszechnić.
bo statystycznie uzyskiwali mniejszą wydajność niż bez nich.
Wydajność pisania kodu? Jeśli tak, to uwierzę.
Wydajność programu nie miała prawa spaść,
jeśli spadła, to zrobiono coś bardzo, bardzo źle.
Prawdopodobnie właśnie dlatego, że kod stawał się nieczytelny przez
różne sztuczki.
Przecież tego kodu nie widać -- jest zamknięty w odpowiednim
nagłówku, a używa się tylko parametryzacji tego szablonu.
Parametryzacje są bardzo czytelne, a przynajmniej powinny być.
fn(best_mode<int>::type k);
wektor<457> w;
range<0, 2779> i;
O fuj :) Zaciemnia jak diabli :)
Hmm... :-)
Hmmm niewiem co masz na mysli: czy że za mało, czy że za dużo.
Za dużo.
Grzebałem w kodach parudziesięciu programów unixowych i
sporadycznie widac jakieś dodatki typu namespace/C++.
Szkoda.
Niestety wyrosła konkurencja w postaci javy i C# oraz ogólne
przechodzenie na .NET (choćby z powodu zaszpanowania przed
konkurencją czy klientem).
Szpan pewnie też jest tu istotnym czynnikiem, ale .NET to
naprawdę porządnie zaprojektowana platforma, więc bardzo
dobrze jej życzę. :-)
Szkoda, C++ był naprawde wielkim krokiem do przodu,
Nie zgodzę się, C++ pod względem jakości projektu języka
jest sporym krokiem wstecz, ja wolę Adę. A pod względem
nowych mozliwości -- to fakt, doszło bardzo dużo nowych
rzeczy, w C nieosiągalnych.
To go usunę, żaden problem.
Nie usuniesz, bo nie będziesz o nim wiedział. Dowiesz się o jego
istnieniu będąc w połowie drogi na Księżyc, niesiony pędem
eksplozji kotła parowego, który Twój sterownik wysadził. ;-)
W C++ dzięki przestrzeniom nazw takie coś nie może zaistnieć,
bo użytkownikom zasadniczo nie wolno niczego dokładać do STD.
Chyba że mam 50 plików .c, ale to chyba wychodzi poza ramy małego uC.
Dlaczego? Nieukończony jeszcze kod mojego mp3-playerka to ~30 plików,
niestety w C (na 8051 za darmo jest dostępny tylko SDCC).
Owszem, szablony są wazne, pozwoliłem sobie troche przesadzić w nazwie.
Nie zmienia to faktu, że C++ w całości jest trudny w użyciu na uC.
W całości tak.
Faktycznie pozostają wyłącznie szablony i może obiekty. Jeśli z uporem
podkreślasz ich zalety, to muszę zrobić pare testów i może też zaczne
powszechnie korzystać.
Spodoba Ci się i będzie nas tu dwuosobowa mniejszość, choc
Jerry kiedyś coś wspominał, że go nawróciłem na C++ w NIOSie. ;-)))
Jasne, ale w sumie o ile to bardziej bedzie bolesne od C/C++.
Ja też nie spodziewam się wielkich przyjemności,
ale jeśli będzie trzeba, to rzecz jest wykonalna.
b) jestem absolutnie za używaniem wzorców przy pisaniu kodu na małe uC.
Dziękuję, bez reszty się obędę. ;-)
c) nie lubie języków BASCOM/whatever
Ani ja, co nie zmienia faktu, że w razie potrzeby mogę w nich pisać.
e) pisuje w C głównie na kontrolery AVR, bo po prostu jest tak dla mnie
przejrzyściej. Skoro twierdzisz, że wzorce są takie świetne i nie
utrudniają życia/kompilacji/wielkości kodu, to postaram się do nich
przekonać.
To jest jedyny (i do tego bardzo dobry) sposób rozwiązania
Twojego problemu z licznikiem, więc masz już cos na zachętę. ;-)
Pozdrawiam
Piotr Wyderski
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Tue, 05 Jul 2005 01:11:20 +0200
Piotr Wyderski wrote:
Akurat sinusa się prosto liczy, niedawno nawet opisywałem algorytm. :-)
Myslisz, że tylko sin potrzebuje :) ? Mam za zadanie liczyc funkcje,
gdzie jest: logarytm przy podstawie narzuconej, prawdopodobnie jakaś
funkcja składana z sin i paru przekształceń, i jeszcze cos, czego
pomysłodawca nie zdefiniował: "jeszcze pomysle". Hmm.... chyba jednak
standardowa biblioteka C pójdzie w obroty, jeszcze nie upadłem na głowę
żeby pisać wszystko na bitach/bajtach/+/- ... :P
Przy C++ mamy często przypadkowe błędy wynikające z nieznajomości
pracy C++ przy manipulacji obiektami/wzorcami/whatever.
Nie należy używac mechanizmów, których zasady działania się nie rozumie.
Heh, powiedź to miszczom używająym Delphi i stringów w środku :) na
palcach jednej ręki policzyłbym wśród znajomych programistów
zaprzątających sobie głowę jak to działa. Co nie przeszkadza im
wszystkim powszechnie używać. Swego czasu pamietam moje boje kiedy
tłumaczyłem po co jest konstruktor kopiujący kiedy obiekt allokuje
jakieś zasoby - do nie ktorych po prostu nie trafia, jesli pisza przez 5
lat "OnClick->SELECT FROM * ...". ja myslę, że programiści nie mający
pojęcia jak działa kompilator są w znacznej większości na rynku. W
dodatku wycięcie wskaźników z języków takich jak java i C# tylko
pogłębia zapaść (acz nie jestem przeciwnikiem znikania wskaźników -
tylko boleje nad faktem braku znajomości mechanizmów niskiego poziomu).
Szkoda, co prawda nie lubie pisać wyjątkami
Wiedziałem, że się droczysz. ;-) Bez wyjątków daje się żyć i na
dużych maszynach, więc na mikrokontrolerach tym bardziej.
Masz racje, ale to wynik przyzwyczajenia. Przypuszczam że ktoś wychowany
na wyjątkach nie wyobraża sobie zycia bez nich.
W kazdym razie jak by niebyło to oficjalny składnik C++ więc skoro
go nie ma na AVR to wygląda na to ze nie ma C++ tylko jakaś proteza :P
Chyba nie istnieje na Ziemi kompilator będący całkowicie zgodny ze
standardem C++ i implementujący wszystkie własności tego języka,
np. konstrukcję "export template" -- mówię całkowicie poważnie. :-)
Ale wyjątki to raczej się implementuje :P Ale dobra, niech będzie że
faktycznie standard C++ to na razie świstek papieru a nie rzeczywistość.
Pfuj, jakie to nieładne :)
Gdy ostatnio zaglądałem w "nowe" inkludy, to właśnie tak to zrobili:
nowy_inklud = extern "C" {
-)
A owszem, tylko że niepowinien tego robic programista a producent
kompilatora.
nie ma new/delete z definicji w winavr (pewno mozna dorobic,
nie robiłem tego, w zasadzie nie używam nawet malloc).
Bez problemu można to sobie dopisać, tylko mając 128 bajtów RAM
nie bardzo jest czym zarządzać. :-)
Można, można :) Zalezy co jest wazniejsze: czy ilośc RAM, czy
"profesjonalnośc" kodu - nie jesten programista C bije pokłony do
wydruku kodu allokującego 2-wymiarową tablicę :P Na razie nie trafiłem
na małym AVR na potrzebę malloc'a,ale już na AtMega162 z zewnątrznym
RAMem - a i owszem, jak bez ręki.
Wszystko ładnie, tylko podajesz proste przykłady, a wczesniej wpominałeś
o znacznie bardziej rozbudowanym :): "sprawdzanie w czasie kompilacji
hierarchii dziedziczenia za pomocą bardzo pokrętnie skonstruowanego
szablonu i niecodziennego wykorzystania operatora sizeof"
[...] spróbuj dojść, jak to działa. :-)
Nie o 1 w nocy ... :) ja już nie mam sił na myslenie, przed chwilą
pomyliłem w kodzie true z false i po prostu nie daje rady ... ale
zerknę, choć z wzorców żaden ze mnie specjalista.
[cut fajne]
Tak na marginesie: na jakiś 5 programistów w C++ w firmach
jakich znam/znałem żaden już nie pisze z użyciem wzorców(za
wyjątkiem bardzo prostych duperelek - nakaz szefów)
Niestety niewielu ludzi potrafi to robić porządnie albo nawet nie
wie o istnieniu takich technik w C++ -- to zostało opracowane
dopiero w tym wieku. Nie żeby to była jakaś sztuka tajemna, po
prostu te techniki miały zbyt mało czasu, by się upowszechnić.
Owszem, ale okazuje się, że wzorce okazały się zbyt skomplikowane dla
szarego programisty. Niestety filozofia pisania komercyjnych aplikacji
sprowadza się do prostych pomysłów typu SQl+zdarzenia GUI. Jesli przez 5
lat pisze wyłacznie w tym zakresie aplikacje, to po prostu nic go nie
przekona do nauki wzorców (może wywaleniez roboty i szukanie nowej dla
motywację).
bo statystycznie uzyskiwali mniejszą wydajność niż bez nich.
Wydajność pisania kodu?
Tak. Mój znajomy twierdzi, że po prostu były niejasności i różne
koncepcje, jak również spore dziury w wiedzy pomiędzy zespołem. A w
zasadzie wszystko można zrobić bez wzorców, tyle że mniej elegancko. Ale
jak się okazało w tych warunkach - szybciej.
Niestety wyrosła konkurencja w postaci javy i C# oraz ogólne
przechodzenie na .NET (choćby z powodu zaszpanowania przed
konkurencją czy klientem).
Szpan pewnie też jest tu istotnym czynnikiem, ale .NET to
naprawdę porządnie zaprojektowana platforma, więc bardzo
dobrze jej życzę. :-)
Owszem, fajna zabawka, ale na razie działa sensownie tylko na Win, a
Mono jakoś się robi i robi i nie może wreszcie się przebić powaznie jako
alternatywa, z resztą jeśli się nie będa kompilowac programy okiemnkowe
pod mono, to daleko niezajedzie. Ja troche poczekam, bardzo nie lubie
zamykac sobie kodu tylko na win (takie lekkie zboczenie).
Szkoda, C++ był naprawde wielkim krokiem do przodu,
Nie zgodzę się, C++ pod względem jakości projektu języka
jest sporym krokiem wstecz, ja wolę Adę. A pod względem
nowych mozliwości -- to fakt, doszło bardzo dużo nowych
rzeczy, w C nieosiągalnych.
Miałem dopisać "dla programistów C". Co do Ady - nie znam. I nie poznam,
bo nie ma zaplecza w postaci bibliotek/algorytmów w takiej ilości jak C.
A może się mylę ?
Faktycznie pozostają wyłącznie szablony i może obiekty. Jeśli z uporem
podkreślasz ich zalety, to muszę zrobić pare testów i może też zaczne
powszechnie korzystać.
Spodoba Ci się i będzie nas tu dwuosobowa mniejszość, choc
Jerry kiedyś coś wspominał, że go nawróciłem na C++ w NIOSie. ;-)))
Hmm... zobaczymy. Na razie mam wazniejsze sprawy na głowie, ale w wolej
chwili ...
e) pisuje w C głównie na kontrolery AVR, bo po prostu jest tak dla mnie
przejrzyściej. Skoro twierdzisz, że wzorce są takie świetne i nie
utrudniają życia/kompilacji/wielkości kodu, to postaram się do nich
przekonać.
To jest jedyny (i do tego bardzo dobry) sposób rozwiązania
Twojego problemu z licznikiem, więc masz już cos na zachętę. ;-)
Problem chwilowo rozwiązany inaczej - znalazlem troche mocy
obliczeniowej w głównej pętli i jednak kręcę 4 bajtami. Natomaist
rozwiązanie to jest mało eleganckie więc może w wolnej chwili się pobawie.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: jerry1111 <pleaseJERRY1111nomorespam_at_nospam_wp.pl>
Subject: Re: [OT] avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E?=
Date: Tue, 05 Jul 2005 13:52:10 +0100
Sebastian Bialy wrote:
Spodoba Ci się i będzie nas tu dwuosobowa mniejszość, choc
Jerry kiedyś coś wspominał, że go nawróciłem na C++ w NIOSie. ;-)))
Hmm... zobaczymy. Na razie mam wazniejsze sprawy na głowie, ale w wolej
chwili ...
U mnie podobnie (brak czasu na R&D) - jak powylaczalem niepotrzebne
bzdury w kompilatorze (typu wyjatki itp), to kod sie zrobil sensownie
krotki i proste rzeczy byly obiecujace ;-)
A ze niedlugo bedzie trza siakies okienka na Niosa napisac (bo cos
wyswietlic na LCD 320x240...) to sie zabiore za c++ w embedded world na
powaznie - po roku...
--
Jerry
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: [OT] avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Mon, 04 Jul 2005 16:15:56 +0200
On Sun, 03 Jul 2005 23:35:09 +0200, Sebastian Bialy wrote:
Ależ o te własnie wirtualne chodzi :) Co mi po klasach, które nie dają w
zasadzie nic ciekawego do kodu poza pewnym porzadkowaniem metod+danych.
Z resztą co do klas - troche głupio ich uzywać nie mając pod ręką
operatorów new/delete, wyjątków czy poprawionych includów (mówie teraz o
AVR-GCC). Na razie AVR-GCC nie jest dobrym pomysłem do pisania w C++.
No - trzeba przyznac ze Piotr swego czasu podal kilka rzeczowych
argumentow, ktore imho nie mialy wiekszego znaczenia praktycznego ..
ale chyba wlasnie sie na dwa z nich nadziales :-)))
J.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Sun, 03 Jul 2005 12:42:12 +0200
On Sun, 03 Jul 2005 09:48:58 +0200, Sebastian Bialy wrote:
Już wiem, aczkolwiek jestem bardzo zdziwiony ...
Oczywiscie jestem temu winien. Mój program składa się z 5 modułów.
Przypadkowo (zapewne efekt pisania nocami) w jednym z plików .c
zapomniałem doinkludować charakterystyczme pliki do AVR. Ponieważ nie
było w nim żadnych zaleznych sprzetowo elementów poza SIGNAL i
matematyce na zmiennych to nie wrzeszczał o ich brak (swoją drogą bradzo
dziwne, czyżby SIGNAL był wbudowany w avr-gcc ?).
Efekt: W tym jednym mudule zmienna lądowała w innym obszarze pamięci. Po
dodaniu #include zmienna poleciała tam gdzie wszystkie.
Oczywiście wie ponosze ja, za nieuwagę, ale bardzo dzinym dla mnie
zjawiskiem jaest fakt, że w ogóle kod się skompilował bez błędów.
Dziwne to co piszesz.
Jesli zapomiales inlude ze zmienna, to powinno wywalic wielki blad
ze zmienna niezdefiniowana. No chyba ze byla zdefiniowana w dwoch
miejscach.
Natomiast SIGNAL .. bez include to jest po prostu zwykla funkcja
o takiej nazwie, ktora kompiluje sie swietnie, ale wywolywana
nigdy nie jest. Na assemblerze powinno cie zaciekawic:
-czemu nie konczy sie reti,
-czemu nie przechowuje uzywaneych rejestrow,
-czemu wektorek na nia nie wskazuje.
J.
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sun, 03 Jul 2005 18:41:13 +0200
J.F. wrote:
Dziwne to co piszesz.
Wyjasniłem jakie pliki h mi brakowało w sąsiednim poście.
Natomiast SIGNAL .. bez include to jest po prostu zwykla funkcja
o takiej nazwie, ktora kompiluje sie swietnie, ale wywolywana
nigdy nie jest. Na assemblerze powinno cie zaciekawic:
-czemu nie konczy sie reti,
Alez kończy, wcześniej tez kończyło się.
-czemu nie przechowuje uzywaneych rejestrow,
No własnie przechowywało wszystkie.
Moje zdumienie miało związek z faktem magicznego przenoszenia się
zmiennej z 0x6x do 0xdx w zalezności od uzycia "static". Widocznie z
jakiś powodów nie dołaczenie własciwych plików .h (moja wina) powoduje,
że linker/kompilator allokuje zmienną w innym obszarze.
Teraz wszystko jest ok, i nie ma żadnych problemów.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cig dalszy ale inaczej
Date: Mon, 04 Jul 2005 01:42:46 +0200
On Sun, 03 Jul 2005 18:41:13 +0200, Sebastian Bialy wrote:
J.F. wrote:
Natomiast SIGNAL .. bez include to jest po prostu zwykla funkcja
o takiej nazwie, ktora kompiluje sie swietnie, ale wywolywana
nigdy nie jest. Na assemblerze powinno cie zaciekawic:
-czemu nie konczy sie reti,
Alez kończy, wcześniej tez kończyło się.
-czemu nie przechowuje uzywaneych rejestrow,
No własnie przechowywało wszystkie.
Niemozliwe - 'SIGNAL' nie jest wbudowane w kompilator.
Przynajmniej w wersji 20050214.
Bez io.h masz nawet niezdefiniowane nazwy przerwan - to gdzie ma
wstawic wektor ?
Moje zdumienie miało związek z faktem magicznego przenoszenia się
zmiennej z 0x6x do 0xdx w zalezności od uzycia "static". Widocznie z
jakiś powodów nie dołaczenie własciwych plików .h (moja wina) powoduje,
że linker/kompilator allokuje zmienną w innym obszarze.
Jest to mozliwe. Ale nie powinno miec wiekszego wplywu na dzialanie.
J.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cišg dalszy ale inaczej
Date: Sat, 02 Jul 2005 15:15:31 +0200
On Fri, 01 Jul 2005 22:36:29 +0200, Sebastian Bialy wrote:
Okazało się ze to nie był problem z wywoływaniem funckji z przerwań. To
chyba co innego. Z nieznanych mi przyczyn jest istotna róznica jeśli:
a) Mam program w modułach
b) definiuje zmienną globalną w jednym z modułów w postaci:
extern long zmienna (to w pliku .h)
long zmienna (to w jednym z plików .c)
Ciagle nie widzie volatile :-)
c) modyfikuje ją w przerwaniu
To w takiej konfiguracji zmiana "zmiennej" powoduje wesołe zawieszenie
się reszty programu/błedne działanie.
jednak wystarczy zdeklarować:
static long zminna
A program się stabilizuje i działa poprawnie.
Dziwne rzeczy piszesz. Jesli zmienna jest zadeklarowana poza funkcja,
to "static" znaczy de facto "nie publiczna".
Jako taka nie moze byc dostepna z innych modulow !
Kompilatora raczej nie podejrzewam .. albo uzywasz dwoch zmiennych w
roznych modulach, albo masz konflikt nazw z biblioteka ..
Ktoś ma jakiś pomysł co robie źle ?
POdeslij caly program.
J.
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy =?ISO-8859-2?Q?mo=BFna_wywo=B3a=E6_=2E=2E=2E?=
Date: Sat, 02 Jul 2005 16:51:30 +0200
J.F. wrote:
Ciagle nie widzie volatile :-)
Fakt, zapomniałem dopisać, ale jest oczywiście.
Dziwne rzeczy piszesz. Jesli zmienna jest zadeklarowana poza funkcja,
to "static" znaczy de facto "nie publiczna".
Jako taka nie moze byc dostepna z innych modulow !
W moim przypadku nie sięgam do niej z innych modułów (chwilowo) żeby
wykluczyc jakies problemy między-modułowe. Jest deklarowana jako static
i extern i korzysta z niej jeden i tem sam moduł. W jednym wypadku jest
dobrze, w drugim dzieją się cuda.
POdeslij caly program.
Eeee :) Nie da rady, ale postaram się ten problem wywołać dla
rzeczywistego kodu. na razie jedyny objaw to inna lokalizacja zmienne jw
pamięci dla extern i static, natomiast w bardzo mayłym programie który
korzysta z tego mechanizmu jest ok.
Będe dalej waczył.
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: avr-gcc: Czy można wywołać ... cig dalszy ale inaczej
Date: Sun, 03 Jul 2005 02:34:34 +0200
On Sat, 02 Jul 2005 16:51:30 +0200, Sebastian Bialy wrote:
J.F. wrote:
Dziwne rzeczy piszesz. Jesli zmienna jest zadeklarowana poza funkcja,
to "static" znaczy de facto "nie publiczna".
Jako taka nie moze byc dostepna z innych modulow !
W moim przypadku nie sięgam do niej z innych modułów (chwilowo) żeby
wykluczyc jakies problemy między-modułowe. Jest deklarowana jako static
i extern i korzysta z niej jeden i tem sam moduł. W jednym wypadku jest
dobrze, w drugim dzieją się cuda.
Maly test - skasuj static, ale zmien jej nazwe ..
POdeslij caly program.
Eeee :) Nie da rady, ale postaram się ten problem wywołać dla
rzeczywistego kodu. na razie jedyny objaw to inna lokalizacja zmienne jw
pamięci dla extern i static, natomiast w bardzo mayłym programie który
korzysta z tego mechanizmu jest ok.
Skasuj niepotrzebne czesci programu, ale zostaw zmienne - moze to
pomoze odtworzyc blad.
J.