[ inostranac @ 19.03.2008. 20:29 ] @
| Pozdrav!
Treba mi nacin da funkciji prosledjujem promenljivi broj i tip podataka (npr. (string, int, int) ili (string, string, double, string)).
Bakcem se tu sa void tipom, dinamickom alokacijom i dereferenciranjem ali sta god sam probao, prijavljuje mi nedozvoljeno koriscenje tipa + size of void unknown. Ne biste verovali, ali cak ni google ne pomaze. Svaka ideja je dobrodosla...
Unapred hvala! |
[ X Files @ 19.03.2008. 21:12 ] @
Jesi li probao nesto od ovoga, Google: c++ variadic ?
[ inostranac @ 19.03.2008. 21:40 ] @
Da, zaboravio sam da kazem da variadic ne pomaze jer mi treba dobra kontrola nad prosledjenim argumentima (ispravite me ako gresim), tj. program ni u kom slucaju ne sme da padne ako mu se proslede nepravilni podaci (tj. vec pre pozivanja funkcije svi argumenti moraju tipski da se prokontrolisu + postoje i dodatna ogranicenja tipa taj i taj integer je iz skupa neparnih brojeva manjih od k). Izvinjavam se ako gresim, ali vec toliko razmisljam o tome da sam skoro zaboravio sta hocu...
[ NastyBoy @ 20.03.2008. 22:56 ] @
Ta ti provera treba za vreme kompajliranja ili u ran-tajmu?
[ inostranac @ 30.03.2008. 01:05 ] @
Evo mene opet. Cisto ako neko bude imao isto ovo pitanje, moze funkciji da prosledi niz pokazivaca na void (void**), ili pri inicijalizaciji prosledjuje void***. Posle toga mogu da se dodeljuju razne vrednosti.
Npr.
Code:
int initialize(void ***parameters) {
*parameters = new (void*)[N];
(*parameters)[0] = new int;
(*parameters)[1] = new string;
...
//pristup
*(int*)((*parameters)[0]) = 5;
*(string*)((*parameters)[1]) = "sta god"
}
Pozdrav!
[ NastyBoy @ 30.03.2008. 11:08 ] @
Teshko da mozhe komplikovanije od toga.
[ 1jedini @ 30.03.2008. 15:15 ] @
Za pocetak zaboravi
void*.
Predlog 1.
Napravi klasa iz koje ces posle sa
dynamic_cast da "konvertujes" u neki tip koji ti odgovara.
Npr
Code:
class Parametar { };
class IntParametar : public Parametar {public: int i; };
class StringParametar : public Parametar { public: std::string s; };
int initialize( std::vector<Parametar*> ¶meters)
{
parameters.push_back( new IntParametar );
parameters.push_back( new StringParametar );
}
int obradi( std::vector<Parametar*> ¶meters)
{
IntParametar *i = dynamic_cast<IntParameta*r>( parameters[0]) ;// ovako se stitis ako je kojim slucajem promasen tip
StringParametar *s = dynamic_cast<StringParametar*>( parameters[1]); // ovako se stitis ako je kojim slucajem promasen tip
if( NULL != i ) cout << i->i << endl;
if( NULL != s ) cout << s->s << endl;
}
Ovde fale i pametni pointeri da ne bi imao likove kao memori.
Predlog 2.
Vidi boost::variant.
http://www.boost.org/doc/libs/1_35_0/doc/html/boost/variant.html
http://electra.lbl.gov/stuff/variant/doc/tutorial.html
Google: boost variant example
[ inostranac @ 30.03.2008. 23:06 ] @
Hvala na savetima.
Predlog je dobar, ali nazalost kasno je stigao...
Vec sam sve uradio preko voida i radi "ko zmaj". Cinjenica je da sam morao sam da se osiguravam protiv promasenih tipova i da sam se malo izbedacio jer je ocigledno moglo elegantnije, ali sta je tu je... Zivot bi bio previse dosadan bez rupa u znanju OOP-a... :0
Pozdrav!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.