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

Upotrba "static vector" u dva razlicita cpp fajla.

[es] :: C/C++ programiranje :: Upotrba "static vector" u dva razlicita cpp fajla.

[ Pregleda: 1635 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon Upotrba "static vector" u dva razlicita cpp fajla.08.04.2010. u 21:04 - pre 120 meseci
Potrebno mi je da u dva razlicita cpp fajla pristupim istom vectoru.

Ubacio sam u "stdafx.h"
static vector<int> availableSystemPorts;


U jednom cpp fajlu ga punim sa:

availableSystemPorts.push_back(0);
availableSystemPorts.push_back(3);
availableSystemPorts.push_back(1);
availableSystemPorts.push_back(2);

i availableSystemPorts.size() vraca 4 kako je i ocekivano.

U drugom cpp fajlu availableSystemPorts.size() vraca 0.


Ne znam gdje grijesim, kako mogu postici da i u drugom cpp fajlu vidim istu instancu availableSystemPorts i da mi i drugom slucaju vrati 4?


Primjer koda koji demonstrira moj problem (vc2008 express):
Link za vc2008 express primjer


 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.08.04.2010. u 21:25 - pre 120 meseci
Ne valja ti poso. Najbolji nacin za tretiranje takve situacije je da koristis singleton koji daje pristup pomenutom vektoru. Na primer:

Code:


#ifndef  SINGLETON_HH
#define SINGLETON_HH

//singleton.h
#include <vector>
class s_singleton {
public: 
        std::vector<int> availableSystemPorts;
    static s_singleton& instance (void) {
        static s_singleton inst;
        return inst;
    };
#ifndef __BORLANDC__
private:
#endif /* __BORLANDC__ */
    ~s_singleton(void) {}
private:
    s_singleton(void){
        availableSystemPorts.reserve(65536);
    }
    s_singleton(s_singleton const&);
    s_singleton& operator=(s_singleton const&);
};

#endif /* SINGLETON_HH */

Pa zatim u cpp fajlu:

//test1.cpp

#include "singleton.h"

int main(void) {
  s_singleton::instance().availableSystemPorts.push_back(123);
  s_singleton::instance().availableSystemPorts.push_back(234);
  s_singleton::instance().availableSystemPorts.push_back(111);
  s_singleton::instance().availableSystemPorts.push_back(100);
  return 0;
}

//itd



Tko leti vrijedi
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1224



+92 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.08.04.2010. u 22:51 - pre 120 meseci
Razlog zašto originalni poso ne valja je vrlo jednostavan. Ključna reč static u ovom kontekstu označava promenljivu koja je vidljiva samo u trenutnoj kompilacionoj jedinici (cpp fajlu). Drugim rečima, ako u 50 cpp fajlova definišeš static int x to je u stvari 50 promenljiva x, i svaka od njih je vidljiva samo u sopstvenom .cpp (ili bolje da kažemo .obj) fajlu. To što si tu globalnu promenljivu stavio u zajednički heder (pa čak i ovaj prekompajlirani) ne utiče ni na šta. Kompajler zapravo i ne vidi hedere, nego za svaki .cpp fajl vidi jedan džinovski listing u koji su utrpani svi hederi, jedan za drugim, i jedan u drugom. U svakom od tih velikih listinga se pojavljuje tvoja promenljiva, ali pošto je u pitanju globalna static promenljiva, ona je vidljiva samo unutar odgovarajućeg .obj fajla.

Zaključak - one globalne promenljive koje treba da deliš u više .cpp fajlova nemoj da deklarišeš kao static. Ovde sad postoje začkoljice oko korišćenja globalnih promenljivih, i ovo rešenje sa singletonom je rešenje za te nenavedene začkoljice.
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.09.04.2010. u 02:11 - pre 120 meseci
Jesi probao extern? (externo linkovanje)
U jednom cpp fajlu deklarises bez extern a u drugom sa.
http://msdn.microsoft.com/en-us/library/0603949d(VS.80).aspx
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.09.04.2010. u 12:35 - pre 120 meseci
Kao sto rece Mihajlo globalne promenjive su nesto sto bi trebalo apsolutno izbegavati. Bolje koristi singleton.
Tko leti vrijedi
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.09.04.2010. u 19:41 - pre 120 meseci
Pokušao sam da stavim extern u drugi cpp fajl a da ga u prvom deklarišem bez static i sve radi OK.

Juče sam istu stvar pokušao ali nisam pomislio da skinem static, čak sam mislio da ako stavim static da to znači da je promjenjljiva vidljiva u svim fajlovima/modulima.

Program na kojem radim ima više dialog funkcija koje pokušavam da prebacim u druge cpp fajlove, radi preglednosti, ali sam naletio na ovaj problem.

Tu imam i neke thread funkcije koje takođe pristupaju istom vektoru tako da mislim da je opcija sa singleton klasom sigurnija varijanta.

Bolje poznajem C nego C++ tako da prije nego primjenim ovu klasu sa singletonom treba da razumijem kako to radi.

Hvala svima na odgovorima! Mnogo sam naučio!

Pozdrav,
Ljubiša
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.beobug.com.



+7 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.09.04.2010. u 23:26 - pre 120 meseci
Prouci i Mutexe (api CreateMutex ... itd.) i koriscenje mutexa za sinhronizaciju pristupa memoriji u multithreading-u ...
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
81.93.74.*



+2 Profil

icon Re: Upotrba "static vector" u dva razlicita cpp fajla.12.04.2010. u 11:30 - pre 120 meseci
Da da, već koristim critical_section i WaitForMultipleObjects za sinhronizaciju niti.

Poz,

Ljubisa Knezevic
 
Odgovor na temu

[es] :: C/C++ programiranje :: Upotrba "static vector" u dva razlicita cpp fajla.

[ Pregleda: 1635 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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