Avatar billede benjax Nybegynder
27. september 2004 - 15:13 Der er 6 kommentarer og
1 løsning

Pointer problem

Efter at have skiftet fra Borland C++ 5.02 til Builder 6.0 virker følgende ikke længere:

// I .h fil:
struct NavHistoryStruct {
    LONG lFormat;
    struct NavHistoryStruct *pPrevious;
    struct NavHistoryStruct *pNext;
};
typedef struct NavHistoryStruct * PNavHistory;

// I .c program:
VOID NavHistoryPush(LONG lFormat) {
    PNavHistory pNav;

    if(!(pNavHistory)) {
        pNav = (struct PNavHistory *)malloc(sizeof(PNavHistory));
        pNav->pNext = NULL;
    }
    else if(pNavHistory->pNext == NULL) {
        pNav = (struct PNavHistory *)malloc(sizeof(PNavHistory));
        pNav->pNext = NULL;
        pNavHistory->pNext = pNav;
    }
    else pNav = (pNavHistory->pNext);
    pNav->lFormat = lFormat;
    pNav->pPrevious = pNavHistory;
    pNavHistory = pNav;

    bNavCallback = FALSE;
    NavUpdButtons();
}

Første gang metoden kaldes går det godt, vi kommer ind i den første if. Anden gang burde vi komme ind i else if'en, men det gør vi ikke, hvilket indikerer at pNavHistory->pNext ikke er NULL. Men hvorfor??

Herefter crasher programmet med memory allocation error ved pNav->lFormat = lFormat; da pNav ikke indeholder noget fornuftigt.
Avatar billede benjax Nybegynder
27. september 2004 - 15:17 #1
Skylder lige at sige, at pNavHistory er deklareret således (i .h-filen):
static PNavHistory pNavHistory = NULL;
Avatar billede arne_v Ekspert
27. september 2004 - 15:24 #2
Jeg undrer mig mere over at det har virker.

pNav = (struct PNavHistory *)malloc(sizeof(PNavHistory));

allokerer det antal bytes der er i en pointer (4) ikke det antal bytes
der er i structen (12).
Avatar billede arne_v Ekspert
27. september 2004 - 15:25 #3
Prøv:

pNav = (PNavHistory)malloc(sizeof(NavHistoryStruct));
Avatar billede benjax Nybegynder
27. september 2004 - 15:33 #4
Tak! Det virker - med en lille ændring:
pNav = (PNavHistory)malloc(sizeof(struct NavHistoryStruct));

"struct" skulle med ind, for at det ville oversætte.

Jeg forstår nu heller ikke hvordan det kan have virket før, men det gør det altså, når jeg oversætter med den gamle compiler. Men sådan er der jo så meget. ;o)
Avatar billede arne_v Ekspert
27. september 2004 - 15:35 #5
Ah det er en .c fil (C kode). Så skal struct angives. Det var ikke nødvendigt hvis
det var en .cpp fil (C++).
Avatar billede arne_v Ekspert
27. september 2004 - 15:36 #6
All set ?
Avatar billede benjax Nybegynder
27. september 2004 - 15:38 #7
Jepper, 1000-tak for hjælpen. Du har ærligt fortjent dine points for et lynhurtigt og godt 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