Avatar billede c-skau Nybegynder
11. april 2005 - 17:44 Der er 17 kommentarer og
1 løsning

return konverterer min char

G'dag Eksperter

Jeg er lige støt på et lidt underligt problem da jeg prøver at retunere en "const char *" med værdien "fairy.jpg", men ender med at få retuneret "ÝÝÝÝÝÝÝÝÝÝÝÝÝÝ".
Hvis jeg debugger kan jeg se at helt frem til "return xmlretu;" er værdien rigtig.?!?!?

/C-Skau
Avatar billede arne_v Ekspert
11. april 2005 - 17:47 #1
Gæt: du returnerer adressen på en lokal variabel - og det kan man ikke
Avatar billede arne_v Ekspert
11. april 2005 - 17:47 #2
char *f()
{
  char a[10];
  ...
  return a;
}

duer ikke
Avatar billede arne_v Ekspert
11. april 2005 - 17:48 #3
char a[10];

char *f()
{
  ...
  return a;
}

er OK
Avatar billede arne_v Ekspert
11. april 2005 - 17:48 #4
char *f(char a[10])
{
  ...
  return a;
}

er bedre
Avatar billede c-skau Nybegynder
11. april 2005 - 18:51 #5
Hvordan får jeg så det til at virke med min kode?:

const char *cLoader::LoadXML(char *xmlfil, char *xmlpar, char *xmlchi)
{
    TiXmlDocument doc;
    doc.LoadFile(xmlfil);
    TiXmlNode* xmlnode = NULL;
    TiXmlElement *xmlelem = NULL;
    TiXmlAttribute *xmlattr = NULL;
    const char *xmlretu;
   
    xmlnode = doc.FirstChild( xmlpar );
    xmlelem = xmlnode->FirstChildElement( xmlchi );
    xmlattr = xmlelem->FirstAttribute();
    xmlretu = xmlattr->Value();
   
    return xmlretu;
}
Avatar billede arne_v Ekspert
11. april 2005 - 18:54 #6
måske:

const char *cLoader::LoadXML(char *xmlfil, char *xmlpar, char *xmlchi, char *retbuf)
{
    TiXmlDocument doc;
    doc.LoadFile(xmlfil);
    TiXmlNode* xmlnode = NULL;
    TiXmlElement *xmlelem = NULL;
    TiXmlAttribute *xmlattr = NULL;
    const char *xmlretu;
 
    xmlnode = doc.FirstChild( xmlpar );
    xmlelem = xmlnode->FirstChildElement( xmlchi );
    xmlattr = xmlelem->FirstAttribute();
    xmlretu = xmlattr->Value();
    strcpy(retbuf, xmlretu);
    return retbuf;
}
Avatar billede bertelbrander Novice
11. april 2005 - 20:42 #7
#include <string>

std::string cLoader::LoadXML(char *xmlfil, char *xmlpar, char *xmlchi)
{
    TiXmlDocument doc;
    doc.LoadFile(xmlfil);
    TiXmlNode* xmlnode = NULL;
    TiXmlElement *xmlelem = NULL;
    TiXmlAttribute *xmlattr = NULL;

    xmlnode = doc.FirstChild( xmlpar );
    xmlelem = xmlnode->FirstChildElement( xmlchi );
    xmlattr = xmlelem->FirstAttribute();
    return xmlattr->Value();
}
Avatar billede arne_v Ekspert
11. april 2005 - 20:57 #8
forhindrer der doc's destructor i at deallokere det memory ?
Avatar billede bertelbrander Novice
11. april 2005 - 21:15 #9
Arne, jeg forstår ikke din sidste kommentar.
Avatar billede c-skau Nybegynder
11. april 2005 - 21:34 #10
arne_v << Hva ska jeg så smide ind i "char *retbuf" når jeg kalder LoadXML ?
Avatar billede arne_v Ekspert
11. april 2005 - 21:46 #11
bertel>

xmlretu er en pointer - der er ikke noget problem i at returnere den.

Problemet er hvad den peger på.

Så vidt jeg kan gennemskue så peger xmlattr->Value() på noget som gemmer sig et
eller andet sted i doc.

doc's destructor vil blive kaldt - og jeg formoder at den deallokerer alt
memory inklusive det som xmlattr->Value() eller xmlretu peger på.
Avatar billede arne_v Ekspert
11. april 2005 - 21:47 #12
c-skau>

det er det som xmlretu peger på jeg mener at du skal kopiere (strcpy)
Avatar billede bertelbrander Novice
11. april 2005 - 21:57 #13
Når man returnerer en std::string returneres et kopi af det xmlattr->Value() peger på.
Denne std::string vil normalt blive slettet "af sig selv" efter brug.
Der burde dermed ikke kunne opstå problemer.
Avatar billede arne_v Ekspert
11. april 2005 - 22:20 #14
sorry - jeg havde ikke set at du havde ændret retur typen fra char* til string - så
får du jo også kopieret data inden de forsvinder
Avatar billede c-skau Nybegynder
13. april 2005 - 13:31 #15
Undskyld den pludselige forsvinden, men jeg har siddet og kæmpet med det her i en rum tid nu.
Jeg har lidt problemer med at få string metoden til at virke da "#include <string>" desværre kolidere med noget i den 3D motor (Irrlicht) jeg bruger til mit projekt.
Jeg har også prøvet med Arnes metode, men jeg kan ikke rigtig få den til at virke heller.. måske er det fordi jeg ikke helt kan finde ud af hva jeg ska smide ind i den ene ende under "char *retbuf"..?
Avatar billede arne_v Ekspert
13. april 2005 - 15:28 #16
char retbuf[100];

[ret 100 til whatever]
Avatar billede c-skau Nybegynder
13. april 2005 - 16:47 #17
Ah.. nu forstår jeg =)
Du må meget undskylde min uforståenhed, men jeg er forholdsvis ny til C++ og er van til VB hvor man slet ikke behøver at bekymre sig om den slags!
Men efter lidt prøven frem og tilbage så lykkedes det mig at få det til at virke :D
Det ska du vist have lidt point for så arne_v hvis du lige smidder et svar?
Avatar billede arne_v Ekspert
13. april 2005 - 16:58 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester