[C/C++] memory probleem

Pagina: 1
Acties:

  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Ik ben bezig een 3rd party c voorbeeld programma om te gooien naar c++ voor eigen doeleinden.
Kom ik dit tegen:
code:
1
2
3
4
5
6
typedef struct tagRefCompletionProc
{
    ULONG* pulCount;
    NKERROR nResult;
    LPVOID pRef;
} RefCompletionProc, *LPRefCompletionProc;

Is dit gelijk aan:
code:
1
2
3
4
5
6
7
8
struct tagRefCompletionProc
{
    ULONG* pulCount;
    NKERROR nResult;
    LPVOID pRef;
}
typedef struct tagRefCompletionProc RefCompletionProc;
RefCompletionProc *LPRefCompletionProc;

of aan:
code:
1
2
3
4
5
6
7
8
struct tagRefCompletionProc
{
    ULONG* pulCount;
    NKERROR nResult;
    LPVOID pRef;
}
typedef struct tagRefCompletionProc RefCompletionProc;
typedef RefCompletionProc* LPRefCompletionProc;

Ik denk de 2e, maar loop vervolgens vast bij de geheugen declaratie:
code:
1
2
LPRefCompletionProc     pRefCompletion;
pRefCompletion = new tagRefCompletionProc;

wie kan mij verlichten?
alvast bedankt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
FireAge schreef op woensdag 06 juli 2005 @ 10:20:
Ik ben bezig een 3rd party c voorbeeld programma om te gooien naar c++ voor eigen doeleinden.
Kom ik dit tegen:
code:
1
2
3
4
5
6
typedef struct tagRefCompletionProc
{
    ULONG* pulCount;
    NKERROR nResult;
    LPVOID pRef;
} RefCompletionProc, *LPRefCompletionProc;
In C++ zou je dat waarschijnlijk schrijven als

C++:
1
2
3
4
5
6
struct RefCompletionProc
{
    ULONG* pulCount;
    NKERROR nResult;
    LPVOID pRef;
};

Geen tag..., geen LP..., geen typedef.

Verder is de LPVOID in C++ waarschijnlijk een Baseclass pointer, en geen void*.

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


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Waar gaat die tag over dan?
En hoe maak ik die *LPRefCompletionProc dan aan?

[ Voor 52% gewijzigd door FireAge op 06-07-2005 10:45 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Die tag is nodig in C omdat 'struct' daar geen typename introduceerd.

Je maakt ook geen *LPRefCompletionProc of LPRefCompletionProc of zo aan. Eerlijk gezegd, als je niet snapt wat dat is, dan snap je C noch C++. Porten van C naar C++ is dan optimistisch. Ik zou ook een slechte vertaler Koreaans naar Italiaans zijn.

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:23
in C : De struct heet tagRef....., Het type die geintroduceert wordt heet Ref.... en een pointer naar dat type LPRef.....

Als je een variabele van die struct wilt gebruiken zeg je dus:

C:
1
2
3
4
5
RefCompletionProc Blaat1;

of 

struct tagRefCompletionProc Blaat1;

[ Voor 41% gewijzigd door farlane op 06-07-2005 11:34 ]

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.


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Ik moet toegeven dat mijn c++ een beetje roestig is.
Een collega van mij zei me dat er meteen een variabele aangemaakt werd, maar das dus inderdaad onzin.
Ik snap nu wel wat de bedoeling is, bedankt.

[ Voor 33% gewijzigd door FireAge op 06-07-2005 11:43 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
FireAge schreef op woensdag 06 juli 2005 @ 11:42:
Ik moet toegeven dat mijn c++ een beetje roestig is.
Een collega van mij zei me dat er meteen een variabele aangemaakt werd, maar das dus inderdaad onzin.
Ik snap nu wel wat de bedoeling is, bedankt.
Als je dit doet:
C:
1
2
3
4
struct Blaat
{
    .....
} MyBlaat;


Is dat ook het geval :)

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
farlane schreef op woensdag 06 juli 2005 @ 11:33:
in C : De struct heet tagRef....., Het type die geintroduceert wordt heet Ref.... en een pointer naar dat type LPRef.....
Iets subtieler, typedefs zijn geen types. Er wordt dus geen type Ref... geintroduceerd, of een type LPRef..., maar alleen extra synonimen voor struct tagRef... cq struct tagRef*. Dat is van belang bij forward declarations (die moeten naar naar de struct tag naam verwijzen) en het matchen van declarations ( void f( Ref ) is een herdeclaratie van void f( struct tagRef ) ).

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:23
MSalters schreef op woensdag 06 juli 2005 @ 17:08:
Iets subtieler, typedefs zijn geen types.
Owh, nooit geweten. Moet ik het zien als een 'compile time intelligent macro' dan?

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
Als jij dat wilt :) In elk geval is er in C++ moeite gedaan om dat effect te bereiken (zo mag je een typedef name gebruiken in een pseudo-dtor)

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


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Maar hoe werkt het dan bij het declareren van geheugen:

code:
1
2
3
4
5
6
7
8
typedef struct tagBlaat
{
 int aap
} MyBlaat, *pMyBlaat

pMyBlaat mystructpointer = new MyBlaat;
of
pMyBlaat mystructpointer = new tagBlaat;

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
FireAge schreef op donderdag 07 juli 2005 @ 10:38:
Maar hoe werkt het dan bij het declareren van geheugen:

code:
1
2
3
4
5
6
7
8
typedef struct tagBlaat
{
 int aap
} MyBlaat, *pMyBlaat

pMyBlaat mystructpointer = new MyBlaat;
of
pMyBlaat mystructpointer = new tagBlaat;
C of C++? :)

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.


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
c++ geen gemalloc.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

"Declareren van geheugen"? Beetje een rare term. Je kunt een struct of functie/variabele declareren, dan geef je dus aan dat hij bestaat, maar niet hoe (in het geval van de struct) of waar (in het geval van de functie of variabele) hij bestaat.

Het punt is dat de typedef struct (of class) in C++ nogal onzinnig is, omdat er automatisch al een typename gedefinieerd wordt. In dit geval heb je al een tagBlaat, en een alias voor tagBlaat met de naam MyBlaat, en tevens een alias voor tagBlaat * met de naam pMyBlaat. De regels 6 en 8 in je voorbeeldcode zijn dus identiek.

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.


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Hoe zou je het voorgaande stuk dan op schrijven zonder typedef?

zo?
code:
1
2
3
4
5
6
typedef struct MyBlaat
{
int aap
}*pMyBlaat;

pMyBlaat myblaatpointer = new MyBlaat;

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
bedoel je daarmee dat het not done is om malloc te gebruiken in c++?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

FireAge schreef op donderdag 07 juli 2005 @ 11:37:
Hoe zou je het voorgaande stuk dan op schrijven zonder typedef?
Ik zou die hele typedef achterwege laten en gewoon MyBlaat* gebruiken, maar wat jij zegt kan idd ook, behalve dan dat je de ; vergeten bent achter int aap ;)
st0p schreef op donderdag 07 juli 2005 @ 11:55:
bedoel je daarmee dat het not done is om malloc te gebruiken in c++?
Waar zou je malloc nog voor willen gebruiken, behalve misschien voor compatibility met oude C libs?

[ Voor 9% gewijzigd door .oisyn op 07-07-2005 11:59 ]

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.


  • FireAge
  • Registratie: Augustus 2002
  • Laatst online: 09:23
Ehm nee.
Ik wil gewoon alleen new en delete en geen malloc en free in mijn code hebben.
Anders wordt het zo'n zootje.

Ik geloof trouwens dat ik deze quote ergens heb gelezen:

To new is C++; To malloc is C; To mix them is sin

En ik ga inderdaad maar gewoon voor MyBlaat*, is tenminste leesbaar.

[ Voor 16% gewijzigd door FireAge op 07-07-2005 12:00 ]


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
ah juist, ik haalde ff malloc en new door de war... 8)7
Pagina: 1