/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
funktions kald med retur parameter
Fra : J. Dahl


Dato : 12-02-04 17:02

Som en del af et windows MFC program fortages følgende funktions kald:

BOOL TeleSNMP::Recv()
{
....[A]
TCHAR* pBuf=NULL;
GetValue(&value /*IN*/, 0 /*NOT USED*/, pBuf /*OUT*/);
....[B]
}

BOOL TeleSNMP::GetValue(smiLPVALUE pValue, smiUINT32 Type, TCHAR* buf)
{
....
buf = new TCHAR[_tcsclen(tc)+1];
if(buf)
memcpy(buf, tc, _tcsclen(tc)+1);
return true;
}

I "Recv()" efter GetValue(..) kaldet [B] er pBuf stadig NULL. Lidt
debug viser buf bliver succesfuldt allokeret og "fyldt op". Har jeg
misforstået noget pointer aritmetik, calling convention eller noget
helt trejde.

mvh
Jacob

 
 
Mogens Hansen (12-02-2004)
Kommentar
Fra : Mogens Hansen


Dato : 12-02-04 18:09


"J. Dahl" <jad@tele.gl> wrote in message
news:c4595276.0402120801.a36630f@posting.google.com...
> Som en del af et windows MFC program fortages følgende funktions kald:
>
> BOOL TeleSNMP::Recv()
> {
> ...[A]
> TCHAR* pBuf=NULL;
> GetValue(&value /*IN*/, 0 /*NOT USED*/, pBuf /*OUT*/);

Er der nogen grund til at retur værdien fra GetValue ikke bliver brugt til
noget (Bortset fra at den i eksemplet er ubrugelig, da den altid er true) ?

> ...[B]
> }
>
> BOOL TeleSNMP::GetValue(smiLPVALUE pValue, smiUINT32 Type, TCHAR* buf)
> {
> ...
> buf = new TCHAR[_tcsclen(tc)+1];
> if(buf)

Hvilken compiler (incl. verison) anvender du ?
Under hvilke omstændigheder kan buf blive 0 ?

> memcpy(buf, tc, _tcsclen(tc)+1);
> return true;

Hvorfor returnerer du ikke "TRUE" som hører sammen med "BOOL", istedet for
nøgleordet "true" som hører sammen med den indbyggede type "bool" ?
Det virker som sammenblanding af typer, som gør koder mere uforståelig
selvom den er korrekt.

Er det meningen at retur værdien skulle angive om funktionen gik godt eller
skidt ?

> }
>
> I "Recv()" efter GetValue(..) kaldet [B] er pBuf stadig NULL. Lidt
> debug viser buf bliver succesfuldt allokeret og "fyldt op". Har jeg
> misforstået noget pointer aritmetik, calling convention eller noget
> helt trejde.

Ja, du har misforstået hvordan parametre overføres.
Der anvendes i eksemplet call by value.

Du har en variable "pBuf" i funktionen Recv, der har værdien NULL.
Når GetValue kaldes bliver der lavet en ny variabel "buf" har får samme
værdi som "pBuf" altså NULL. Derudover er der ikke nogen sammenhæng mellem
"pBuf" og "buf", og tildelingen til "buf" bliver derfor ikke ført tilbage
til "pBuf".

Du skal enten bruge call by reference eller bruger en pointer til en
pointer.

BOOL TeleSNMP::Recv()
{
TCHAR* pBuf=NULL;
GetValue(... , &pBuf );
}

BOOL TeleSNMP::GetValue(..., TCHAR** buf)
{
*buf = new TCHAR[...];
}

Venlig hilsen

Mogens Hansen


PS.
Hvor er typisk MFC kode dog ofte bøvlet og ikke særligt pænt i forhold til
hvad man kunne gøre med anvendelse af C++ Standard Library.
Det ville blive simplere hvis man brugte std::string klassen (eventuelt
std::basic_string<TCHAR>)

typedef std::basic_string<TCHAR> tstring;

BOOL TeleSNMP::Recv()
{
tstring buf = GetValue(); // throws exception if fails
}

BOOL TeleSNMP::GetValue()
{
return tstring(tc);
}



Bertel Brander (12-02-2004)
Kommentar
Fra : Bertel Brander


Dato : 12-02-04 20:46

Mogens Hansen wrote:

>
> PS.
> Hvor er typisk MFC kode dog ofte bøvlet og ikke særligt pænt i forhold til
> hvad man kunne gøre med anvendelse af C++ Standard Library.
> Det ville blive simplere hvis man brugte std::string klassen (eventuelt
> std::basic_string<TCHAR>)
>
> typedef std::basic_string<TCHAR> tstring;
>
> BOOL TeleSNMP::Recv()
> {
> tstring buf = GetValue(); // throws exception if fails
> }
>
> BOOL TeleSNMP::GetValue()
> {
> return tstring(tc);
> }
>
>

I MFC ville man med fordel kunne bruge CString, i stedet for
std::basic_string<TCHAR> og TCHAR *.

/b


J. Dahl (13-02-2004)
Kommentar
Fra : J. Dahl


Dato : 13-02-04 12:39

Tak for det hurtige svar. Så mange fejl i så lidt kode!

Jeg er ny indenfor windows programmering, og specielt MFC message
systemet giver mig lidt problemer. En netværks pakke sendes, når
resultatet returnere vil en message blive opsnappet i et View, vha.
ON_MESSAGE. Det virker som det forkerte sted, jeg ville fortrække det
skete i Document eller selve Applikation (CWinApp). Er det muligt og
hvordan (evt. web info)?

mvh
Jacob

"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message news:<c0gbo0$1ado$1@news.cybercity.dk>...
> "J. Dahl" <jad@tele.gl> wrote in message
> news:c4595276.0402120801.a36630f@posting.google.com...
> > Som en del af et windows MFC program fortages følgende funktions kald:
> >
> > BOOL TeleSNMP::Recv()
> > {
> > ...[A]
> > TCHAR* pBuf=NULL;
> > GetValue(&value /*IN*/, 0 /*NOT USED*/, pBuf /*OUT*/);
>
> Er der nogen grund til at retur værdien fra GetValue ikke bliver brugt til
> noget (Bortset fra at den i eksemplet er ubrugelig, da den altid er true) ?
>
> > ...[B]
> > }
> >
> > BOOL TeleSNMP::GetValue(smiLPVALUE pValue, smiUINT32 Type, TCHAR* buf)
> > {
> > ...
> > buf = new TCHAR[_tcsclen(tc)+1];
> > if(buf)
>
> Hvilken compiler (incl. verison) anvender du ?
> Under hvilke omstændigheder kan buf blive 0 ?
>
> > memcpy(buf, tc, _tcsclen(tc)+1);
> > return true;
>
> Hvorfor returnerer du ikke "TRUE" som hører sammen med "BOOL", istedet for
> nøgleordet "true" som hører sammen med den indbyggede type "bool" ?
> Det virker som sammenblanding af typer, som gør koder mere uforståelig
> selvom den er korrekt.
>
> Er det meningen at retur værdien skulle angive om funktionen gik godt eller
> skidt ?
>
> > }
> >
> > I "Recv()" efter GetValue(..) kaldet [B] er pBuf stadig NULL. Lidt
> > debug viser buf bliver succesfuldt allokeret og "fyldt op". Har jeg
> > misforstået noget pointer aritmetik, calling convention eller noget
> > helt trejde.
>
> Ja, du har misforstået hvordan parametre overføres.
> Der anvendes i eksemplet call by value.
>
> Du har en variable "pBuf" i funktionen Recv, der har værdien NULL.
> Når GetValue kaldes bliver der lavet en ny variabel "buf" har får samme
> værdi som "pBuf" altså NULL. Derudover er der ikke nogen sammenhæng mellem
> "pBuf" og "buf", og tildelingen til "buf" bliver derfor ikke ført tilbage
> til "pBuf".
>
> Du skal enten bruge call by reference eller bruger en pointer til en
> pointer.
>
> BOOL TeleSNMP::Recv()
> {
> TCHAR* pBuf=NULL;
> GetValue(... , &pBuf );
> }
>
> BOOL TeleSNMP::GetValue(..., TCHAR** buf)
> {
> *buf = new TCHAR[...];
> }
>
> Venlig hilsen
>
> Mogens Hansen
>
>
> PS.
> Hvor er typisk MFC kode dog ofte bøvlet og ikke særligt pænt i forhold til
> hvad man kunne gøre med anvendelse af C++ Standard Library.
> Det ville blive simplere hvis man brugte std::string klassen (eventuelt
> std::basic_string<TCHAR>)
>
> typedef std::basic_string<TCHAR> tstring;
>
> BOOL TeleSNMP::Recv()
> {
> tstring buf = GetValue(); // throws exception if fails
> }
>
> BOOL TeleSNMP::GetValue()
> {
> return tstring(tc);
> }

Mogens Hansen (13-02-2004)
Kommentar
Fra : Mogens Hansen


Dato : 13-02-04 16:21


"J. Dahl" <jad@tele.gl> wrote:
> Så mange fejl i så lidt kode!

Det meste (undtaget det du spurgte om) var ikke fejl, men blot overvejelser
omkring kodestil.

Venlig hilsen

Mogens Hansen




Bertel Brander (13-02-2004)
Kommentar
Fra : Bertel Brander


Dato : 13-02-04 20:47

J. Dahl wrote:

> Jeg er ny indenfor windows programmering, og specielt MFC message
> systemet giver mig lidt problemer. En netværks pakke sendes, når
> resultatet returnere vil en message blive opsnappet i et View, vha.
> ON_MESSAGE. Det virker som det forkerte sted, jeg ville fortrække det
> skete i Document eller selve Applikation (CWinApp). Er det muligt og
> hvordan (evt. web info)?
>

Hvis du fanger beskeden i din CWinApp vil den ikke blive sendt til
view'et. Du fanger beskeden i App'en på samme måde som i view'et.

Det forusætter dog at beskeden sendes til App'en og ikke direkte
til view'et. Hvem sender beskeden og hvad er det for en message?

/b


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408920
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste