[ ljube @ 08.04.2010. 21:04 ] @
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

[ kiklop74 @ 08.04.2010. 21:25 ] @
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


[ Mihajlo Cvetanović @ 08.04.2010. 22:51 ] @
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.
[ Eurora3D Team @ 09.04.2010. 02:11 ] @
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
[ kiklop74 @ 09.04.2010. 12:35 ] @
Kao sto rece Mihajlo globalne promenjive su nesto sto bi trebalo apsolutno izbegavati. Bolje koristi singleton.
[ ljube @ 09.04.2010. 19:41 ] @
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
[ Eurora3D Team @ 09.04.2010. 23:26 ] @
Prouci i Mutexe (api CreateMutex ... itd.) i koriscenje mutexa za sinhronizaciju pristupa memoriji u multithreading-u ...
[ ljube @ 12.04.2010. 11:30 ] @
Da da, već koristim critical_section i WaitForMultipleObjects za sinhronizaciju niti.

Poz,

Ljubisa Knezevic