Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

05.03.2013, 16:49

gl3w get da sh*t to work

So ich eröffne jetzt mal einen Thread für meine Probleme mit dem gcc/C++ unter Linux.
Aktuell will er mir die gl3w nicht kompilierten:

Quellcode

1
2
3
4
5
6
Building file: ../src/gl3w.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/gl3w.d" -MT"src/gl3w.d" -o "src/gl3w.o" "../src/gl3w.cpp"
../src/gl3w.cpp: In Funktion »void* get_proc(const char*)«:
../src/gl3w.cpp:78:54: Fehler: ungültige Umwandlung von »void (*)()« in »void*« [-fpermissive]
make: *** [src/gl3w.o] Fehler 1


Die ganze Datei: http://pastebin.com/4YHF2Z0Z

Betreffende Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
static void *get_proc(const char *proc)
{
    void *res = glXGetProcAddress((const GLubyte *) proc); // <---

    if (!res)
        res = dlsym(libgl, proc);
    return res;
}


Ich versteh nicht ganz wieso der das nicht kompiliert. Der Rückgabewert ist ja eigentlich ein Funktionspointer...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

05.03.2013, 17:09

void* ist eben kein void(*)()
Steht doch da. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

05.03.2013, 17:21

Sowas komisches hab ich auch noch nicht gesehen ^^
Wie caste ich das explizit?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

05.03.2013, 18:32

Was willst du casten? Ein Function Pointer kann nicht in einen void* umgewandelt werden...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

05.03.2013, 18:35

Doch, das geht schon ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

05.03.2013, 18:46

Ah interessant, das ist seit C++11 also tatsächlich conditionally supported, war mir neu. Wenn ich das richtig interpretiere, dann ist es aber lediglich nicht mehr explizit verboten, der Standard fordert aber in keiner Weise, dass es unterstützt wird:

Zitat von »ISO/IEC 14882:2011 §5.2.10/8«

Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cvqualification, shall yield the original pointer value.

Und in C++03 wars iirc auf jeden Fall verboten...

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (05.03.2013, 18:56)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

05.03.2013, 18:58

Reden wir über verschiedene Dinge? Ich habe schon seit jeher irgendwas in void* casten können. Ob das Sinn macht, ist eine andere Frage ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

05.03.2013, 19:06

Nö, Function Pointer konntest du nie in void* casten, jeder Compiler der das vor C++11 erlaubt hat, war nicht standardkonform... ;)

Edit: Was du machen könntest, wäre deinen Function Pointer in einen Integer und diesen nach void* zu konvertieren, was aber im allerbesten Fall implementation defined ist...

Hab zur Sicherheit auch grad nochmal nachgeschaut und kann im C++03 Standard absolut nichts finden, das das erlauben würde...


Um zum eigentlichen Problem noch was zu sagen: Ich vermute mal, dass es in C irgendwie eine Conversion von Function Pointer in void* gibt (auch wenn ich gerade nix finden kann), wie für so ziemlich alles. Das Problem ist vermutlich, dass du gl3w.c als C++ Code zu kompilieren versuchst, es sich aber nur um C Code handelt, wie die originale Dateiendung ja auch bereits anzeigt... ;)

Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von »dot« (05.03.2013, 19:34)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

05.03.2013, 19:49

Weiß nicht... dürfte ziemlich alt sein und gab nie Compile-Errors. Aber hey, das war auch VC, wer weiß. Ich kenne mich da mit dem Standard jedenfalls nicht genug aus. Zudem teilweise auch gnadenlose C-Casts. Lustig ist, dass die Konvertierung von Function-Pointer in void* scheinbar wie von allein ohne forcierten Cast ging.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void                CreateNewButn       (CREATORS* self, CREATORS* List);
void                HyperButn           (CREATORS* self, CREATORS* List);
...
void*   func[MBI_INSTRUCTION_COUNT]
            =   { CreateNewButn_MBI, HyperButn_MBI,...};[/code]

...
void    NOPButn_MBI(CREATORS* self, CREATORS* List)
{
    HandleMBIButnWnds(self, List);
    ActivateTab(2,NOPTab);
}
...
void* Func = NOPButn_MBI;
((void(*)(CREATORS* self, CREATORS* List))Func)(c, creators);
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

05.03.2013, 20:00

Merkwürdig, ging das durch den C oder den C++ Compiler?

Werbeanzeige