Toon posts:

[c++] long -> pointer -> long

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zou een long willen converteren naar een pointer... Heeft iemand een idee?

Ik weet dat je met '&' en '*' kunt werken voor het geheugenadres & de waarde van een pointer te krijgen... Maar kan je bvb zeggen:

C++:
1
2
3
4
5
long c = 0x1234
MyClass * mc = new MyClass();

c = mc;
mc = c;



Of moet je dan met een static_cast / (MyClass*) / (long) werken ofzo?


Thx als iemand me daar informatie over wilt verschaffen ;)


PS: als sidenote... Mag ik ervan uitgaan dat op elke architectuur een pointer = long?

  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 27-05 12:44

LazySod

Scumbag with a mission

Verwijderd schreef op 15 maart 2004 @ 16:57:
Ik zou een long willen converteren naar een pointer... Heeft iemand een idee?

Ik weet dat je met '&' en '*' kunt werken voor het geheugenadres & de waarde van een pointer te krijgen... Maar kan je bvb zeggen:

C++:
1
2
3
4
5
long c = 0x1234
MyClass * mc = new MyClass();

c = mc;
mc = c;



Of moet je dan met een static_cast / (MyClass*) / (long) werken ofzo?


Thx als iemand me daar informatie over wilt verschaffen ;)


PS: als sidenote... Mag ik ervan uitgaan dat op elke architectuur een pointer = long?
Als antwoord op je sidenote .. Nee .. Daar mag je niet van uitgaan. Niets staat een systeem ontwikkelaar (in de zin van OS-bouwer) in de weg een 64 bit addressering te gebruiken en 32 bit long integers.


Eerste vraag is: waarom wil je deze enge cast uitvoeren?

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


Verwijderd

Topicstarter
Tja, het probleem is dat ik weet dat ik "&c"-waarde zou willen veranderen... Maar weet of dit mag :S

Waar het eigenlijk over gaat... Ik werk met wxWidgets... En daar kan je als 'ItemData' in een wxListView enkel een LONG steken... Nu wil ik daar eigenlijk een class achter steken, dus zou ik in die setitemdata de waarde van die pointer willen steken (over geheugenissues maak ik me later wel zorgen:p) ...

Maar nu zit ik met het probleem... Hoe moet ik een long naar een pointer converteren en terug?


Ik hoop dat dit mijn standpunt iets verduidelijkt.


-- sidenote --
kan je ergens instellen zoals length_pointer = sizeof(&c); ofzo hoe lang die is? Klinkt logisch nu ik dit aan het typen ben.

  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 27-05 12:44

LazySod

Scumbag with a mission

wxWidgets zegt mij even niets - ik ben maar een ignorante zelden op windows machines te vinden software boer - maar ik neem aan dat het ItemData veld in de genoemde struct ruimte bied voor extra data ofzo.

Ervan uitgaande dat dit op een Win32 omgeving ofzo is dan zal sizeof(LONG) wel gelijk zijn aan sizeof( ptr_to_something) en zou het geprobeerde wel goed moeten gaan - maar ik zou er persoonlijk liever niet vanuit gaan.

Kun je het LONG veld niet gebruiken als index in een zelf beheerde tabel waar je de echte elementen in steekt? Met een 32 bit long kun je aardig wat indexeren en versleutelen zonder ook maar 1 portabiliteit regel te breken.

En dat instellen van pointer size.. Als je het vind .. Laat het me dan weten .. Nog nooit van gehoord echter. Lijkt me ook aardig kinky.

[ Voor 10% gewijzigd door LazySod op 15-03-2004 17:31 . Reden: stukkie gemist ]

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


Verwijderd

Topicstarter
LazySod schreef op 15 maart 2004 @ 17:30:
wxWidgets zegt mij even niets - ik ben maar een ignorante zelden op windows machines te vinden software boer - maar ik neem aan dat het ItemData veld in de genoemde struct ruimte bied voor extra data ofzo.

Ervan uitgaande dat dit op een Win32 omgeving ofzo is dan zal sizeof(LONG) wel gelijk zijn aan sizeof( ptr_to_something) en zou het geprobeerde wel goed moeten gaan - maar ik zou er persoonlijk liever niet vanuit gaan.

Kun je het LONG veld niet gebruiken als index in een zelf beheerde tabel waar je de echte elementen in steekt? Met een 32 bit long kun je aardig wat indexeren en versleutelen zonder ook maar 1 portabiliteit regel te breken.

En dat instellen van pointer size.. Als je het vind .. Laat het me dan weten .. Nog nooit van gehoord echter. Lijkt me ook aardig kinky.
- wxWidgets is windows/linux/mac (voornamelijk deze 3). [Zie andere topic die hierover gestart is ;)]
- SetItemData kan alleen een long storen...
- Ik kan dat doen, maar dan dien ik mijn classstructuur overhoop te zwieren (oftwel gebruik te maken van een "friend" clausule, wat ik nog minder graag doe). Natuurlijk zou een friend het simpelste zijn, maar ik vind dit zeer vies te doen (daar je OO toch voornamelijk gebruikt voor encapsulatie). Nu ik hier aan 't denken ben kan ik natuurlijk ook wel een soort van MyClass * GetMyClass( long index ) zetten in de eerste class die het beheer doet hiervan... Zeker het proberen waard!

Maar mijn begin doelstelling blijft ;-)
Hoe kan ik nu bvb van
C++:
1
2
long c;
MyClass * mc = new MyClass();

Hoe kan ik die pointer die in mc zit opgeslagen, hoe krijg ik die in "c" ?
Is dit simpelweg:
C++:
1
c = (long)mc; // alternatief: c = static_cast<long>(mc);

en andersom:
C++:
1
mc = (MyClass*)mc; // alternatief: mc = static_cast<MyClass*>(c);


Is dit logisch correct? ;-)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ben ik nou gek, of is je probleem zo simpel als
C++:
1
2
3
4
5
class MyClass {
  static std::vector< MyClass > myItems;
public:
  long New() { myItems.push_back( MyClass ); return myItems.size()-1; }
  MyClass& get( long off ) { return myItems[off]; }

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 27-05 12:44

LazySod

Scumbag with a mission

Maar mijn begin doelstelling blijft ;-)
Hoe kan ik nu bvb van
C++:
1
2
long c;
MyClass * mc = new MyClass();

Hoe kan ik die pointer die in mc zit opgeslagen, hoe krijg ik die in "c" ?
Is dit simpelweg:
C++:
1
c = (long)mc; // alternatief: c = static_cast<long>(mc);

en andersom:
C++:
1
mc = (MyClass*)c; // alternatief: mc = static_cast<MyClass*>(c);


Is dit logisch correct? ;-)
C-technisch is het correct, maar mijn stelling blijft -- laat het! Heen-en-weer casten van pointers naar integers is en blijft een linke zaak. Een zichzelf respecterende compiler zal op zijn minst een warning genereren op bovenstaande code en een zichzelf nog beter respecterende compiler zou crashen en je nooit meer laten coderen ;)

Met het oogpunt op OO codering lijkt het -mij- allerminst verstandig om je daar mee in te laten. Is gewoon vragen om problemen.

Oplossing is eenvoudig zat.. Kijk maar naar de reply van MSalters, die de practische uitwerking van wat ik al voorgesteld had leverde.

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 maart 2004 @ 17:38:
Hoe kan ik nu bvb van
C++:
1
2
long c;
MyClass * mc = new MyClass();

Hoe kan ik die pointer die in mc zit opgeslagen, hoe krijg ik die in "c" ?
Is dit simpelweg:
C++:
1
c = (long)mc; // alternatief: c = static_cast<long>(mc);

en andersom:
C++:
1
mc = (MyClass*)mc; // alternatief: mc = static_cast<MyClass*>(c);


Is dit logisch correct? ;-)
Heb je het überhaupt al eens geprobeerd :? Ik vind het wel een beetje manual werk hoor. Ja, je kunt pointers casten naar integral types en andersom (hoewel je niet de garantie hebt dat het past), en nee de C++ cast variant daarvan is niet static_cast maar reinterpret_cast

[ Voor 4% gewijzigd door .oisyn op 15-03-2004 19:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
MSalters schreef op 15 maart 2004 @ 18:09:
Ben ik nou gek, of is je probleem zo simpel als
C++:
1
2
3
4
5
class MyClass {
  static std::vector< MyClass > myItems;
public:
  long New() { myItems.push_back( MyClass ); return myItems.size()-1; }
  MyClass& get( long off ) { return myItems[off]; }
Ja, nu ik dat lees is het inderdaad zo simpel :S

Thx ;)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Ik neem aan dat bij die push_back nog iets ontbreekt om een nieuw MyClass object aan te maken ?

[ Voor 15% gewijzigd door farlane op 16-03-2004 09:30 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Haakjes, maar het was een Frans toetsenbord en dit was al een kwartier typen :(

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
MSalters schreef op 16 maart 2004 @ 10:30:
Haakjes, maar het was een Frans toetsenbord en dit was al een kwartier typen :(
:) Haha, ok. Je toetsenbord wilde er zeker een accent circonflexe van maken ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1