Új hozzászólás Aktív témák
-
jattila48
aktív tag
válasz
borisz1994 #6064 üzenetére
Ahogy többen írták, deklarációra akkor van szükség, ha egy változót, függvényt, vagy típust előbb akarsz használni, mint ahogy definiálnád. Lokális változóknál nincs különbség, ott a deklaráció egyben helyfoglalással is jár. Főleg globális változók és körbe hivatkozások használatakor kell külön deklarálni, és defniálni. Globális változó deklarálása az extern kulcsszóval történik.Valamelyik fordítási egységben ennek definiáltnak kell lenni, a többi, rá hivatkozó TU-ban pedig extern-nel deklaráltnak kell lenni. Függény deklarációjánál extern kulcsszóra nincs szükség (bár megadható). C-ben a függvények mindig globálisak (nincs lokális fv. ellentétben néhány más programozási nyelvvel). Az előre deklarálást nem tudod elkerülni (program szöveg átrendezéssel), ha körbe hivatkozás van (pl. f fv. hívja g-t,ami hívja f-et). Ilyenkor valamelyiket mindenképp előre kell deklarálni (ezt hívják fv. prototipusnak), aminek a tényleges definícióját (a fv. kódját) csak a másik fv. definíciója után tudod megadni. Fontos eset még a struktúrák előre deklarálása. Ezt is a körbehivatkozás teszi szükségessé (pl. rekurzív adatszerkezetek), hasonlóan, ahogy fv.-ek esetén is. A struktúra definíciója hivatkozik B stuktúrára, ami szintén hivatkozik A-ra. Ekkor azonban a csak előre deklarált struktúra típus nem teljes értékű (hiszen még nem ismerjük a szerkezetét), ezért csak rá mutató pointer típus deklarálható a hivatkozó struktúrában. Az ilyen típust incomplete type-nak hívják.
-
#90088192
törölt tag
válasz
borisz1994 #6064 üzenetére
Hello,
Ha PIC32 is érdekel, akkor az alap hülyeségeken mar túl vagyok vele
-
kovisoft
őstag
válasz
borisz1994 #6061 üzenetére
Csak akkor kell külön deklarálnod a függvényt, ha hamarabb akarod használni, mint ahogy definiálva lenne vagy ha egy másik modulban van a tényleges definíció. Ellenkező esetben a definíció már maga a deklaráció is.
-
dabadab
titán
válasz
borisz1994 #6061 üzenetére
Igen, az deklaráció és alapvetően nem kell.
-
kovisoft
őstag
válasz
borisz1994 #6057 üzenetére
A többiek már leírták, hogy alapvetően jól fogalmaztad meg a deklaráció és definíció közötti különbséget, de a változóval kapcsolatos következtetésed nem helyes.A példádban az
int pelda=0;
és azint pelda;
egyaránt definíció, mindkettő lefoglal a változónak memóriát, a különbség köztük annyi, hogy az első ad is egy 0 kezdőértéket a változónak. Ennek a változónak a deklarációja ez lenne:extern int pelda;
Ez nem foglal le memóriát a változónak, csak annyit mond, hogy valahol máshol van definiálva egy pelda nevű változó, aminek int a típusa. A deklaráció tehát ahhoz kell, hogy az adott helyen tudj használni egy változót vagy függvényt, de valahol máshol kell majd definiálnod is azt. -
dabadab
titán
válasz
borisz1994 #6057 üzenetére
Benkő Tiborné - Benkő László - Tóth Bertalan : Programozzunk C nyelven! könyvet
Jézusmária
Inkább keress egy jó, érthető könyvet. Szerintem a klasszikus Kernighan-Ritchie "A C programozási nyelv" az elég jó (még ha az apád is lehetne), én annak idején abból tanultam.
Egyébként alapvetően megéretetted: a definíció az egy valaminek (változónak, függvénynek) a pontos leírása és ennek hatására a fordító meg is csinálja az ahhoz tartozó dolgokat (memóriát foglal a változónak, lefordítja a függvény kódját).
A deklaráció meg elmondja a fordítónak, hogy van itt ez az izé és ez tulajdonképpen ilyen típusú, de valahol máshol van leírva.Hogy mire jó?
Azt talán már tudod, hogy a C erősen típusos nyelv, vagyis a fordító mindig megnézi, hogy az a függvény vagy változó, amire hivatkozol, milyen típusú, mennyi és milyen típusú paramétere van - ha pedig olyasmire hivatkozol, amiről még nem hallott, akkor hibát dob.
Amíg az egész programod egy file-ban van, ez általában nem jelent áthidalhatatlan problémát, olyan sorrendbe rakod a definícókat, hogy ha B hivatkozik A-ra, akkor A előbb legyen a file-ban, mint B. De már itt is lehet komplikáció, hiszen mi van, ha az A függvény hívja a B-t a B meg az A-t? Ilyenkor jön jól a deklaráció, hogy az ember leírja a fordítónak, hogy "majd találsz egy B függvényt, ami így fog kinézni, hogy". Ettől a fordító megnyugszik és szépen lefordítja a dolgokat, ha az ellenőrzéseken amúgy átmegy (és majd a linker lesz az, aki kétségbeesik, ha a B definíciója nincs sehol
)
-
buherton
őstag
válasz
borisz1994 #6057 üzenetére
Nem egészen. Vagyis hát nem olyan triviális. Főleg a változóknál.
A deklaráció a fordítónak szól, vagyis ez ahhoz kell, hogy a fordító értelmezni tudja a leírtakat, de nincs közvetlen hatása a processzoron futó kódra. Azaz meg lehet írni a programot ezek nélkül, csak olvashatatlan lesz. A definíció a processzornak szól és enélkül nem futna úgy a programunk, ahogy szeretnék.
Kezdjük az egyszerűbbel a függvénnyel.
Ezek deklarációk:
extern void foo(void);
static int foo(int);
void foo(void);
bar(); // ez most nem függvényhívás, és ez most nagyon gonosz dolog tőlem
A fordítónak ezekkel jelzed, hogy ha talál egy ilyen szignatúrájú függvényhívást, amihez még nem találta meg a definíciót, akkor ne hasaljon el és a keywordnek megfelelően járjon el.Ezek definíciók:
void foo(void)
{}
static int foo(int)
{
return 0;
}
bar()
{
return 0;
}
Leírod, hogy mit csinál a függvény. Ezzel mondod meg, hogy mit csináljon a programod.Változók.
Ez deklaráció (nem is tudok többet ennél):
extern int;
Ugyanaz, mint a függvénynél.Ezek definíciók:
int foo;
static char foo;
Ugyanaz, mint a függvénynél.Egyébként igen, a deklaráció nem jár memóriafoglalással, a definíció jár. Viszont a deklaráció csak a láthatóságot növeli, semmi más plusz dolgot nem tud, nem befolyásolja a típust, élettartamot és a tárolási osztályt sem.
Az
int
mérete architektúra függő és alimits.h
-ban van meg a "mérete". Tipikusan 4 bájt. Ha jól emlékszem, akkor az AVR8 esetén 2 bájt méretűek.
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Motorola Edge 60 és Edge 60 Pro - és a vas?
- Konteó topic
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Hogy is néznek ki a gépeink?
- Nintendo Switch 2
- PlayStation 5
- Gaming notebook topik
- Gitáros topic
- MiLi MiTag, MiLi LiTag bluetooth trackerek
- sziku69: Fűzzük össze a szavakat :)
- További aktív témák...
- Latitude 5430 27% 14" FHD IPS i7-1265U 16GB 512GB NVMe magyar vbill ujjlolv IR kam gar
- Bomba áron dobozos új GIGABYTE /I7-13620H 16GB 1 TB SSD Nvidia RTX 4050 6GB 144 Hz FHD IPS/
- T14s Gen2i 14" FHD IPS i5-1135G7 16GB 256GB NVMe magyar vbill ujjlolv IR kam gar
- Új Poco F7 Ultra 512/16GB Black 3év garancia!
- Samsung Galaxy Watch Ultra 2év garancia!
- ÁRGARANCIA!Épített KomPhone Ryzen 5 5600X 16/32/64GB RAM RX 7600XT 16GB GAMER PC termékbeszámítással
- Kingston ValueRAM 4GB DDR3 1333MHz KVR1333D3N9
- Eladó Új Motorola G31 4/64GB szürke / 12 hónap jótállással!
- BESZÁMÍTÁS! MSI B450M R 5 5600X 32GB DDR4 512GB SSD RTX 3060 12GB Rampage SHIVA Corsair 650W
- Több Lenovo Thinkpad x1 carbon gen 4 / 5 / 6 / 7 X1 Yoga gen3 6-9. gen i7, i5 procik
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest