Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Modularno rogramiranje (potprogrami)

[es] :: C/C++ programiranje :: C/C++ za početnike :: Modularno rogramiranje (potprogrami)

[ Pregleda: 1601 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Konstantin91
Konstantin Petrovic
Mladenovac

Član broj: 57918
Poruke: 168
*.bitinfo.rs.



+34 Profil

icon Modularno rogramiranje (potprogrami)28.05.2012. u 21:41 - pre 144 meseci
Student sam na Viser-u i trenutno me malo muci ovo modularno programiranje.
teoretski deo sam procitao, jos koristim i Laslovu knjigu iz C-a (mada je isti princip i za Cpp)
ali nigde nisam nasao konkretan primer.
Konkretno ne kapiram kako povezati potprograme.
Koristim Microsoft VC 2010 express

Ako imam glavni program koji cu nazvati main.c i ako npr. zelim da promenljive koje sam u njemu deklarisao saberem u drugom potprogramu (ovo mogu i u main funkciji a mogu i zasebnu funkciju ali sam samo dao kao prost primer)
Prvo promenljive globalno deklarisem, a u potprogramu koji bi se zvao npr. pot.c ih dohvatam uz pomoc prefiksa extern (npr. u main.c globalno deklarisem promenljivu a tipa int a u pot.c je dohvatam sa extern int a)
Takodje mislim (a ispravite me ako gresim) da osim ovog nacina to mogu raditi i preko datoteke, npr. pom.h i u njoj cu da deklarisem promenljive kako bih skratio pisanje..... (na kraju mislim i da sve moze da se uradi preko namespace-a u Cpp)

Ono sto mene zbunjuje je kako ja povezujem potprograme u jednu celinu, tj jedan exe koji cu da izvrsim... ?
Evo konkretnog primera
Code:

/* main.c */
#include <stdio.h>
int a=5, b=6, c;
int main()
{
fprintf(stdout,"\nC je %d\n", c);
return 0;
}


Code:

/* pot.c */
extern int a, b, c;
int f1()
{
c=a+b;
}


Interesuje me da li sam negde u konkretnim primerima pogresio i ako jesam da mi neko pokaze greske i da mi objasni sta i kako, i kako se konkretno povezuju ovi potprogrami u jednu celinu u vidu exe ???
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Modularno rogramiranje (potprogrami)28.05.2012. u 22:46 - pre 144 meseci
Prvo treba da razlikuješ deklaracije od definicija. Deklaracija promenljive određuje njeno ime i tip, a definicija sve to i još rezerviše memorijski prostor u objektnom fajlu (.obj kod MSVC). Deklaracija funkcije određuje njeno ime, broj i tip argumenata u navedenom redosledu i tip povratne vrednosti. Definicija funkcije osim toga sadrži i telo, tj. određuje šta i kako funkcija radi, za šta je potrebno rezervisanje memorijskog prostora u objektnom fajlu. Definicije makroa i tipova su zapravo deklaracije jer ne zauzimaju memorijski prostor.

Drugo što treba da znaš je šta su jedinice za prevođenje. Jedinica za prevođenje se sastoji od tačno jednog .c fajla i svih .h fajlova koje on uključuje #include direktivama. Pritom, ako fajl modul.c uključuje zaglavlje modul.h koje uključuje zaglavlje bib.h, onda se smatra da modul.c takođe uključuje fajl bib.h. Jedinica za prevođenje u jednom projektu ima tačno onoliko koliko i .c fajlova. Sa druge strane, tipično je svaki od .h fajlova deo više jedinnica za prevođenje u projektu. Jedinica za prevođenje se prevodi naredbom za prevođenje kojoj se zadaje odgovarajući .c fajl. Na taj način se dobija tačno onoliko objektnih fajlova koliko ima jedinica za prevođenje, odnosno tačno onoliko koliko ima .c fajlova. Na kraju se svi objektni fajlovi povezuju u jedan izvršni fajl (.exe, .lib ili .dll kod MSVC). Ceo postupak prevođenja je automatizovan kod većine okruženja u koje spada i MSVC.

U zaglavlja (.h fajlove) se stavlja tačno ono što treba da bude vidljivo iz više jedinica za prevođenje, pri čemu se ništa ne stavlja u više od jednog zaglavlja i pri čemu se u zaglavlaj nikada ne stavljaju definicije koje zauzimaju memorijski prostor, tj. definicije promenljivih i funkcija. Memorijski prostor se rezerviše u tačno jednoj jedinici za prevođenje u programu u .c fajlu. Ukoliko funkcija ili promenljiva treba da bude vidljiva iz više jedinica za prevođenje, njenu deklaraciju stavljamo u odgovarajuće zaglavlje, a definiciju u odgovarajući .c fajl. Ukoliko definicija makroa ili tipa treba da bude vidljiva iz više jedinica za prevođenje, stavljamo je u odgovarajuće zaglavlje i nigde više. Sve što ne treba da bude vidljivo iz više jedinica za prevođenje, stavljamo isključivo u odgovarajući .c fajl.

Uobičajeno je da zaglavlja predstavljaju logičke celine i da ako u zaglavlju ima deklaracija nečega što zahteva memorijski prostor, da se to definiše u istoimenom .c fajlu. Sa druge strane, nije uobičajeno da se u fajlu u kome se definiše main funkcija definiše bilo šta što ne treba da bude vidljivo u drugim jedinicama za prevođenje. Takođe, uobičajeno je da se svako zaglavlje ogradi zaštitnim direktivama protiv višestrukog uključivanja. Recimo, fajl library.h bi trebao da počinje sa

Code:
#ifndef LIBRARY_H
#define LIBRARY_H


a da se završava sa

Code:
#endif


koje odgovara prvoj #ifndef direktivi (ako u zaglavlju ima više #if* direktiva, uobičajeno je da svaka ima svoj #endif u istom zaglavlju)

MSVC dopušta i stavljanje direktive

Code:
#pragma once


ali ta pragma direktiva nije pokrivena C standardom, tako da neće raditi na drugim prevodiocima.

Jedno od mogućih rešenja tvog zadatka je

fajl main.c:

Code:
#include <stdio.h>
#inlcude "bib.h"

int a=2, b=3, c;

int main()
{
    f();
    printf("%d\n", c);

    return 0;
}


fajl bib.h:

Code:
#ifndef BIB_H
#define BIB_H

extern int a, b, c;
void f();

#endif


fajl bib.c

Code:
#include "bib.h"

void f()
{
    c = a + b;
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Modularno rogramiranje (potprogrami)28.05.2012. u 22:48 - pre 144 meseci
Kod tebe je konkretno problem što funkcija main koristi funkciju f1 čija deklaracija joj nije poznata.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Konstantin91
Konstantin Petrovic
Mladenovac

Član broj: 57918
Poruke: 168
*.bitinfo.rs.



+34 Profil

icon Re: Modularno rogramiranje (potprogrami)30.05.2012. u 20:57 - pre 143 meseci
Odlican primer ste naveli, tj ispravan primer onoga sto sam ja napisao...
Samo ako mozete da mi objasnite neke stvari...
u glavnom modulu main.c imamo globalne promenljive tipa int to su a, b i c. Sobzirom da su im dodeljene vrednosti onda su i definisane.
Ali takodje u isti taj modul po vasem primeru ukljucujemo biblioteku bib.h koja sadrzi deklaraciju funkcije void f1() ali i extern int a, b, c
sada ne kapiram zasto u istom modulu imamo definisane globalne promenljive a, b i c pa ukljucujemo i extern a, b, c... ?
Ajde za funkciju to razumem jer posle u main-u pozivamo tu funkciju koja je u potprogramu bib.c izracunala ono sto smo zadali...

takodje u potprogram isto ukljucejemo biblioteku bib.h i to je u redu samo ne znam da li je potrebno u tom slucaju napisati extern void f1() , tj da to stoji u biblioteci ?
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Modularno rogramiranje (potprogrami)30.05.2012. u 22:45 - pre 143 meseci
Funkcija f neće znati šta su a, b i c ako nema njihove deklaracije. Zato ih fajl bib.c povlači iz bib.h. Fajlu main.c te prethodne deklaracije ne smetaju. Isto tako, ako se deklaracija funkcije f() ne stavi u zaglavlje, main() funkcija neće znati šta je to. To je tvoja izvorna greška. Takođe, pročitaj detaljnije ono što sam pisao.

Citat:
Nedeljko: U zaglavlja (.h fajlove) se stavlja tačno ono što treba da bude vidljivo iz više jedinica za prevođenje, pri čemu se ništa ne stavlja u više od jednog zaglavlja i pri čemu se u zaglavlja nikada ne stavljaju definicije koje zauzimaju memorijski prostor, tj. definicije promenljivih i funkcija. Memorijski prostor se rezerviše u tačno jednoj jedinici za prevođenje u programu u .c fajlu.

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Modularno rogramiranje (potprogrami)

[ Pregleda: 1601 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.