Toon posts:

[C] Vreemde pointer/functie fout

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik zit al twee dagen tegen het volgende probleem op te hikken, maar ik hoopte dat jullie konden helpen.

Ik probeer een programma te maken wat MP3s checkt, in C, op Linux, en een van de functies van dat programma is checksums, oftewel CRCs controleren. Nu heb ik de volgende code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int
checkcrc16(file, fi)
    file_info * file;
    frame_info * fi;
{
    char * pnt;
    int res;
    int len;
    int new_crc16;

    /* get some memory to put the data in to be crcked */
    pnt=(char *)malloc(fi->length);
    if (pnt==NULL) {
        fileerror(" malloc failed");
        return FALSE;
    }
    memset(pnt, 0, fi->length);

    /* read byte 2 and 3 from the header */
    fseek(file->fp, (fi->offset)+2, SEEK_SET);
    res=fread(pnt, 2, 1, file->fp);
    if (!res) {
        free(pnt);
        return FALSE;
    }
    

    /* read the rest of the frame */
    fseek(file->fp, (fi->offset)+6, SEEK_SET);
    len=(fi->length)-6; // minus header and crc

    res=fread(pnt+2, len, 1, file->fp);
    if (!res) {
        free(pnt);
        return FALSE;
    }
    
    new_crc16=crc16(pnt, len+2);
    free(pnt);

    printf("Computed crc16: %d\n", new_crc16);
    if (new_crc16==fi->crc16) {
        return TRUE;
    } else {
        return FALSE;
    }
}


en verder:
C:
1
2
3
4
5
6
7
int
crc16(data, length)
    char *  data;
    int length;
{   
bladiebladiebla
}


Nou lijkt alles goed te gaan, de data wordt in pnt gelezen enzo, maar als ik in de debugger een breakpoint ze op crc16, dan geeft hij het volgende:
code:
1
Breakpoint 3, crc16 (data=0x1a1 <Address 0x1a1 out of bounds>, length=413)


En ik begrijp niet helemaal hoe dat kan, want pnt hoort nooit 0x1a1 te bevatten. 0x1a1 is toevalligerwijs fi->length, zou het daar iets mee te maken hebben? Als ik regel 32 in commentaar zet komt pnt wel goed door naar crc16, maar dan is de code weer zo onnuttig. Kan iemand me helpen?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Wat is een "breakpoint op" crc16? Als je te vroeg breakt is je stack misschien nog niet goed opgebouwd. Als je debug code combineert met optimalisaties zijn er legio andere mogelijkheden waarom je debug gegevens niet zouden kloppen.

Als je bovenaan de implementatie van crc16 het argument print, krijg je dan ook een ongeldige pointerwaarde op het scherm?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Als ik regel 32 in commentaar zet komt pnt wel goed door naar crc16, maar dan is de code weer zo onnuttig. Kan iemand me helpen?
Just a thought:
C++:
1
2
3
printf("Voor: %p\n", pnt);
res=fread(pnt+2, len, 1, file->fp);   // Regel 32
printf("Na: %p\n", pnt);

Professionele website nodig?


Verwijderd

Topicstarter
Ik heb nu het programma nog eens gecompiled zonder optimalisatie, en dat werkt toch een stuk beter. Hij geeft nu weer gewoon iets normaals aan als de parameters van de functie crc16. Nu kan ik weer "fijn" verder met debuggen. Bedankt!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

C:
1
2
3
4
HistorischNut = FALSE;
VerderCommentaarNodig = FALSE;
MoetIkAltijdFullRebuildDoenBijVreemdeOutput = TRUE * 100;
Slot = TRUE;

Professionele website nodig?


Dit topic is gesloten.