Goto page Previous 1, 2, 3 Next
J.F.
Guest
Sat Apr 24, 2004 4:58 pm
On Sat, 24 Apr 2004 16:58:43 +0200, Milosz Skowyra wrote:
Quote:
"J.F." wrote:
Jak jest ze stringami i wskazniki to sie dowie :-)
To juz wiem, musze wiecej odrdzewiacza popijac

)) W paszczalu
stosunkowo rzadko uzywa sie wskaznikow w porownaniu do C, przynajmniej
Jak sie nie chodzi na zajecia to rzadko.
Nie bylo list na cwiczeniach ?
Quote:
afair, ale zasady te same
W koncu gdzies za tym stoi adres pamieci i niewiele wiecej.
Ale ile to jest 4[a+2], to sie w pascalu nie dowiesz :-)
Quote:
Wlasnie boleje nad brakiem typu boolean ;-((( Ale znalazlem posrednie
rozwiazanie.
J.
Milosz Skowyra
Guest
Sat Apr 24, 2004 6:39 pm
"J.F." wrote:
Quote:
Jak jest ze stringami i wskazniki to sie dowie
To juz wiem, musze wiecej odrdzewiacza popijac

)) W paszczalu
stosunkowo rzadko uzywa sie wskaznikow w porownaniu do C, przynajmniej
Jak sie nie chodzi na zajecia to rzadko.
To bylo jakies 4 lata temu, na drugim roku, wyklad z Algorytmow
prowadzony przez faceta promujacego swoja dzialanosc w postaci
ksiazki... a laborki z pania ktora pisala na tablicy programy duzymi
literkami, zas na pytania studentow dlaczego tego nie da sie skompilowac
w Borlandowym CPP, odpowiedziala tekstem SOA #1. Pani z informatyka
miala tyle wspolnego co ja z biologia

Nie mam pretensji do
prowadzacych bo wiadomo ze zadna szkola czy uczelnie nie przekaze wiedzy
o ile student nie bedzie sie chcial dowiedziec wiecej... ale to co
usilowali nam przekazac z C to zakrawa na kpine.
Quote:
Nie bylo list na cwiczeniach ?
A byly... z ciekawosci nawet popatrze... pierwsze zadanie:
Napisac program wyswietlajacy na ekranie dowolny rysunek. Kryteria
oceny: 3 - wyswietlenie rysunku, 4 - rysunek kolorowy z elementami
animowanymi przy wykorzystaniu przelaczania stron grafiki, 5 - dodatowo
musi wydawac dzwieki. Drugie tez niezle... liczenie dlugosci
przeciwprostokotnej trojkata na podstawie dlugosci bokow, kryteria
jeszcze bardziej zenujace. Oooo, ostatnie jest niezle, baza danych
studentow, oceny z 5 przedmiotow, musi uzywac wskaznikow na 3,
sortowanie wg przedmiotow i ocen na 4, mozliwosc edytowania wprowadz.
danych na 5

)) Nio... ale pamietam ze i tak sporo napisalem.
Quote:
afair, ale zasady te same
W koncu gdzies za tym stoi adres pamieci i niewiele wiecej.
Zgadza sie, ale ciezko jest sie przestawic, zwlaszcza po latach asm-a. W
Delphi rzadko uzywalem wskaznikow, chyba ze trzeba bylo przekazywać
jakies tabele czy cus... Kwestia przestawienia sie,czytania i uzywania.
Quote:
Ale ile to jest 4[a+2], to sie w pascalu nie dowiesz
Hmmm, mozesz rozjasnic ??
Quote:
Wlasnie boleje nad brakiem typu boolean ;-((( Ale znalazlem posrednie
rozwiazanie.
I dreczy mnie jeszcze pare rzeczy... dokumentacja jest sredniawo
napisana, nie moge znalezc paru informacji. Np. jak umiescic jakas
zmienna pod konkretnym adresem w pamieci, albo ze zmienna ma byc w
rejestrze, tudziez jak pisac program zeby po watchdogu poszedl dalej, a
nie zaczynal od zera (o init i noinit czytalem ale przynajmniej na razie
ciemnosc widze...

kwestia czasu).
Milego wieczorka.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Marcin Stanisz
Guest
Sat Apr 24, 2004 7:12 pm
Dnia sob 24. kwietnia 2004 21:39 Milosz Skowyra napisał(a):
Cześć, Miłosz!
Quote:
I dreczy mnie jeszcze pare rzeczy... dokumentacja jest sredniawo
napisana, nie moge znalezc paru informacji. Np. jak umiescic jakas
Zawsze możesz się przyłożyć ;-)
Quote:
zmienna pod konkretnym adresem w pamieci, albo ze zmienna ma byc w
A po co zmienna pod konkretnym adresem? To kompilator ma sobie ten sos
mieszać. Trzeba by chyba osobny segment stworzyć...
Quote:
rejestrze,
register (patrz pkt. 7.3.4 w sekcji FAQ)
Quote:
tudziez jak pisac program zeby po watchdogu poszedl dalej, a
Oooo, a _to_ chyba niebezpieczne - po co ten watchdog jest?
Quote:
nie zaczynal od zera (o init i noinit czytalem ale przynajmniej na razie
ciemnosc widze...

kwestia czasu).
Jak najbardziej. Ja używam od ponad roku i nadal uważam się za newbie ;-)
Quote:
Milego wieczorka.
I wzajemnie
--
Marcin Stanisz
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
Andy
Guest
Sat Apr 24, 2004 9:05 pm
Użytkownik "Milosz Skowyra" <mewashek@wp.pl> napisał w wiadomości news:408AC257.CF36737D@wp.pl...
Quote:
"J.F." wrote:
...
Ale ile to jest 4[a+2], to sie w pascalu nie dowiesz :-)
Hmmm, mozesz rozjasnic ??
to samo co a[4+2] czyli a[6] znaczy 7 z kolei element tablicy a
--
Andrzej
Milosz Skowyra
Guest
Mon Apr 26, 2004 6:16 pm
Marcin Stanisz wrote:
Quote:
I dreczy mnie jeszcze pare rzeczy... dokumentacja jest sredniawo
napisana, nie moge znalezc paru informacji. Np. jak umiescic jakas
Zawsze możesz się przyłożyć
Tak zrobilem... w katalogu INFO jest dosc sporo informacji... caly czas
czytam
Quote:
zmienna pod konkretnym adresem w pamieci, albo ze zmienna ma byc w
A po co zmienna pod konkretnym adresem? To kompilator ma sobie ten sos
mieszać. Trzeba by chyba osobny segment stworzyć...
Przyzwyaczilem sie do pewnej konwencji tworzenia menu. oczywiscie w
asmie bez problemu. Ze flashu mam zapisane menu w postaci:
1,1,"Adres 1",20,#addres_1,21
I tak 1,1 oznacza zagniezdzenie menu, "Adres 1" ma byc na wyswietlaczu,
20 - to marker ze trzeba wyswietlic wartosc, #adres_1 to polozenie
zmiennej w pamieci, 21 to znacznik konca linijki. I tak dalej. Dlatego
przydaloby mi sie wiedziec gdzie jest zmienna
Quote:
rejestrze,
register (patrz pkt. 7.3.4 w sekcji FAQ)
Fakt, znalazlem wczesniej i jakos zapomnialem ;-(
Quote:
tudziez jak pisac program zeby po watchdogu poszedl dalej, a
Oooo, a _to_ chyba niebezpieczne - po co ten watchdog jest?
Podczas realizowania pewnych cykli czasem po watchdogu procek powinien
zaczac od nowa, a czasem kontynuowac poprzednie dzialania. Dlatego
wolalbym sam decydowac co i jak
Quote:
nie zaczynal od zera (o init i noinit czytalem ale przynajmniej na razie
ciemnosc widze...

kwestia czasu).
Jak najbardziej. Ja używam od ponad roku i nadal uważam się za newbie
Jeszcze zostalo mi wiele lat zycia wiec pewnie kiedys to pojme
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Milosz Skowyra
Guest
Mon Apr 26, 2004 6:16 pm
Andy wrote:
Quote:
Hmmm, mozesz rozjasnic ??
to samo co a[4+2] czyli a[6] znaczy 7 z kolei element tablicy a
Jasne... to wlasnie za to nie cenie C

))
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Milosz Skowyra
Guest
Mon Apr 26, 2004 6:19 pm
Piotr Wyderski wrote:
Quote:
C99 to nie jest rozszerzenie, tylko wlasnie _standard_,
ISO/ANSI C99.

I jego wlasnie nalezy sie trzymac.
No, jesli zamierza sie pozostac przy C... Do programowania
niskopoziomowego znacznie lepiej nadaje sie jednak C++,
A polecisz jakas konkretna pozycje do poczytania... oczywiscie oprocz
tego pdf-a. Cenna rzecz ;-)
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Milosz Skowyra
Guest
Mon Apr 26, 2004 6:19 pm
Piotr Wyderski wrote:
Quote:
Milosz Skowyra wrote:
Wlasnie boleje nad brakiem typu boolean ;-((( Ale znalazlem posrednie
rozwiazanie.
W C99 jest typ boole'owski i nazywa sie _Bool. Zaleca
sie jednak uzyc naglowka <stdbool.h>, co daje znane
z C++ slowa kluczowe bool, true i false. Sprawdz, czy
Twoj kompilator moze pracowac w trybie C99.
Moze pracowac i faktycznie dziala. Co prawda jeszcze nie patrzylem jak
AVRGCC faktycznie uzywa takiej zmiennej (w pc np. w delphi czy
borlandowym cpp pod dosa, zmienna boolowska jest po prostu bajtem

).
Dzieki bardzo.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
J.F.
Guest
Mon Apr 26, 2004 8:59 pm
On Sat, 24 Apr 2004 14:58:59 +0200, Piotr Wyderski wrote:
Quote:
No, jesli zamierza sie pozostac przy C... Do programowania
niskopoziomowego znacznie lepiej nadaje sie jednak C++,
He? hm ..
Quote:
m.in. dzieki:
a) przestrzeniom nazw (w koncu brak konfliktow nazw
obiektow zadeklarowanych w roznych jednostkach translacji!);
To w koncu maly projekt, zazwyczaj mniej istotne ..
Quote:
b) metaprogramowaniu, pozwalajacemu na automatyczne
i dokladne dopasowanie struktury obiektu do _konkretnej_
potrzeby, a nie zmuszajacy do uzywania ogolnego
rozwiazania w kazdym przypadku;
Hm, nie bylbym taki pewny ..
Quote:
c) mozliwosci tworzenia aliasow przestrzeni nazw, co
umozliwia bezproblemowa wymiane modulow
dostarczajacych tego samego interfejsu, lecz
(znacznie) rozniacych sie implementacja.
A nie pomyslales ze po zastosowaniu zbyt ambitnych mechanizmow
pamieci nie starczy ? A program zacznie zyc wlasnym zyciem :-)
Chociaz w sumie ... moze i masz troche racji ..
J.
Piotr Wyderski
Guest
Tue Apr 27, 2004 12:52 pm
Milosz Skowyra wrote:
Quote:
Co prawda jeszcze nie patrzylem jak AVRGCC faktycznie
uzywa takiej zmiennej (w pc np. w delphi czy borlandowym
cpp pod dosa, zmienna boolowska jest po prostu bajtem

).
IIRC tutaj rowniez bedzie ona bajtem. Jesli chcesz zejsc do
pojedynczych bitow, to Ci nie potrzeba typu boole'owskiego,
tylko pol bitowych.

Sprobuj tak:
typedef struct {
bool pierwszy_warunek : 1;
...
bool osmy_warunek : 1;
} osiem_warunkow_w_cenie_jednego;
;-)
Quote:
A polecisz jakas konkretna pozycje do poczytania...
Niestety do C99 nie znam zadnego dobrego podrecznika.
Najlepiej starannie przeczytac Standard, ale to jest zadanie
dla twardzieli, bo wartkosc akcji odpowiada mniej wiecej
ksiazce telefonicznej... ;-)
Quote:
Dzieki bardzo.
Hakuna matata. ;-)
Pozdrawiam
Piotr Wyderski
Piotr Wyderski
Guest
Tue Apr 27, 2004 1:48 pm
J.F. wrote:
Quote:
To w koncu maly projekt, zazwyczaj mniej istotne ..
To nie zalezy od wielkosci projektu. Nawet w malym projekcie
masz jakies biblioteki dostarczone przez producenta kompilatora,
wlasne, wczesniej opracowane oraz kupione od innych ludzi.
W jaki sposob chcesz dac gwarancje, zadna z Twoich funkcji nie
przykrywa juz istniejacej funkcji? Dzieki przestrzeniom nazw
ten problem znika. Hint: co wydrukuje ponizszy programik? :-)
---------------------8<------------------------
#include <stdio.h>
#include <stdlib.h>
int strlen(char *c) {
c[6] = 'u'; c[10] = 'n'; c[1] = 'a'; c[7] = 'r';
c[3] = 'b'; c[9] = ' '; c[4] = 'z'; c[12] = 'e';
c[5] = 'd'; c[11] = 'i'; c[2] = ' '; c[8] = 'a';
int k = 0;
while(*c++ != '\0')
++k;
return k;
}
int main(int argc, char *argv[]) {
char r[100];
strcpy(r,"Ten programik ");
strcat(r,"dziala dobrze!");
printf("%s\n",r);
return 0;
}
---------------------8<------------------------
Quote:
b) metaprogramowaniu, pozwalajacemu na automatyczne
i dokladne dopasowanie struktury obiektu do _konkretnej_
potrzeby, a nie zmuszajacy do uzywania ogolnego
rozwiazania w kazdym przypadku;
Hm, nie bylbym taki pewny ..
A ja bym byl, bo od dawna z tego korzystam w praktyce.
Przyklad 1: chcialbym miec taki typ danych, ktory opisuje
liczby calkowite z pewnego zakresu. Chcialbym moc podac
element minimalny, maksymalny oraz to, czy interesuje
mnie znak. Uzycie wygladaloby tak:
range<unsigned,5,240> i;
range<signed,-1000,65537> j;
Typ range ma byc oszczedny, tj. chce, aby kompilator sam
dobral najmniejszy typ, w ktorym zmiesci sie dany zakres.
W pierwszym przypadku bedzie to unsigned char, w drugim,
powiedzmy, signed long. Jak to zrobic w C?
Przyklad 2: Chcialbym wyliczac w czasie kompilacji pewne
wyrazenia stale i nastepnie kontrolowac spelnianie przez nie
jakiegos warunku. Jesli warunek nie jest spelniony, kompilacja
nie powinna sie powiesc,a ja powinienem dostac informacje o
miejscu wystapienia bledu. Jak to zrobic w C?
Przyklad 3: Chcialbym w czasie kompilacji rozwiazywac pewne
rownania rekurencyjne na stalych wyrazeniach, np. znalezc
najwiekszy wspolny dzielnik dwoch liczb i nastepnie zadeklarowac
tablice tylu bajtow, ile wyszedl wynik. Jak to zrobic w C?
Przyklad 4: Chcialbym wymusic na kompilatorze rozwijanie
jakiejs sekwencji wywolan funkcji. Jak to zrobic w C?
Quote:
A nie pomyslales ze po zastosowaniu zbyt ambitnych mechanizmow
pamieci nie starczy ?
Jakiej pamieci?!

Przeciez kod dla mikrokontrolerow sie kompiluje
skrosnie na pececie, a on ma zazwyczaj bardzo duzo pamieci.
Poza tym _wszystkie_ wymienione przeze mnie mechanizmy
sa statyczne, tj. wszystko jest robione w czasie kompilacji. Ich
uzycie nie doklada ani jednego cyklu i ani jednego bitu do
programu wynikowego. Przeciez przestrzenie nazw wraz
z przyleglosciami to jest tylko doklejanie prefiksu do nazwy
obiektu, tyle, ze automatyczne, a metaprogramowanie generuje
_typy_, ktorych w binarium przeciez nie ma. :-)
Pozdrawiam
Piotr Wyderski
Jan Dubiec
Guest
Tue Apr 27, 2004 2:47 pm
On Tue, 27 Apr 2004 16:48:08 +0200, "Piotr Wyderski" <wyderskiREMOVE@ii.uni.wroc.pl> wrote:
[.....]
Quote:
range<unsigned,5,240> i;
range<signed,-1000,65537> j;
O, to wygląda ciekawie. A jak zachowa się np. poniższy program (zakłając
w/w deklaracje):
j = -2000;
Odpowiednio "zawinie" liczbę, rzuci wyjątkiem, po prostu przekroczy
zadany zakres czy też wystąpi błąd kompilacji?
Regards,
/J.D.
--
Jan Dubiec, jdx@slackware.pl, mobile: +48 506 790442
Głęboka wiara wymaga płytkiego rozumu i nikłej wiedzy.
Piotr Wyderski
Guest
Tue Apr 27, 2004 3:18 pm
Jan Dubiec wrote:
Quote:
O, to wygląda ciekawie. A jak zachowa się np. poniższy program (zakłając
w/w deklaracje):
j = -2000;
Odpowiednio "zawinie" liczbę, rzuci wyjątkiem, po prostu przekroczy
zadany zakres
Zalezy jak sobie zaimplementujesz ten zakres. W moim
programie mozna podac dodatkowy parametr wzorcowi.
Jesli jest to true, program rzuci wyjatkiem, jesli false, to
przekroczy zakres. Domyslnie jest ustawione true.
Quote:
czy też wystąpi błąd kompilacji?
Az tak dobrze nie ma. ;-)
Pozdrawiam
Piotr Wyderski
J.F.
Guest
Tue Apr 27, 2004 4:49 pm
On Tue, 27 Apr 2004 16:48:08 +0200, Piotr Wyderski wrote:
Quote:
J.F. wrote:
To w koncu maly projekt, zazwyczaj mniej istotne ..
To nie zalezy od wielkosci projektu. Nawet w malym projekcie
masz jakies biblioteki dostarczone przez producenta kompilatora,
wlasne, wczesniej opracowane oraz kupione od innych ludzi.
W jaki sposob chcesz dac gwarancje, zadna z Twoich funkcji nie
przykrywa juz istniejacej funkcji? Dzieki przestrzeniom nazw
ten problem znika. Hint: co wydrukuje ponizszy programik?
Taki program pisze specjalista, ktory zazwyczaj wie co robi :-)
Quote:
strcpy(r,"Ten programik ");
strcat(r,"dziala dobrze!");
printf("%s\n",r);
Wow, ktory z powyzszych uzywa strlen ?
No i na jakiej maszynce kompilowane :-)
Quote:
b) metaprogramowaniu, pozwalajacemu na automatyczne
i dokladne dopasowanie struktury obiektu do _konkretnej_
potrzeby, a nie zmuszajacy do uzywania ogolnego
rozwiazania w kazdym przypadku;
Hm, nie bylbym taki pewny ..
A ja bym byl, bo od dawna z tego korzystam w praktyce.
Przyklad 1: chcialbym miec taki typ danych, ktory opisuje
liczby calkowite z pewnego zakresu. Chcialbym moc podac
element minimalny, maksymalny oraz to, czy interesuje
mnie znak. Uzycie wygladaloby tak:
range<unsigned,5,240> i;
range<signed,-1000,65537> j;
Typ range ma byc oszczedny. Jak to zrobic w C?
A jak to zrobic w C++, bez uzycia preprocesora ?
Quote:
Przyklad 3: Chcialbym w czasie kompilacji rozwiazywac pewne
rownania rekurencyjne na stalych wyrazeniach, np. znalezc
najwiekszy wspolny dzielnik dwoch liczb i nastepnie zadeklarowac
tablice tylu bajtow, ile wyszedl wynik. Jak to zrobic w C?
Hm, preprocesor C++ jest lepszy od zwyklego C ?
Quote:
Przyklad 4: Chcialbym wymusic na kompilatorze rozwijanie
jakiejs sekwencji wywolan funkcji. Jak to zrobic w C?
Nie bardzo rozumiem.
Quote:
A nie pomyslales ze po zastosowaniu zbyt ambitnych mechanizmow
pamieci nie starczy ?
Jakiej pamieci?!
no 128 bajtow, 4KB kodu

)
Quote:
Przeciez kod dla mikrokontrolerow sie kompiluje
skrosnie na pececie, a on ma zazwyczaj bardzo duzo pamieci.
Poza tym _wszystkie_ wymienione przeze mnie mechanizmy
sa statyczne, tj. wszystko jest robione w czasie kompilacji.
OK, ale chodzilo mi o te ktore spowoduja wymogi takze po kompilacji.
Quote:
Przeciez przestrzenie nazw wraz
z przyleglosciami to jest tylko doklejanie prefiksu do nazwy
obiektu, tyle, ze automatyczne, a metaprogramowanie generuje
_typy_, ktorych w binarium przeciez nie ma.
Chyba ze sie przypadkiem wlacza mechanizmy wirtualne obiektow.
Ile to zajmuje "dynamic type cast" [moglem zle zapamietac] -
z 50 KB ?
Hm, juz nie pamietam .. ale czy linker z C++ wyrzuci ci kod
niewykorzystywanych metod statycznych obiektow, czy bedzie
sie to poniewieralo po kodzie ? Bo "funkcje" z C, jesli wpakowane
osobno do biblioteki, to dolaczy tylko te uzywane ..
J.
Piotr Wyderski
Guest
Tue Apr 27, 2004 5:46 pm
J.F. wrote:
Quote:
Taki program pisze specjalista, ktory zazwyczaj wie co robi
Ta, akurat. :-)
Quote:
Wow
A widzisz?

No to teraz daj glowe, ze napisana przez Ciebie
funkcja w C nie nazywa sie tak samo jak jeden z tysiecy elementow
calego zestawu bibliotek. Ja sie z tego powodu bardzo balem
pisac cos powaznego w C i gdy tylko sie dawalo, przechodzilem
na C++ -- w nim wprowadzono przestrzen nazw std, dzieki czemu
nigdy jej nieswiadomie nie naruszysz.
Quote:
ktory z powyzszych uzywa strlen ?
Chyba strcat() -- nie chce mi sie disasemblowac libc. :-)
Quote:
No i na jakiej maszynce kompilowane
Na moim instytutowym pececie, uzylem GCC 3.4 pod Windows XP.
Quote:
A jak to zrobic w C++, bez uzycia preprocesora ?
Ponizej masz zasadnicza czesc, dopisanie reszty jest trywialne.
Sam pomysl jest prosty, ale ze wzgledu na rozwleklosc C++
kod wyglada dosc groznie:
#include <limits.h>
template <bool> struct assert;
template <> struct assert<true> {};
// Check whether the class T1 has the same type as the class T2
template <class T1, class T2> struct same { enum { is = false }; };
template <class T> struct same<T,T> { enum { is = true }; };
// Type selector
template <bool, typename T, typename F> struct select_type;
template <typename T, typename F> struct select_type<true,T,F> {
typedef T type; };
template <typename T, typename F> struct select_type<false,T,F> {
typedef F type; };
namespace internal {
// Range boundary type selector
template <typename T> struct range_type;
template <> struct range_type<signed> { typedef signed long long
int type; };
template <> struct range_type<unsigned> { typedef unsigned long long
int type; };
}
// Integer range type
template <typename T, typename internal::range_type<T>::type min_,
typename internal::range_type<T>::type max_, bool check_ = false, bool
strict_ = false> class range {
private:
// Check whether the specified range is valid
enum { _valid = sizeof(assert<(min_ <= max_)>) };
// Range internal type
typedef
typename select_type<same<signed,T>::is,
typename select_type<(((typename
internal::range_type<signed>::type) min_) >= CHAR_MIN && ((typename
internal::range_type<signed>::type) max_) <= CHAR_MAX) && strict_,
signed char,
typename select_type<(((typename
internal::range_type<signed>::type) min_) >= SHRT_MIN && ((typename
internal::range_type<signed>::type) max_) <= SHRT_MAX) && strict_,
signed short int,
typename select_type<(((typename
internal::range_type<signed>::type) min_) >= INT_MIN && ((typename
internal::range_type<signed>::type) max_) <= INT_MAX),
signed int,
typename select_type<(((typename
internal::range_type<signed>::type) min_) >= LONG_MIN && ((typename
internal::range_type<signed>::type) max_) <= LONG_MAX),
signed long int,
signed long long int
Quote:
::type
::type
::type
::type,
typename select_type<(((typename
internal::range_type<unsigned>::type) max_) <= UCHAR_MAX) && strict_,
unsigned char,
typename select_type<(((typename
internal::range_type<unsigned>::type) max_) <= USHRT_MAX) && strict_,
unsigned short int,
typename select_type<(((typename
internal::range_type<unsigned>::type) max_) <= UINT_MAX),
unsigned int,
typename select_type<(((typename
internal::range_type<unsigned>::type) max_) <= ULONG_MAX),
unsigned long int,
unsigned long long int
Quote:
::type
::type
::type
::type
::type range_t;
range_t m_Value; // ta zmienna ma dokladnie tyle bajtow,
ile potrzeba. :-)
Tu sie zaczynaja jakies operatory, konstruktory itd., nic ciekawego.
Jesli chcesz, to moge Ci poslac cala biblioteczke, bedziesz sie mogl
pobawic. :-)
Quote:
Przyklad 3: Chcialbym w czasie kompilacji rozwiazywac pewne
rownania rekurencyjne na stalych wyrazeniach, np. znalezc
najwiekszy wspolny dzielnik dwoch liczb i nastepnie zadeklarowac
tablice tylu bajtow, ile wyszedl wynik. Jak to zrobic w C?
Hm, preprocesor C++ jest lepszy od zwyklego C ?
Nie, jest dokladnie taki sam. Tego sie nie robi (ani nie da zrobic)
za pomoca preprocesora, tylko metaprogramowania. Na przyklad
znalezienie najwiekszego wspolnego dzielnika (wklejam programik
studenta

):
#include <iostream>
//zaleznosc rekurencyjna dana jest wzorem: nwd(a,b)=nwd(b,a mod b)
template<unsigned int a, unsigned int b>struct GCD{
enum{val=GCD<b, a % b>::val};
};
//specjalizacja - przypadek szczegolny: nwd(a,0)=a
template<unsigned int a>struct GCD<a,0>{
enum{val=a};
};
int main(void){
std::cout<<GCD<12,45>::val<<std::endl;
return 0;
}
Quote:
Przyklad 4: Chcialbym wymusic na kompilatorze rozwijanie
jakiejs sekwencji wywolan funkcji. Jak to zrobic w C?
Nie bardzo rozumiem.
Masz, powiedzmy, wzorzec N-elementowego wektora liczb typu double.
Chcemy dodac wektory A i B, zapisujac wynik w C, co mozna zapisac tak:
for(unsigned int i = 0; i < N; ++i)
C[i] = A[i] + B[i];
N jest stala, ale rozwijanie petli w kompilatorach bywa takie sobie,
wiec dobrze wymusic to w przenosny sposob. Jesli N=2, to
kompilator ma automatycznie wygenerowac:
C[0] = A[0] + B[0];
C[1] = A[1] + B[1];
Jesli N=3, to:
C[0] = A[0] + B[0];
C[1] = A[1] + B[1];
C[2] = A[2] + B[2];
i tak dalej, a jak N jest duze, np >= 5, to kompilator ma nie
rozwijac, lecz zostawic petle. No i jak to zrobic w C? :-)
Quote:
no 128 bajtow, 4KB kodu

)
Tej nie zuzywamy ani bitu.
Quote:
OK, ale chodzilo mi o te ktore spowoduja wymogi takze po kompilacji.
Czyli w sumie tylko funkcje wirtualne i RTTI. No to
po prostu tego nie uzywaj, to Ci sie nic nie dolaczy. :-)
Quote:
Chyba ze sie przypadkiem wlacza mechanizmy wirtualne obiektow.
"Przypadkiem"? :-)
Quote:
Ile to zajmuje "dynamic type cast" [moglem zle zapamietac] -
dynamic_cast<>().
Quote:
z 50 KB ?
Mozliwe, ale po co uzywac dynamicznego sprawdzania typu?
Przyznam szczerze, ze w zyciu jeszcze nie mialem takiej
potrzeby.
Quote:
Hm, juz nie pamietam .. ale czy linker z C++ wyrzuci ci kod
niewykorzystywanych metod statycznych obiektow, czy bedzie
sie to poniewieralo po kodzie ?
Nie wiem, pewnie to zalezy od linkera. Na pewno wyrzuci funkcje
nieuzywane w danej jednostce translacji, ale globalnej analizy
przeplywu raczej nie przeprowadzi.
Pozdrawiam
Piotr Wyderski
Goto page Previous 1, 2, 3 Next