Sie sind nicht angemeldet.

  • Anmelden

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

1

26.05.2010, 21:46

Ärger mit C und C++

Nabend,

ich versuche, mir via einiger Tutorials (z.B. klick) ein paar Grundlagen in Sachen DirectInput anzueignen, da ich für eine Unigeschichte Eingaben von Joysticks verarbeiten will.

C meine ich einigermaßen zu verstehen, bei C++ siehts eher mau aus - objektorientierte Programmierung an sich ist kein Problem, aber von all den Spezialitäten verstehe ich nichts, hab's bisher einfach noch nicht gebraucht.

Konkret:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
#include <dinput.h>

#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")
 
void main() {
     HINSTANCE g_hinst = NULL;
     LPDIRECTINPUT8 g_lpDI; 

     DirectInput8Create(g_hinst, DIRECTINPUT_VERSION, IID_IDirectInput8W, (void**)&g_lpDI, NULL); 
     return;
}

Warum kompiliert das, wenn ichs dem C++-Compiler übergebe (nutze Visual Studio 2010), nicht aber als reines C?

Fehlermeldungem vom C-Compiler wären:

Quellcode

1
2
error C2440: 'function' : cannot convert from 'const GUID' to 'const IID *const '
warning C4024: 'DirectInput8Create' : different types for formal and actual parameter 3

Die beziehen sich beide auf den dritten Parameter der Zeile 11, "const IID &riidltf".

Ich finde es ausgesprochen schwierig, im Typchaos von DirectX irgendwie durchzusehen. Wenn ich die MSDN-Library installiere, komme ich dann irgendwie leicht an Tooltips mit Erläuterungen, wenn ich mit der Maus über die entsprechenden Typen fahre? Was soll ich mir denn unter dem Typ "IID" vorstellen und warum heißt der verdammte Parameter riidltf?

Hilfe? :(
sylence.cc

2

26.05.2010, 22:45

wie compilierst du denn "reines c"? ich dachte der VS compiler ist eh c/c++...

Kenne mich mit DX nicht aus. Aber sowie da Objektorientierte Konstrukte drin sind wird der C compiler das halt nicht können. C++ war halt eine Erweiterung zum C Syntax. Und freu dich es kommt ein neuer Standard raus (ich glaube Ende des Jahres). Dann wird das noch viel schlimmer. ;)

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

3

27.05.2010, 00:11

Wenn man eine leere Win32-Konsolenanwendung erstellt und dann einfach nur .c-Dateien verwendet, kompiliert der anstandsgemäß auch reines C. DirectX-Programmierung ist damit auf jeden Fall möglich, in der online-MSDN-Bibliothek habe ich auch kurz einen Artikel darüber gelesen, wie man auf die Methoden der einzelnen Objekte (die dann eben Zeiger auf structs sind) zugreift: Jede struct hat ein Feld, das auf ein Array mit Funktionspointern zeigt.

Aber warum kompiliert er das Obige nicht? Ich mag die Fehlermeldung nicht so richtig verstehen...

4

27.05.2010, 00:19

ein c++ compiler compiliert doch immer "reines" c. Ob das nu .c Dateien oder .cpp Dateien sind ist dabei recht hupe. Oder irre ich mich da?

Afir ist aber der Compiler bei VS ein c/c++ compiler und eben kein expliziter c compiler.

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

5

27.05.2010, 00:21

Zitat

Original von kOa_Borgg
ein c++ compiler compiliert doch immer "reines" c. Ob das nu .c Dateien oder .cpp Dateien sind ist dabei recht hupe. Oder irre ich mich da?

Ja, das dachte ich auch.

Ich hatte eigentlich auch eher mit Problemen bzgl. der fehlenden Objektorientiertheit gerechnet. Obige Fehlermeldung scheint aber ein reines Problem mit den Datentypen zu sein...warum ändern die sich auf einmal?

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

6

27.05.2010, 00:41

Ha!
Lösung gefunden: klick
Das hatte ich zwar so schon probiert, jedoch meckerte das IntelliSense von Visual Studio herum, dass das so nicht möglich sei. Das ist jetzt zwar auch noch so, dafür kompiliert er ohne Probleme. :)

7

27.05.2010, 09:08

bei so komischen Syntaxsachen meckert der oft mal ohne Grund rum.

nC_eru

Erleuchteter

Beiträge: 5 381

Wohnort: Bremen

Beruf: Physiker

  • Nachricht senden

8

27.05.2010, 09:40

*grrr* void main() X(

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

9

27.05.2010, 11:02

Zitat

Original von nC_eru
*grrr* void main() X(

Völlig Wurst, ob main da richtig deklariert ist - ich wollte doch nur Wissen, wie man überhaupt mit DInput arbeitet. Aber im Grunde hast du recht. :)

Das Programm funktioniert zwar jetzt, ist aber im Editor voll von roten Linien, da das IntelliSense glaubt, das wäre C++. Grund scheint zu sein, dass der nun in den Headers das "#ifdef __cplusplus" brav auswertet, für reines C da aber zum Teil völlig andere Datenstrukturen definiert werden. Falls jemand einen Weg kennt, das umzukonfigurieren...

10

27.05.2010, 14:00

Warum wurstelst du überhaupt mit C rum ?

sylence

Administrator

  • »sylence« ist der Autor dieses Themas

Beiträge: 1 861

Wohnort: Dresden

Beruf: GER

  • Nachricht senden

11

27.05.2010, 17:35

Ich habe bereits ein fertiges Projekt in C gegeben, das letzendlich zu einer DLL zusammenkompiliert und in eine größere, alte Anwendung eingebunden wird. Da habe ich keinen großartigen Spielraum, das muss nunmal leider in C umgesetzt werden.

€: Offensichtlich geht es auch anderen so. Man möchte den VS-Entwicklern ins Gesicht schlagen, dass der Bug mangels Interesse auch einfach mal geschlossen wird. :(

myabba|abra

Erleuchteter

Beiträge: 4 305

Wohnort: Regensburg

Beruf: GER

  • Nachricht senden

12

27.05.2010, 20:45

Zitat

Original von sylence

Zitat

Original von kOa_Borgg
ein c++ compiler compiliert doch immer "reines" c. Ob das nu .c Dateien oder .cpp Dateien sind ist dabei recht hupe. Oder irre ich mich da?

Ja, das dachte ich auch.


stimmt nicht ganz. in ein paar details weicht C von C++ ab. Spontan fällt mir jetzt die Sache ein, dass C mit Funktionen arbeiten kann, die erst später im Programm implementiert (oder wars sogar deklariert?) werden

13

27.05.2010, 20:56

Man könnte auch in seinem C-Code etwas mit einem Keyword benennen (z.B. eine Variable "new"), das nur in C++ eins ist und in C keins. Dann dürfte ein C-Compiler es korrekt kompilieren, ein C++-Compiler allerdings nicht.

14

27.05.2010, 21:35

Zitat

Original von myabba|abra
stimmt nicht ganz. in ein paar details weicht C von C++ ab. Spontan fällt mir jetzt die Sache ein, dass C mit Funktionen arbeiten kann, die erst später im Programm implementiert (oder wars sogar deklariert?) werden


das kann c++ auch. ich muss sie deklarieren. wo ich sie dann implementiere ist dabei recht wurscht. ich wüßte jetzt aber nicht in wie fern sich da c und c++ unterscheiden.

@plizzz: ok das mit den keywords ist klar. aber hier war eher von syntaktischen konstrukten etc die rede.

15

27.05.2010, 22:03

http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

Daneben kocht jeder Compiler so sein eigenes Süppchen... ist lange nicht so standardisiert wie z.B. Java.