|
| 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
| |
|
|