Avatar billede rrm Nybegynder
31. december 2006 - 14:44 Der er 5 kommentarer og
1 løsning

Pointer problem - tildelte strenge skifter placering

Hejsa..

Jeg er støt ind i problem, hvor jeg under debuging kan se at tildelte strenge fint virker i funktionen hvor de

sættes, men når funktionen slutter og strukturen returneres så byttes der godt og grundigt rundt på pointerne til

strengene.

Min struktur har følgnede form:

struct WPGrabUrlResourceStruct
{
    int errCode;
    char* errMsg;
    char* localFileName;
    char* url;
    WPGRAB_STATUS_ENUM status;
};

struct ResourcesFoundStruct
{
    vector<UrlResourceStruct> webpages;
    vector<UrlResourceStruct> others;
};

struct WPGrabResourceFoundStruct
{
    int webpageCount;
    int imagesCount;
    int otherCount;
    WPGrabUrlResourceStruct* webpagesList;
    WPGrabUrlResourceStruct* imagesList;
    WPGrabUrlResourceStruct* otherList;
};

og funktionen der initialiserer denne er:

WPGRABDLL_API WPGrabResourceFoundStruct* WPGrabGetFoundResources(int index)
{

  ...
   
  ResourcesFoundStruct resources;

  // Fetch found resources...
  if(grabDB->getFoundResourceByIndex(resources, index))
  {
    WPGrabResourceFoundStruct* wpResources = new WPGrabResourceFoundStruct;
    // Copy webpages
    wpResources->webpageCount = (int) resources.webpages.size();
    ...

    if(wpResources->webpageCount > 0)
    {
    // allocate room for webpages...
    wpResources->webpagesList = new

WPGrabUrlResourceStruct[wpResources->webpageCount*sizeof(WPGrabUrlResourceStruct)];
           
    if(wpResources->webpagesList == NULL)
    return NULL; // cannot allocate memory...

    for(int i=0;i<wpResources->webpageCount;i++)
    {
        wpResources->webpagesList[i].errMsg = "fisk";
        wpResources->webpagesList[i].errCode = 0; // no one exists for the moment...
        wpResources->webpagesList[i].localFileName = "hund";                            

    wpResources->webpagesList[i].url = "hval";
        wpResources->webpagesList[i].status = (WPGRAB_STATUS_ENUM) resources.webpages.at(i).pType;
    }
    }
    else
    ...
    return wpResources;
  }
  else
  {
    return NULL;
  }
}

og udskrivningen:

WPGrabResourceFoundStruct* data = WPGrabGetFoundResources(0);

if(data != NULL)
{
  for(int i=0;i<data->otherCount;i++)
  {
  cout << "Item: " << data->otherList[i].url << endl;
  cout << " file: " << data->otherList[i].localFileName << endl;
  cout << " errmsg: " << data->otherList[i].errMsg << endl;
  cout << " errcode: " << data->otherList[i].errCode << endl;
}

Når jeg kører programmet får jeg følgende output nåt WPGrabGetFoundResources er færdig (inden den returnerer):
- wpResources    0x003ba240 {webpageCount=1 imagesCount=0 otherCount=0 ...}    WPGrabResourceFoundStruct *
  - webpagesList    0x003bafe8 {errCode=0 errMsg=0x10063914 "fisk" localFileName=0x1006390c "hund" ...}   

WPGrabUrlResourceStruct *
    - errCode    0    int
    - errMsg    0x10063914 "fisk"    char *
    - localFileName    0x1006390c "hund"    char *
    - url    0x10063904 "hval"    char *
    - status    WPGRAB_PROC_ERROR    WPGRAB_STATUS_ENUM

Dvs. alt er som det skal være... Men hvis vi så ser på outputtet fra data variablen:

- data    0x003ba240 {webpageCount=1 imagesCount=0 otherCount=0 ...}    WPGrabResourceFoundStruct *
  - webpagesList    0x003bafe8 {localFileName=0x00000000 <Bad Ptr> url=0x10063914 "fisk" errCode=268843276 ...}   

WPGrabUrlResourceStruct *
    -    localFileName    0x00000000 <Bad Ptr>    char *
    -    url    0x10063914 "fisk"    char *
    -    errCode    268843276    int
    -    errMsg    0x10063904 "hval"    char *
    -    status    WPGRAB_PROC_ERROR    WPGRAB_STATUS_ENUM

Sa er indholdet af url og errmsg byttet rundt og localfilename er nu en bad pointer???

Nogen der kan gennemskue hvorfor det sker??? Hvis jeg rykker rundt i erklæringen WPGrabUrlResourceStruct til

struct WPGrabUrlResourceStruct
{
    char* localFileName;
    char* url;
    int errCode;
    char* errMsg;
    WPGRAB_STATUS_ENUM status;
};

Som er outputtet som det skal??? Jeg bruger Visual Studio 2005 SP1
Avatar billede jpk Nybegynder
01. januar 2007 - 10:22 #1
Konstruktioner som
wpResources->webpagesList[i].errMsg = "fisk";
er ikke tilstrækkelige, der skal ligeledes afsættes hukommelse til strengen.
Hvad med at bruge STL's string, du bruger jo alligevel vector (jeg går ud fra det er STL?)

Altså:
struct WPGrabUrlResourceStruct
{
    int errCode;
    string errMsg;
    string localFileName;
    string url;
    WPGRAB_STATUS_ENUM status;
};

Og så videre...
Avatar billede jpk Nybegynder
01. januar 2007 - 10:24 #2
Hvorfor bruger du iøvrigt sizeof i din array allokering?
WPGrabUrlResourceStruct[wpResources->webpageCount*sizeof(WPGrabUrlResourceStruct)];

Følgende burde vel kunne gøre det:
WPGrabUrlResourceStruct[wpResources->webpageCount];

Det er jo antal elementer der allokeres, ikke antal bytes.
Avatar billede rrm Nybegynder
01. januar 2007 - 17:30 #3
>> Hvorfor bruger du iøvrigt sizeof i din array allokering?
>> WPGrabUrlResourceStruct[wpResources->webpageCount*sizeof(WPGrabUrlResourceStruct)];

Hmm, jeg må blandet noget sammen. Tak for det...

Grunden til at jeg ikke bruger string er at funktionen er en del af en dll fil, som skal tilgåes fra sprog der ikke kender til sld string...
Avatar billede rrm Nybegynder
01. januar 2007 - 18:05 #4
AAAAAAAAAAAAAAAarrrrrrrrrrrrrrrrggggggggggggggggggg........................

Jeg fandt fejlen (dumme mig :(). Mit projekt er en dll fil og en test program, der bruger dll'en. Men da de begge bruger den h fil, hvor strukturen erklæres skal de selvfølgelig også kompileres når den ændres... SUK

Nå, men lig et svar og tak for hjælpen....
Avatar billede jpk Nybegynder
02. januar 2007 - 08:19 #5
Okay, takker...
Avatar billede segmose Nybegynder
04. januar 2007 - 13:54 #6
Til jpk:
hvorfor er dette ikke ok?
wpResources->webpagesList[i].errMsg = "fisk";
"fisk" er jo en nultermineret streng som errMsg peger på?
char* errMsg; // burde være const så der ikke, ved et uheld, ændres i strengen.
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