You are not logged in.

  • Login

sylence

Administrator

  • "sylence" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

1

Wednesday, May 26th 2010, 9:46pm

Ä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:

Source code

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:

Source code

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

Wednesday, May 26th 2010, 10:45pm

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" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

3

Thursday, May 27th 2010, 12:11am

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

Thursday, May 27th 2010, 12:19am

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" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

5

Thursday, May 27th 2010, 12:21am

Quoted

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" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

6

Thursday, May 27th 2010, 12:41am

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

Thursday, May 27th 2010, 9:08am

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

Posts: 5,381

Location: Bremen

Occupation: Physiker

  • Send private message

8

Thursday, May 27th 2010, 9:40am

*grrr* void main() X(

sylence

Administrator

  • "sylence" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

9

Thursday, May 27th 2010, 11:02am

Quoted

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...

Posts: 2,153

Location: Freiberg

Occupation: GER

  • Send private message

10

Thursday, May 27th 2010, 2:00pm

Warum wurstelst du überhaupt mit C rum ?

sylence

Administrator

  • "sylence" started this thread

Posts: 1,863

Location: Dresden

Occupation: GER

  • Send private message

11

Thursday, May 27th 2010, 5:35pm

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. :(

Posts: 4,305

Location: Regensburg

Occupation: GER

  • Send private message

12

Thursday, May 27th 2010, 8:45pm

Quoted

Original von sylence

Quoted

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

Thursday, May 27th 2010, 8:56pm

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

Thursday, May 27th 2010, 9:35pm

Quoted

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

Thursday, May 27th 2010, 10:03pm

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.