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

Je li moguće znati tip podatka na osnovu memorijske adrese?

[es] :: C++ programiranje :: Je li moguće znati tip podatka na osnovu memorijske adrese?

Strane: 1 2

[ Pregleda: 1501 | Odgovora: 31 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 12:32

konkretno, imam niz integera koji su ustvari memorijske adrese dinamički alociranih objekata i/ili nizova. Eh, sad, znam da svakoj toj adresi mogu pristupiti konvertujući je u void*, ali ako baš hoću da znam o kojem se tipu podatka radi na datoj adresi...? Postoji li način?
13.05.2008. u 12:32 

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 2819
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org
Sajt: www.antivari.com


Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 12:45
Pogledaj dynamic_cast a takodje i static_cast, reinterpret_cast, i sl...

Pretrazi (search) i ovde po forumu, ima dosta primera...

FREEWARE
Di rečnik, v1.0.058 (srp-eng/eng-srp priručni rečnik)
http://www.antivari.com
13.05.2008. u 12:45 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:00
Ma jasni su meni castovi svi odreda, možda se nisam dobro izrazio...

Znači, jasno je meni da će dynamic_cast da vrati null ako nije pogodio kojmpatibilan tip, ali ja u kodu imam previše tipova podataka da bih išao pokušaj-pogreška... Sve što imam je niz void pointera i sticajem okolnosti ne mogu da znam ni otprilike kojeg su tipa bili. znači ne znam je li char* ili je cSNMPInterface*. Imam samo adresu. znači, da li je moguće da saznam da li je na toj adresi char* ili cSNMPInterface* bez da radim:

Code:

char* p = dynamic_cast<char*>pMojVoidPointerIzNiza;
cSNMPInterface* p1 = dynamic_cast<cSNMPInterface*>pMojVoidPointerIzNiza;

if(p) onda ti je char*
if(p1) onda ti je cSNMPInterface*


Znači, napominjem, ova dva tipa sam naveo samo ilustracije radi, u stvarnosti ih imam na hiljade mogućih...
13.05.2008. u 13:00 

deerbeer
nikola džuverović
xemicomputers

Član broj: 174418
Poruke: 358
*.ptt.yu.

Sajt: www.xemico.net


Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:32
Citat:

znači, da li je moguće da saznam da li je na toj adresi char* ili cSNMPInterface* bez da radim:
Code:

char* p = dynamic_cast<char*>pMojVoidPointerIzNiza;
cSNMPInterface* p1 = dynamic_cast<cSNMPInterface*>pMojVoidPointerIzNiza;

if(p) onda ti je char*
if(p1) onda ti je cSNMPInterface*




A kako bi ti to voleo da to uradis ? Daj mi samo primer pa makar i najbanalniji ...
U toku runtime-a moras znati tip objekta koji cast-ujes tj. njegov "runtime-size" da bi mogao da konvertujes void* pointer u njegov class pointer ..
To sto imas hiljadu void* pointera u tvom nizu je problem tvog programa tj. implementacije jer ces morati da postavljas hiljadu if uslova .

Jedini izuzetak je kod nizova sa polimorfnim tipovima :
npr
Code:

 class CBase ; 
 class CcSNMPInterface : public CBase ; 
 class CNekaKlasa : public CBase ;  

 CBase*  nizBaznihObjekata [10] ; 


Al ces u tom slucaju moci da koristis samo funkcije i promenljive CBase klase
i takodje override-ovane funkcije iz nasledjenih klasa....


[Ovu poruku je menjao deerbeer dana 14.05.2008. u 09:56 GMT+1]
13.05.2008. u 13:32 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:53
hm, pa nije to toliko pitanje toga kako bih ja to volio uraditi, nego kako mogu. nemam ja 1000 pointera u nizu, nego imam 1000 class tipova, a jednako je moguće da je bilo koji void* iz pomenutog niza ustvari bilo koji od tih 100 class tipova.

Da pobliže objasnim, niz koji sadrži void* se puni u overloadanom new operatoru:

Code:

void* operator new(size_t _Count)
{
    void* pRet = CMemObserver::GetInstance()->Allocate( _Count);
    return pRet;
}


void* CMemObserver::Allocate( size_t Bytes) 
{
    void* pPtr = malloc( Bytes);
        ...

    m_aiAllocated[sm_iAllocationIndex] = (int)pPtr;
        ...

    return pPtr;
}


Dakle, mogao bih još negdje i da spasim veličinu alokacije, ako bi bilo od pomoći, ali ne i tip pointera (bar ja ne znam kako, a volio bih da mi neko kaže ako zna). Kasnije kada budem vadio pointere iz m_aiAllocated, neću znati kojeg su tipa. Sve što pitam je, zna li neko, da li postoji nešto, neki operator ili tako nešto koji kaže:

Code:
kojeg_si_tipa_bio_kad_si_prvobitno_alociran( (void*)m_aiAllocated[neki_broj] )


samo to pitam.
13.05.2008. u 13:53 

deerbeer
nikola džuverović
xemicomputers

Član broj: 174418
Poruke: 358
*.ptt.yu.

Sajt: www.xemico.net


Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:13
Citat:
@JustinTime
m_aiAllocated[sm_iAllocationIndex] = (int)pPtr;

Ne mozes ...
Ako si ovde cast-ovao tvoj void* u int isto to moras i uraditi kad hoces da proveris tip na datom elementu niza (box-ing i unbox-ing pointera).

Citat:

Sve što pitam je, zna li neko, da li postoji nešto, neki operator ili tako nešto koji kaže:
Code:

kojeg_si_tipa_bio_kad_si_prvobitno_alociran( (void*)m_aiAllocated[neki_broj] ) ; 


Odgovor ti je dao XFiles na pocetku ..
13.05.2008. u 14:13 

bubasvaba79
visnja anic
beograd

Član broj: 179288
Poruke: 2
80.93.243.*



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:35
slazem se sa deerbeer-om!
13.05.2008. u 14:35 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:41
Citat:
Ne mozes ...
Ako si ovde cast-ovao tvoj void* u int isto to moras i uraditi kad hoces da proveris tip na datom elementu niza (box-ing i unbox-ing pointera).


ne razumijem, šta ne mogu? Ovdje ti kažem šta radim. Da, castam void* u int, a šta tačno misliš da treba da uradim kad hoću da provjerim tip?

Citat:
Odgovor ti je dao XFiles na pocetku ..


Da sam pitao kako da castam void* u određen tip, to bi bio pravi odgovor! Međutim, ja pitam kako da znam koji je to određen tip, a da ne bude metodom pokušaja i pogrešaka.
13.05.2008. u 14:41 

bubasvaba79
visnja anic
beograd

Član broj: 179288
Poruke: 2
80.93.243.*



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:49
...onda najbolje da odustanes...
13.05.2008. u 14:49 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:50
...ok, hajd recimo da je nemoguće (ako ne računamo dynamic_cast)... je li moguće znati o kom se tipu radi unutar overloadanog new operatora?

dakle

Code:

cKlasa *pKlasa = new cKlasa()


...pozvaće se operator new iz gornjeg primjera, je li moguće u njemu već znati konkretan tip, a ne samo veličinu?
13.05.2008. u 14:50 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:52
Citat:
...onda najbolje da odustanes...

da, probaću i to, tebi hvala za doprinos...

[Ovu poruku je menjao JustinTime dana 13.05.2008. u 16:13 GMT+1]
13.05.2008. u 14:52 

Xarios

Član broj: 127199
Poruke: 102
*.tel.net.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 09:45
Citat:

...ok, hajd recimo da je nemoguće (ako ne računamo dynamic_cast)... je li moguće znati o kom se tipu radi unutar overloadanog new operatora?

dakle

Code:

cKlasa *pKlasa = new cKlasa()


...pozvaće se operator new iz gornjeg primjera, je li moguće u njemu već znati konkretan tip, a ne samo veličinu?


iz ovog gore KODA, konkretan tip je: korisnicki definiran tip, a to je 'cKlasa' ! On vraća pokazivač koji pokazuje na memorijsku adresu alociranu na gomili.
Pa zato imamo tipove podataka: standardne koji su uključeni u C++ (to vjerujem i ti znaš) i korisnički definirane tipove.

Ako želiš da ti program bude toliko pametan da alocira odredjenu memoriju na gomili koja je odredjenog tipa (podatka) u vrijeme izvršavanja (Run Time) u zavisnosti od nekog uvijeta (npr. hoce da mozda alocira int, long, ili korisDefTip() na gomili ovisno o trenutnom uvijetu koji je zadao klijentski program ili korisnik) onda koristiš: pokazivače na funkcije ili nizove pokazivača na funkcije.

A evo jedne informacije koja nije pouzdana jer se baš dobro ne sjećam ali mozda budeš provjerio negdje: ako nije definiran određen tip, onda je int (mislim prvenstveno kad se alocira memorija na gomili (heap)).

Vjerujem da ti nisam baš pomogao ali eto bar pokušao :)
20.05.2008. u 09:45 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 351
*.uvcms.com.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 14:32
To sto ti hoces nije moguce uraditi u C++. Ne postoji nikakav standardan nacin za odredjivanje tipa podatka za koji se poseduje memorijska adresa i tacka.

Svi koji su spomenuli dynamic_cast nisu u pravu jer dynamic_cast ne podrzava kastovanje void*. Za te potrebe se koristi reinterpret_cast ali programer MORA da zna koji je tip podatka u pitanju jer je reinterpet_cast ekvivalentan C kastu tj. sve je u rukama programera i kompajler se tu ne mesa.

Evo i jednog malog primera koji demonstrira kako se lako gubi tip podatka:

Code:
#include <iostream>
#include <memory>
#include <typeinfo>

struct type1{
    type1() {}
    ~type1() {}
};

void typetest() {
    std::auto_ptr<type1> p(new type1);
    type1 *pptr = p.get();    
    void *unknown = static_cast<void*>(pptr);

    std::cout << "Tip pointera pptr je: "  << typeid(pptr).name() << std::endl;
    std::cout << "Tip pointera unknown je: " << typeid(unknown).name() << std::endl;

}


edit: sitne greske

[Ovu poruku je menjao kiklop74 dana 20.05.2008. u 20:44 GMT+1]

[Ovu poruku je menjao kiklop74 dana 20.05.2008. u 20:45 GMT+1]
Tko leti vrijedi
20.05.2008. u 14:32 

JustinTime

Član broj: 113999
Poruke: 13
*.bstelecom.ba.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 14:47
Znači, Darko, ovo je TAČNO ono o čemu govorim. Hvala na odgovoru!

Pozz
20.05.2008. u 14:47 

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 145
*.static.ikomline.net.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 16:19
A sto ne napravis jos jedan array, koji u stvari sadrzi informacije sta se na nekom mestu nalazi u array-u sa pointerima. Pretpostavljam da u array sa pointerima kada ubacujes pointer kazes znas i sta je to na sta taj pointer pokazuje. Drugi nacin koji je sredjeniji je da napravis strukturu koja sadrzi pointer i neku int promenljivu koja ce ti pomoci da znas koji je objekat u pitanju. Npr 0 je Klasa1, 1 je Klasa2 itd... Posle napravis array sa tim strukturama i to je to.
20.05.2008. u 16:19 

deerbeer
nikola džuverović
xemicomputers

Član broj: 174418
Poruke: 358
*.adsl-1.sezampro.yu.

Sajt: www.xemico.net


Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 17:54
Citat:
@kiklop
.....ali programer MORA da znam koji je tip podatka u pitanju jer je reinterpet_cast ekvivalentan C kastu tj. sve je u rukama programera

E upravo je to ono sto JustinTime-u nisam uspeo da objasnim ....
Programer MORA da zna koji je tip podataka u pitanju a koji ce cast koristiti zavisi od implementacije
Sve u svemu mnogo price i polemike oko elementarnih stvari ...
20.05.2008. u 17:54 

gosha
Goran Bundalo
Zemun

Član broj: 2384
Poruke: 340
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 19:19
RTTI

Poz. Gosha
JokeJunky :)

Mrzim sublimirane marketinske poruke.
20.05.2008. u 19:19 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 351
*.uvcms.com.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 19:45
Citat:
gosha: RTTI

Poz. Gosha


Upravo smo apsolvirali da u navedenom slucaju RTTI ne pomaze.
Tko leti vrijedi
20.05.2008. u 19:45 

gosha
Goran Bundalo
Zemun

Član broj: 2384
Poruke: 340
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 23:42
Ma da se nesto skarabudziti :)

Code:

#include <iostream>
#include <memory>
#include <typeinfo>

struct type1 {
    type1() {}
    virtual ~type1() {}
    virtual void neka_vir_f() {}
};

struct type2 {
    type2() {}
    virtual ~type2() {}
    virtual void neka_vir_f() {}

};

int main() {
    std::auto_ptr<type2> p(new type2);
    type2 *pptr = p.get();
    void *unknown = static_cast<void*>(pptr);

    std::cout << "Tip pointera pptr je: "  << typeid(*pptr).name() << std::endl;
    std::cout << "Tip pointera unknown je: " << typeid(*(static_cast<type1*>(unknown))).name() << std::endl;

    std::system("pause");

    return 0;
}

JokeJunky :)

Mrzim sublimirane marketinske poruke.
20.05.2008. u 23:42 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 351
200.49.157.*



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?22.05.2008. u 14:33
Interesantno ali ovo radi samo za klase koja imaju virtualne destruktore (vtable). Originalno pitanje je bilo:

Citat:
znači, da li je moguće da saznam da li je na toj adresi char* ili cSNMPInterface* bez da radim:


Code:

struct type1{
    type1() {}
    virtual ~type1() {}

};

struct type2{
    type2() {}
    virtual ~type2() {}
};

struct type3{
    type3() {}
    ~type3() {}
};

bool isObjectPtr(void *ptr) {
    bool result = (NULL != ptr);
    if (result) {
        try {
            const std::type_info& t = (typeid(*static_cast<type1*>(ptr)));
            std::clog << "Tip objekta na koji pokazuje pointer je: " << t.name() << std::endl;
        } catch (std::__non_rtti_object& nr) {
            std::cerr << "Pointer ne pokazuje na Objekat: " << nr.what() << std::endl;
            result = false;
        }        
    }
    return result;
}

void testptr(void *ptr) {
    if (isObjectPtr(ptr)) {
        std::cout << "Pointer pokazuje na Objekat" << std::endl;
    }
}

void typetest() {
    std::auto_ptr<type2> p(new type2);
    std::auto_ptr<type3> p2(new type3);
    char *test = new char[10];
    void *unknown = static_cast<void*>(p.get());
    void *unknown2 = static_cast<void*>(p2.get());
    void *chunk = static_cast<void*>(test);
    (unknown), (chunk);
    testptr(unknown);
    testptr(unknown2);
    testptr(chunk);
    delete [] test;

}

int _tmain(int argc, _TCHAR* argv[]) {
    (argc), (argv);

    typetest();
    return EXIT_SUCCESS;
}


Ovaj kod vraca sledece ( Visual studio 2008 ) :
Citat:

Tip objekta na koji pokazuje pointer je: struct type2
Pointer pokazuje na Objekat
Pointer ne pokazuje na Objekat: Access violation - no RTTI data!
Pointer ne pokazuje na Objekat: Access violation - no RTTI data!


Sto znaci da je upotrebljivost ovog trika veoma ogranicena jer ne detektuje klase koje nemaju vtable i ne detektuje eksplicitno tip native pointera.
Ako u jednacinu udje i int* osim char* korisnik je ponovo na pocetku. I dalje vazi zaklljucak da garantovanog nacina za 100%detektovanje tipa iz pointera nema ako se radi o opstem slucaju gde pointer moze da pokazuje na bilo sta.



Tko leti vrijedi
22.05.2008. u 14:33 

[es] :: C++ programiranje :: Je li moguće znati tip podatka na osnovu memorijske adrese?

Strane: 1 2

[ Pregleda: 1501 | Odgovora: 31 ]

Postavi temu Odgovori

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