[C++ / win32] Access violation bij vsprintf()

Pagina: 1
Acties:

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Na veel gedebugged te hebben kom ik hier nog steeds niet uit.. Alles lijkt gewoon te kloppen, argument count, de pointer naar het format klopt, ik weet het even niet meer..

Compiler = VC++ 6

Het gaat om dit stukje 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
void CClient::SendNumeric( int numeric, ... )
{
    char szTemp[MAX_BUFFERSIZE];
    char * text = numeric_str( numeric );

    va_list vargs;
    va_start( vargs, text );
    
    if ( ! vsprintf( szTemp, text, vargs ) ) /* Hier treedt de access violation dus op */
        strcpy( szTemp, text );

    SendData( ":%s %d %s %s", gConfig.m_servername, numeric, registered ? m_nickname : "AUTH", szTemp );

    va_end( vargs );
}

char * numeric_str( int numeric )
{
    char * tmp;

    if ( ( numeric < 100 ) && ( numeric >= 0 ) )
        tmp = replies_0[numeric].num_form;
    else if ( ( numeric < 300 ) && ( numeric >= 200 ) )
        tmp = replies_2[numeric - 200].num_form;
    else if ( ( numeric < 400 ) && ( numeric >= 300 ) )
        tmp = replies_3[numeric - 300].num_form;
    else if ( ( numeric < 500 ) && ( numeric >= 400 ) )
        tmp = replies_4[numeric - 400].num_form;
    else if ( ( numeric < 600 ) && ( numeric >= 500 ) )
        tmp = replies_5[numeric - 500].num_form;
    else if ( ( numeric < 700 ) && ( numeric >= 600 ) )
        tmp = replies_6[numeric - 600].num_form;

    return tmp;
}


Die replies_ arrays zijn als volgt opgesteld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct  {
    int num_val;
    char *num_form;
} SNumeric;

static SNumeric replies_0[] = {
            0, (char *)NULL,
/* 001 */   RPL_WELCOME, ":Welcome to the %s IRC Network %s!%s@%s",
/* 002 */   RPL_YOURHOST, ":Your host is %s, running version %s",
/* 003 */   RPL_CREATED, ":This server was created %s",
/* 004 */   RPL_MYINFO, "%s %s " IRCD_USERMODES " " IRCD_CHANMODES,
/* 005 */   RPL_PROTOCTL, "%s :are available on this server",
            0, (char *)NULL
};


SendNumeric() wordt op deze manier gecalled:
C++:
1
SendNumeric( RPL_WELCOME, gConfig.m_network, m_nickname, m_username, m_maskedhost );


Ik dacht eerst dat het ergens in numeric_str() zat, maar na een printf( "%s", numeric_str( numeric ) ); toegevoegt te hebben krijg ik wel gewoon alles normaal terug op de console.

Iemand enig idee waarom die access violation optreedt en hoe ik dat kan verhelpen? Alvast bedankt :)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij moet je de va_start aanroepen met de laatste niet optionele parameter, in dit geval dus numeric.

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
bigbeng schreef op 18 mei 2004 @ 16:41:
Volgens mij moet je de va_start aanroepen met de laatste niet optionele parameter, in dit geval dus numeric.
Je hebt gelijk, had dat een beetje achteloos gekopieerd van een functie erboven die hetzelfde principe gebruikt, en vergeten dat te veranderen |:(
Bedankt