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

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

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

Strane: 1 2

[ Pregleda: 6878 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

JustinTime

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



Profil

icon Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 12:32 - pre 194 meseci
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?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

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

Jabber: xfiles@elitesecurity.org


+638 Profil

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

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

JustinTime

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:00 - pre 194 meseci
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...
 
Odgovor na temu

deerbeer
Beograd

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



+395 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:32 - pre 194 meseci
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]
Viva lollapalooza
 
Odgovor na temu

JustinTime

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 13:53 - pre 194 meseci
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.
 
Odgovor na temu

deerbeer
Beograd

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



+395 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:13 - pre 194 meseci
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 ..
Viva lollapalooza
 
Odgovor na temu

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 - pre 194 meseci
slazem se sa deerbeer-om!
 
Odgovor na temu

JustinTime

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:41 - pre 194 meseci
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.
 
Odgovor na temu

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 - pre 194 meseci
...onda najbolje da odustanes...
 
Odgovor na temu

JustinTime

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:50 - pre 194 meseci
...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?
 
Odgovor na temu

JustinTime

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?13.05.2008. u 14:52 - pre 194 meseci
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]
 
Odgovor na temu

Xarios

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



+1 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 09:45 - pre 193 meseci
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 :)
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

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

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


+13 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 14:32 - pre 193 meseci
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
 
Odgovor na temu

JustinTime

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



Profil

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

Pozz
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

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



Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 16:19 - pre 193 meseci
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.
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

deerbeer
Beograd

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



+395 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 17:54 - pre 193 meseci
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 ...
Viva lollapalooza
 
Odgovor na temu

gosha
Zemun

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



+40 Profil

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

Poz. Gosha
JokeJunky :)

Mrzim sublimirane marketinske poruke.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

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

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


+13 Profil

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

Poz. Gosha


Upravo smo apsolvirali da u navedenom slucaju RTTI ne pomaze.
Tko leti vrijedi
 
Odgovor na temu

gosha
Zemun

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



+40 Profil

icon Re: Je li moguće znati tip podatka na osnovu memorijske adrese?20.05.2008. u 23:42 - pre 193 meseci
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.
 
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: Je li moguće znati tip podatka na osnovu memorijske adrese?22.05.2008. u 14:33 - pre 193 meseci
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
 
Odgovor na temu

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

Strane: 1 2

[ Pregleda: 6878 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

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