[C++] bizar windows compileer error, niemand komt er uit!

Pagina: 1
Acties:

  • apNia
  • Registratie: Juli 2002
  • Laatst online: 12:46

apNia

Schreeuwen en Nibbits eten!

Topicstarter
Ik heb een probleem, waar ik met een leraar en een ervaren coder niet uit ben gekomen. De source is als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef void * (__stdcall *FSOUND_DSPCALLBACK) (
    void *originalbuffer, 
    void *newbuffer, 
    int length,
     void *userdata);

void * __stdcall DSP_ReverbCallback(
    void *originalbuffer, 
    void *newbuffer, 
    int length, 
    void *userdata)
{
    return 0;
}

int main() 
{
        FSOUND_DSPCALLBACK callbackmeeuw = &DSP_ReverbCallback;
        return 0;
}


De error die ik krijg is (even overzichtelijk gemaakt):
code:
1
2
3
18 C:\Dev-Cpp\Projects\Dickski\main.cpp invalid conversion from 
`void*(*)(void*, void*, int, void*) ' to 
`void*(*)(void*, void*, int, void*)'


Nou zie ik alleen en extra spatie in de melding. Maar verder compiled 'ie compleet niet.

M'n geeft als version aan:
code:
1
g++ (GCC) 3.3.1 (mingw special 20030804-1)


Ik vind 't extreem bizar. Onder linux met gcc compiled ie zonder problemen en ook onder MS Visual C++ compiled de source probleemloos.

Iemand die dit snapt? Ik staar me er al dagen helemaal scheel op...

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hmm, ik denk dat er iets fout gaat met de __stdcall modifier, hoewel je code er idd goed uitziet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
apNia schreef op maandag 22 november 2004 @ 13:18:
Iemand die dit snapt? Ik staar me er al dagen helemaal scheel op...
Compiler bug?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Gezien het feit dat mijn VS.NET 2k3 er niet over klaagt lijkt me dit een probleem in DevC++ :)

Haal overigens die ampersand eens weg, misschien dat ie het dan wel werkt? Is functioneel identiek namelijk.

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Als ik em cast naar het goede type met
C++:
1
FSOUND_DSPCALLBACK callbackmeeuw = (FSOUND_DSPCALLBACK)DSP_ReverbCallback;

Accepteert de compiler het wel. En het runt ook ok voor zover ik kan zien. :)

[edit]

En dit :

C++:
1
void * (__stdcall DSP_ReverbCallback)(....)


Wordt ook geaccepteerd zonder die cast. Zit em toch in die __stdcall.

[ Voor 29% gewijzigd door farlane op 22-11-2004 19:38 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 14:56
g++ 3.4.2 compileert de code zonder problemen op windows

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op maandag 22 november 2004 @ 19:30:
Als ik em cast naar het goede type met
C++:
1
FSOUND_DSPCALLBACK callbackmeeuw = (FSOUND_DSPCALLBACK)DSP_ReverbCallback;

Accepteert de compiler het wel.
Dat is nogal "duh" natuurlijk, een reinterpret_cast werkt alleen niet bij casts van pointer to members naar normale ints/pointers en vice versa, verder zal het altijd werken (zo ook bij deze cast) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Works without error with gcc 3.3.3 under cygwin on XP.

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Modbreak:Uh ja zullen we de "het werkt op compiler X en platform Y" even buiten beschouwing laten? Dat weten we nu wel

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Eh ja, .oisyn, wat moeten we dan zeggen? __stdcall is sowieso geen standaard C++. Overigens is dit C code, en geen C++, maar ook in ISO C zit geen __stdcall. Het enige wat je dus kunt zeggen is dat het een extensie van compilers X,Y en Z is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op maandag 22 november 2004 @ 21:50:
Eh ja, .oisyn, wat moeten we dan zeggen?
Wat heeft het dan voor nut om te vermelden dat het wel op die en die compiler op dit en dat platform werkt? Heeft de topicstarter niet heel erg veel aan lijkt me, of wel? Laten we ons dus concentreren op een mogelijke oplossing danwel workaround, voor zover die te vinden is :)

Blijven de suggesties van farlane en curry over. Vooral die van farlane vind ik bijzonder, blijkbaar wordt de __stdcall modifier op een ander niveau toegepast (zonder haakjes in de functiedefinitie werkt het niet, met wel). Misschien wil ie de __stdcall op een of andere vage manier op het returntype toepassen?

apNia: wat krijg je als je dit in je main () zet en uitvoert?
C++:
1
std::cout << typeid (&DSP_ReverbCallback).name () << std::endl;


(wel even <iostream> includen)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 14:56
.oisyn schreef op maandag 22 november 2004 @ 22:04:
[...]
Wat heeft het dan voor nut om te vermelden dat het wel op die en die compiler op dit en dat platform werkt? Heeft de topicstarter niet heel erg veel aan lijkt me, of wel? Laten we ons dus concentreren op een mogelijke oplossing danwel workaround, voor zover die te vinden is :)
Het lijkt me anders wel nuttig te weten dat een nieuwere versie van de compiler waar het probleem zich voor doet wel werkt zoals verwacht. Gezien het feit dat hij MinGW gebruikt is het updaten van de compiler gewoon een zipfile extracten. Dus zo weet de TS dat hij het probleem kan oplossen door een update.

  • apNia
  • Registratie: Juli 2002
  • Laatst online: 12:46

apNia

Schreeuwen en Nibbits eten!

Topicstarter
Ik pauzeer dit topic even tot donderdag jongens.. dan duik ik met een hele zooi coders er even overheen.. want 't probleem is vrij complex zie ik al... als ik er dan niet uitkom meld ik me, ook als ik er wel uitkom meld ik de oplossing hier =)
Thanks tot zo ver, en tot donderdag ;)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Eeeuhm, volgens mij heb ik je oplossing al gegeven of niet: of een cast, of die tweede notatie. (Die verder geen fouten geeft op mijn MSVC6 en MSVC7.1 ) (Of had ik er bij moeten vertellen dat ik dat onder DevC++ heb getest ? :) )

[ Voor 16% gewijzigd door farlane op 23-11-2004 09:17 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
.oisyn schreef op maandag 22 november 2004 @ 22:04:
apNia: wat krijg je als je dit in je main () zet en uitvoert?
C++:
1
std::cout << typeid (&DSP_ReverbCallback).name () << std::endl;
Hmm, das gek; ik heb nu deze code (excuse my French, maar iostream geeft een wazige fout bij mij ) :
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef void * ( __stdcall *FSOUND_DSPCALLBACK) (
    void *originalbuffer, 
    void *newbuffer, 
    int length,
     void *userdata);

void * (__stdcall DSP_ReverbCallback)(
    void *originalbuffer, 
    void *newbuffer, 
    int length, 
    void *userdata)
{
    return 0;
}

void * __stdcall DSP_ReverbCallback1(
    void *originalbuffer, 
    void *newbuffer, 
    int length, 
    void *userdata)
{
    return 0;
}


en in main
C:
1
2
3
        printf( "%s\n",typeid (FSOUND_DSPCALLBACK).name() ) ;        
        printf( "%s\n",typeid (&DSP_ReverbCallback).name() );
        printf( "%s\n",typeid (&DSP_ReverbCallback1).name() ) ;        


Wat als output geeft:
PFPvS_S_iS_E
PFPvS_S_iS_E
PFPvS_S_iS_E
Ze hebben dus wel degelijk alle drie hetzelfde type volgens de compiler.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1