[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.