Mala šola C

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Mala šola C

OdgovorNapisal/-a Kroko » 24 Sep 2015, 21:56

Prav je, da začnemo z malce zgodovine. Preveč ne bom nakladal saj vse piše na wikipediji.

Zgodovina
Programski jezik C je ustvaril Dennis Ritchie v AT&T Bell laboratorijih leta 1972. C je bil narejen ker so potrebovali jezik za narediti operaciski sistem UNIX. Ime je dobil po jeziku B iz katerega izhajaja.

Leta 1989 ga je kot standard priznal ANSI, leta 1990 pa še ISO.

Osnovne značilnosti
Po lastnostih je zelo podoben asemblerju. Tudi v C kodi lahko uporabljaš asembler kar zelo uporabljamo pri mikrokontrolerjih.
C programi so portabillni. Brez velikih sprememb lahko tečeje na različnih platformah.
C podpira veliko podatkovnih tipov, zna delati tudi z biti.
C podpira veliko uporabnih funkcij ter uporabne stavke za zanke on pogoje.
Kazalci imajo direkten dostop do spomina.
Programira se lahko modularno.

Uporabnost C-ja je pravzaprav neomejena. V C-ju se lahko naredi vse. Od operacijskih sistemov, raznih večjih ali manših aplikacij kot tudi programov za mikrokontrolerje.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2015, 08:39

Moj prvi C program
Preden napišemo prvi C program spoznajmo nekaj pravil.

1. Vsak C program mora imeti natančno eno „main“ funkcijo
2. Izvajanje C programa se vedno začne v „main“ funkciji.
3. Izvajanje se začne pri prvem zavitem oklepaju „{“ in konča z zadnim zavitim oklepajem „}“.
4. Vsi stavki v C-ju se pišejo z malimi črkami.
5. Velike črke se uporabljajo samo za simbole.
6. Vsaka C vrstica se MORA končati s podpičjem „;“.
7. Vsem spremenljivkam moramo določiti tip.
8. Komentarje lahko uporabljamo kjerkoli v programu.


No pa začnimo. Naš prvi program bo tole:

Koda: Izberi vse
#include <stdio.h>
int main()
{
   printf("Pozdravljeni v mali šoli C\n");
   return 0;
}


Verjetno se sprašujete, kaj naj sedaj s tem. Uporabite spodnjo povezavo in bo vse jasno.

http://rextester.com/MVMI7715

Ta spletna stran nam omogoča da C program prevedemo in zaženemo kar preko brskaljnika.
Bodite pozorni da bo izbrani jezik C++ (gcc) (Language: C++ (gcc)).

Čeprav je tale online compiler priročen, se bomo mi naučili uporabljati pravi prevajalnik. Več o tem kasneje.

Obstaja veliko različnih načinov kako so v kodi postavljeni oklepaji. Vsi načini so pravilni in nima smisla o temu razpravljati. Jaz bom uporabljal „Allman“ stil. Je eden najbolj priljubljenih in za moj okus najbolj čitljiv. Različne stile lahko vidite tule:
https://en.wikipedia.org/wiki/Indent_style
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2015, 20:00

Kako C program ne sme izgledati
Čeprav C program ne potrebuje forme in je lahko vse skupaj nametano skupaj se stil pričakuje od programerja. Le tako lahko koda ostane pregledna in razumljiva. O samem stilu bom pisal sproti glede na tematiko, ki jo bomo obravnavali.

Tule je primer nerazumljivega programa, ki pa vseeno pravilno deluje:

Koda: Izberi vse
#define P(X)j=write(1,X,1)
#define C 39
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N,
*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0;
s<4;s++)if((k=m[s]+g)>=0&&k<C*R&&l[s]!=k%C&&(!M[k]||!j&&c>=16!=M[k]>=16))a[f++
]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=j<f?f:j;f+=c&-16*!j;M[g]=
c|1<<s;M[*d++=e]=f|1<<(s+2)%4;}else e=d>b++?b[-1]:e;}P(" ");for(s=C;--s;P("_")
)P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2
);}

http://rextester.com/XZCC16762

Tule je še nekaj primerov res grde kode. Verjeli ali ne – obstajajo tekmovanja kdo bo napisal bolj nerazumljivo kodo. Tam sem te primere tudi dobil.

Koda: Izberi vse
#define p struct c
#define q struct b
#define h a->a
#define i a->b
#define e i->c
#define o a=(*b->a)(b->b,b->c)
#define s return a;}q*
#define n (d,b)p*b;{q*a;p*c;
#define z(t)(t*)malloc(sizeof(t))
q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s
v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s
w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s
t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u,
a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);}

http://rextester.com/PEMB90726

Koda: Izberi vse
#define _ F-->00||-F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}

http://rextester.com/BHLX67818

Koda: Izberi vse
#include <stdio.h>
unsigned char w,h,i,l,e,x,y=10,z=10,E[256];
#define whi1e(j,k)  printf(j,k); fflush(stdout)
#define o E[w]

main   (c,v)   char *v[]; {
while   (c>=2   ){z = atoi(v[1]),--c;
while    (c>=2   )y = atoi(v[2]),--c;}
whi1e   ("%s"   ,"2.");
while   (--y)   --x;
while   (--x)   --e,--y;
while   (--z)   --x;
while   (--x)   --e,--z;
while   (--w)   {
while   (--x)   --o;}
while   (--z)   {
while   (--x)   --w;
while   (--o)   ;
while   (--w)   ;
while   (--e)   --x;
while   (--x)   --w,--e;
while   (--w)   {
while   (--l)   ;
while   (--i)   --l;--l;
while   (--h)   ;
while   (--y)   --x;
while   (--x)   --h,--y;
while   (--x)   --h;
while   (--h)   {
while   (--o)   --x;
while   (--x)   --l,--o;
while   (l>=w   ){--i;
while   (--w)   --l,--x;
while   (--x)   --w;--l;}}
while   (--o)   ;
while   (--l)   --x;
while   (--x)   --o;}
while   (--i)   --h;
whi1e   ("%x"   ,--h);--e;}
whi1e   ("%s"   ,"\n");}

http://rextester.com/BLKSTE57710

Za domačo nalogo morate vse te primere preizkusiti na tej spletni strani:
http://rextester.com/runcode

Da ste domačo nalogo opravili potrdite tule:
viewtopic.php?f=17&t=3089
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 26 Sep 2015, 22:55

Compiler in linker
Preden nadaljujemo moramo spoznati še nekaj stvari.

Izvorna oz. source kodo napišemo v urejevalniku besedila in shranimo v datoteki s končnico „.c“. Pod urejevevalnikom besedila mislim programe tipa „notepad“, „notapad++“, emEditor“,... Sem prepričan, da nekateri uporabljate kaj še boljšega. Mogoče nam lahko zaupate kaj.

Sedaj, imamo .c datoteko v kateri je zapisan naš program, naša source koda. To datoteko moramo prevesti v nekaj, kar bo razumela mašina. Za to uporabimo prevajalnik oz. compiler. Obstaja veliko različnih prevajalnikov. Enega, takega online, smo spoznali že zgoraj.

Mi bomo uporabljali compiler imenovan „gcc“. GCC ima dolgo zgodovino. Dela na različnih platformah in generira kodo za različne platforme. Ni nepomembno, da je brezplačen. Kogar zanima več lahko prebere tukaj:
https://en.wikipedia.org/wiki/GNU_Compiler_Collection

GCC bo torej prevedel našo .c datoteko v mašinsko „object“ datoteko z .obj končnico. GCC nam bo povedal, če smo naredili kakšno napako in nas bo opozoril če je je kaj čudnega.

Sedaj imamo to .obj datoteko vendar si z njo še vedno ne znamo pomagati. Nekako jo moramo naložiti v mašino in zagnati. Tu nam bo pomagal linker. Linker bo vzel našo .obj datoteko (ali pa več obj datotek) in naredil zagonski program (.exe), knjižnico (.lib, .dll) ali pa novo objektno datoteko (.obj).

Končnice, ki sem jih tu omenjal se uporabljajo na Windows platformi. Drugje so drugačne ampak pomen je pa isti.
Naj opozorim še, da ta „object“ nima nobene veze z objekti poznanimi iz objektnega programiranja.

Domača naloga 2
Za drugo domačo nalogo naredite .c datoteko in jo prilepite tule:
viewtopic.php?f=17&t=3101
Za vsebino lahko uporabite primer "Moj prvi C program" le da spremenite besedilo, ki se izpiše.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 27 Sep 2015, 19:48

Namestitev GCC
Pripraviti si moramo torej okolje, v katerm bomo delali. Jaz bom to počel na Windows. Za razliko od Linuxa, kjer je ponavadi že vse nameščeno, se bom tu moral malce znajti.

Na Windows platformi bomo uporabili „mingw“ verzijo GCC-ja. Uporabili bomo precej popularno verzijo, ki podpira tako 32 kot 64 bitne sisteme.

http://mingw-w64.org/doku.php

Snamemo ga lahko tule:

http://sourceforge.net/projects/mingw-w ... e/download

„mingw-w64-install.exe“ je installer, ki nam bo namestil potrebna orodja.

gcc1.png

gcc2.png

gcc3.png

gcc4.png

gcc5.png

gcc6.png
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 27 Sep 2015, 19:49

Privzeta nastavitev je v direktorij:
„C:\Program Files\mingw-w64\i686-5.2.0-posix-dwarf-rt_v4-rev0\mingw32\bin“

Pot je lahko pri komu drugačna zato preverite.

To pot kar dodamo v sistemski path. Tako lahko GCC preprosto uporabljamo iz komandne vrstice.
Pazite, da ne boste pobrisali tega, kar je že v sistemskem pathu. Svojo pot dodate na konec in pazite, da so poti ločene s podpičjem.

path.png
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 27 Sep 2015, 19:54

Da smo GCC pravilno namestili preverimo tako, da odpremo komandno konzolo in napišemo
gcc –-version

Če je vse prav bi se nam morala izpisati verzija GCC-ja. V mojem primeru 5.2.0.

gccver.png
gccver.png (9.11 KiB) Videno 1769 krat


Domača naloga 3
Namestite GCC in preverite, če pravilno deluje.
viewtopic.php?f=17&t=3116

Od tu naprej bomo GCC redno uporabljali zato je zelo pomembno, da to domačo nalogo res naredite.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 28 Sep 2015, 20:42

Moj prvi C program - drugič
Sedaj bomo naš prvi program prevedli še z našim ravnokar nameščenim GCC-jem.

Odprite urejevalnik besedil (editor) in vanj skopirajte tole:

Koda: Izberi vse
#include <stdio.h>
int main()
{
   printf("Pozdravljeni v mali šoli C\n");
   return 0;
}


Datoteko shranite pod imenom „prvi.c“. Svetujem, da ustvarite nov direktorij. Jaz bom imel takole: „C:\MalaSolaC\Prvi“.
prvi1.png


Odprite komandno konzolo. Najprej bo potebno izbrati pravi direktorij:
cd c:\MalaSolaC\Prvi

Nato bomo prevedli naj prvi program:
gcc prvi.c -o prvi.exe
prvi2.png
prvi2.png (6.17 KiB) Videno 1657 krat


Če je smo vse naredili pravilno se nam je generirala datoteka prvi.exe. Sedaj lahko zaženemo naš prvi C program tako, da v komandno konzolo napošemo „prvi“.
prvi3.png
prvi3.png (6.9 KiB) Videno 1657 krat


Verjetno je, da se šumniki ne bodo pravilno prikazali. O temu bomo kakšno rekli v nadaljevanju.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 28 Sep 2015, 21:09

Datoteko lahko zaženemo tudi z dvoklikom na "prvi.exe". Program se bo zagnal vendar se bo tako hitro končal, da tega verjetno sploh ne boste opazili. Zato bomo dodali še eno vrstico.

Koda: Izberi vse
#include <stdio.h>
int main()
{
   printf("Pozdravljeni v mali šoli C\n");
   getchar();
   return 0;
}


Zaradi getchar(); vrstice bo program počakal da pritisnemo tipko "enter", preden se nadaljuje (in konča). Če ga sedaj zaženemo z dvoklikom po lepo počakal.

Domača naloga 4
Potrebno je prevesti program z GCC in ga zagnati. Nato še dodati getchar(); in ponovno prevesti/zagnati.
viewtopic.php?f=17&t=3125

Sedaj smo pripravljeni, da lahko začnemo. Tistim, ki niste najbolj vešči komandne konzole, datotek, editorja,... priporočam malce več vaje saj bomo to sedaj pogosto uporabljali.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 29 Sep 2015, 12:00

Kako je C program sestavljen?

C program je ponavadi sestavljen iz:
  • predprocesorskih komand
  • funkcij
  • spremenljivk
  • stavkov in izrazov
  • komentarjev

Če pogledamo naš program

Koda: Izberi vse
#include <stdio.h>
int main()
{
   /* moj prvi C program */
   printf("Pozdravljeni v mali šoli C\n");
   return 0;
}


  • Prva vrstica „#include <stdio.h>“ je predprocesorska komanda, ki pove C programu naj vključi stdio.h v prevajajnje.
  • Naslednja vrstica „int main()“ je glavna funkcija kjer se začne izvajanje programa. Ta funkcija se začne z zavitim in konča z zavitim oklepajem.
  • „/* … */“ je komentar in bo ignorirana med prevajanjem.
  • Naslednja vrstica „printf(...)“ je funkcija, ki izpiše besedilo na ekran.
  • Zadnja vrstica „return 0;“ terminira funkcijo „main()“ in vrne rezultat 0.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 01 Okt 2015, 20:06

Členi (tokens)

V C-ju se vse posamezne besede, ločila, karakterji,... imenujejo členi (tokens). To so osnovni gradniki C-jezika.

Tokenov v vrstici „printf("Pozdravljeni v mali šoli C\n");“ je pet in so:

printf
(
"Pozdravljeni v mali šoli C\n"
)
;

Ključne besede (keywords)
Klučne besede so rezervirane besede ki se ne smejo uporabljati kot identifikator. C pozna 32 ključnih besed:
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

Podpičje
Podpičje zaključuje stavke. Vsak posamezen stavek mora biti zaključen s podpičjem. V našem primeru imamo dva stavka:
„printf("Pozdravljeni v mali šoli C\n");“ in „return 0;“

Komentarji
So pomožno sesedilo v programu in jih compiler ignorira. Začnejo se z „/*“ in končajo z „*/“. Vse, kar je vmes je komentar. Komentarji znotraj komentarjev niso dovoljeni. Prav tako ni možen komentar znotraj stringa.

Identifikatorji
C identifikator je ime, ki se uporablja za poimenovanje spremenljivk in funkcij. Začeti se mora obvezno s črko ali podčrtajem. Naprej so lahko črke ali številke. Drugi znaki niso dovoljeni. C je občutliv na velike ina male črke. „mala“ in „Mala“ sta tako dva različna identifikatorja.

Tekom te male šole bomo vse spoznali in se jih naučili uporabljati.

Preprocesorske direktive (vrstice, ki se začnejo z #) niso členi. To so komande, ki povedo prevajalniku, kako je potrebno našo kodo "prežvečiti". Več o temu enkrat drugič.

Domača naloga 5
Preštejte in naštejte člene svojega prvega .c programa.
viewtopic.php?f=17&t=3169

Za vajo je tu še nekaj primerov (najdeni so na spletu):
Koda: Izberi vse
#include <stdio.h>
 
main()
{
   int number;
 
   printf("Enter an integer\n");
   scanf("%d",&number);
 
   printf("Integer entered by you is %d\n", number);
 
   return 0;
}


Koda: Izberi vse
#include <stdio.h>
 
main()
{
   int x = 1;
 
   if ( x == 1 )
      printf("x is equal to one.\n");
   else
      printf("For comparison use == as = is the assignment operator.\n");
 
   return 0;
}


Koda: Izberi vse
#include <stdio.h>
 
main()
{
   int value = 1;
 
   while(value<=3)
   {
      printf("Value is %d\n", value);
      value++;
   }
 
   return 0;
}
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 07 Jan 2016, 02:18

Tipi podatkov (data types)

V C-ju imamo na voljo veliko različnih tipov podatkov, ki jih lahko določimo spremenljivkam. V osnovi se delijo na:
  • Osnovne tipe
  • Tip „void“
  • Enumerirane tipe
  • Izpeljane tipe
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 21 Mar 2016, 09:55

Osnovni tipi se delijo na:

Celoštevilčne (integer)
char 1 byte, -128 to 127 ali 0 to 255
unsigned char 1 byte, 0 to 255
signed char 1 byte, -128 to 127
int 2 ali 4 byte, -32,768 do 32,767 ali -2,147,483,648 do 2,147,483,647
unsigned int 2 ali 4 byte, 0 do 65,535 ali 0 do 4,294,967,295
short 2 byta, -32,768 do 32,767
unsigned short 2 byta, 0 do 65,535
long 4 byte, -2,147,483,648 do 2,147,483,647
unsigned long 4 byte, 0 do 4,294,967,295
long long 8 bytov, -9223372036854775807 do +9223372036854775807
unsigned long long 8 bytov, 0 do 18446744073709551615

Plavajoče (float)
float 4 byte, 1.2E-38 do 3.4E+38 (6 decimalk)
double 8 bytov, 2.3E-308 do 1.7E+308 (15 decimalk)
long double 10 bytov, 3.4E-4932 do 1.1E+4932 (19 decimalk)


Lepše in bolje poravnano:-) je to opisano tule:
https://en.wikipedia.org/wiki/C_data_types
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 21 Mar 2016, 10:23

Poseben tip je "void".

„void“ tip se uporablja kadar tip ni določen. To je v treh primerih:
- Funkcija nič ne vrne.
- Funkcija nič ne sprejme.
- Kazalec tipa void*, ki predstavlja naslov objekta, ne pa njegovega tipa.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 00:23

tilz0R se je lepo lotil kazalcev / pointerjev. Pointerji so ena najboljših in najbolj uporabnih stvari kar jih v programiranju sploh je.
Kakorkoli, zdelo se mi je, da bi napisal še kaj uporabnega.
char: 1-byte
short: 2-byta
int: odvisno od arhitekture, ampak ta vodič predvideva, da smo na 32-bitni arhitekturi (recimo ARM), to predstavljajo 4-byti
long: 4-byti
long long: 8-bytov
float: 4-byti
double: 8-bytov

Ja kdo si bo pa to zapomnil?
Jaz si stvari poenostavim takole: (a to vemo, da je v enem bytu 8 bitov?)
Koda: Izberi vse
typedef S8 signed char;
typedef U8 unsigned char;
typedef S16 signed short;
typedef U16 unsigned short;
typedef S32 signed long;
typedef U32 unsigned long;


S tem sem definiral svoje tipe. Tako namesto "unsigned long" sedaj uporabljam "U32". Na primer:
Koda: Izberi vse
U32 a = 10;
U32 b = 20;
U32 c = a+b;
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 00:51

Kaj pa prižiganje ledic?. V user manualu piše takole:
pins.jpg

GPIO pomeni general purpose input output port. Po domače - to so pini, ki jih lahko prižigamo ali ugašamo.
Našo ledico imamo priklopljeno na port4, pin 2. Kaj sedaj?

GPIO registri se začnejo na naslovu 0x400F4000. Port 4 je 0x2110 višje se pravi na 0x400F6110. Tam je 32 bitov (ravno za en U32 tip). Posamezni biti so opisani v tabeli 264. Ker je naša ledica na drugem pinu (štejemo jih od 0) pomeni, da lahko ugotovimo če je prižgana tako, da preberemo tretji bit na naslovu 0x400F6110.

Takole v spremenljivko port4 prekopiramo vrednost (stanje) celotnega porta 4.
Koda: Izberi vse
U32 port4 = *(U32*)0x400F6110;


Besedo prekopiramo sem podčrtal. Kopija namreč ni enaka originalu. Če se stanje porta 4 spremeni se naša spremenljivka ne bo spremenila.
Koda: Izberi vse
if (port4 !=  *(U32*)0x400F6110)
{
  //port 4 se je spremenil!
}


Takole tudi lahko:
Koda: Izberi vse
U32* port4Ptr = (U32*)0x400F6110;

V spremenljivko port4Ptr smo spravili naslov porta 4. Sedaj lahko to grozno številko pozabimo. port4Ptr je bolj prijazno.
Še vedno lahko naredimo takole:
Koda: Izberi vse
U32 port4 = *port4Ptr;


Kaj pa če hočemo lašo ledico prižgati? Preprosto, na naslovu 0x400F6110 moramo tretji bit prižgati. Takole:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

in prižgati:
Koda: Izberi vse
*port4Ptr |= 0x04;

in ugasniti:
Koda: Izberi vse
*port4Ptr &= ~0x04;

...

Hej, imamo LED blinker.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 01:01

Še za Arduino fane.

Na Arduino ploščico pogledamo, na katero številko smo ledico priklopili. Recimo, da na pin 3.
Vklopimo jo takole:
Koda: Izberi vse
digitalWrite(3, HIGH);

izklopimo pa takole
Koda: Izberi vse
digitalWrite(3, LOW);

Razen podpičja na koncu nič od zgoraj napisanega nima veze s C-jem. Čeprav naša ledica utripa nismo C-ja uporabili povsem nič. Tako se C-ja ne da naučiti.

Tule je malce bolj na široko in s slikami:
http://www.instructables.com/id/Basic-A ... nking-LED/
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 13:35

Vseeno moramo priznati, da je Arduino način prijaznejši. Kaj torej lahko naredimo?

Za začetek lahko definiramo naslov, ki ga najdemo v user manualu krmilnika:
Koda: Izberi vse
#define GPIO_PORT_PORT_Def 0x400F6110


User manual pravi, da na tem naslovu najdemo 8 portov, vsak je velik 32 bitov. Lahko definiramo strukturo:
Koda: Izberi vse
typedef struct
{
  U32 Pins0,
  U32 Pins1,
  U32 Pins2,
  U32 Pins3,
  U32 Pins4,
  U32 Pins5,
  U32 Pins6,
  U32 Pins7,
} GPIO_PORT_Struct;


Oziroma bolj preprosto:
Koda: Izberi vse
typedef struct
{
  U32 Pins[8],
} GPIO_PORT_Struct;


Sedaj pa še definirajmo, kje se ta struktura nahaja:
Koda: Izberi vse
#define GPIO_PORT ((GPIO_PORT_Struct*) GPIO_PORT_PORT_Def )


Če primerjate kodo v tem postu s tisto zgoraj boste opazili, da gre v bistvu za isto stvar. Le da sedaj naredimo takole:
Koda: Izberi vse
U32 port4 = GPIO_PORT ->Pins[4];
//bla bla
if (port4 !=  GPIO_PORT->pins[4])
{
  //port 4 se je spremenil!
}
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 13:55

Čeprav smo že precej poenostavili je Arduino še vedno prijaznejši. Se pravi, da definirajmo še nekaj stvari
Koda: Izberi vse
#define GET_PIN(port, pin) (!!(GPIO_PORT ->Pins[(port)] & (1UL << (pin))))
#define SET_PIN_ON (port, pin) (GPIO_PORT ->Pins[(port)] |= (1UL << (pin)))
#define SET_PIN_OFF (port, pin) (GPIO_PORT ->Pins[(port)] &= ~(1UL << (pin)))


Naš blinker sedaj izgleda takole:

Koda: Izberi vse
SET_PIN_ON(4, 2);
SET_PIN_OFF(4, 2);
SET_PIN_ON(4, 2);
SET_PIN_OFF(4, 2);
...


To pa je že precej podobno Arduinotu. Čeprav meni to ni všeč, pa lahko, da bi bilo skoraj isto, naredim še tole:
Koda: Izberi vse
#define digitalWrite(port, pin, value) if (value) {SET_PIN_ON((port), (pin));} else {SET_PIN_OFF((port),(pin));}


Uspelo nam je. Naredili smo svojo knjižnico za vklop/izklop pinov. Pomagali smo si samo z krmilnikovim user manualom. Na skoraj enak način lahko isto naredimo za katerikoli krmilnik. Tale primer je za LPC4357.

Najlepše pri tem je, da smo se naučili kar nekaj C-ja in blinker izpeljali povsem samostojno - brez nekih copy/paste knjižnic.

Vem, da je za koga tole prehudo. Zato pa je tema z debato tule:
viewtopic.php?f=17&t=3076

Mogoče se je tudi kdo, ki že pozna C, naučil kaj novega?

PS
Vse tole pisanje je iz glave na prvo žogo. Če je kje kakšna napaka me opozorite, pa bom popravil.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 15:54

Namesto d ponavljam SET_PIN_ON(4, 2); in SET_PIN_OFF(4, 2); do nezavesti ju raje dam v neskončno zanko. Na primer takole:
Koda: Izberi vse
while(1)
{
  SET_PIN_ON(4, 2);
  SET_PIN_OFF(4, 2);
}

ali pa takole:
Koda: Izberi vse
for(;;)
{
  SET_PIN_ON(4, 2);
  SET_PIN_OFF(4, 2);
}

ali pa celo takole grdo:
Koda: Izberi vse
LOOP:
SET_PIN_ON(4, 2);
SET_PIN_OFF(4, 2);
goto LOOP;
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a VolkD » 25 Sep 2016, 17:06

Kroko je napisal/-a:ali pa celo takole grdo:
Koda: Izberi vse
LOOP:
SET_PIN_ON(4, 2);
SET_PIN_OFF(4, 2);
goto LOOP;

Zakaj vedno rečete da je grdo če se uporabi goto stavek ?
Meni se zdi popolnoma jasen kar se razumevanja tiče, tudi prevajalnik ga prevede v nekaj kar procesor že native razume.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41597
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9015 krat
Prejel zahvalo: 5132 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a Kroko » 25 Sep 2016, 18:49

V tem primeru je goto slabše čitljiv. Pri treh vrsticah je res vseeno, kaj pa če je vrstic več? "LOOP:" ne pove prav dosti, "while (1)" pa je povsem jasen.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Mala šola C

OdgovorNapisal/-a VolkD » 25 Sep 2016, 21:30

Kroko je napisal/-a: "LOOP:" ne pove prav dosti, "while (1)" pa je povsem jasen.
Celi v asm je nekakšno nepisano pravilo da se za labelo v glavni zanki uporablja main_loop. Zank je namreč v programu običajno veliko.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41597
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9015 krat
Prejel zahvalo: 5132 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost