Ich bin jetzt ganz durcheinander ( VC++/.NET/CLI )
-
Hallo,
sorry für die blöde frage, aber ich muss das mal genau erklärt haben.
Was programmiere ich nun ?Ich arbeite mich hier durch ein englisches Tutorial. Jetzt zur Zeit ists C++/CLI. Erstellt habe ich mit Visual Studio 2005 mal ein Win32-Konsolenanwendung, dann mal eine CLR Konsolenanwendung .. na was denn nun ?
Ich bin ganz durhceinander. Ist das ( oder was davon ist denn nun .. ) .NET ?
Ist davon überhaupt etwas .NET ?
Jemand schrieb vorhin das bei .NET ein char ( den ich nicht wirklich begriffen habe ) sei hier nicht 1 Byte dondern 2Byte groß ??Könnt Ihr mir mal Helfen bitte ?
Also hier mal die Bsp:
// Derzeit sieht es so aus : #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; }
...und was GENAU ist das hier ?
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #include "SimConnect.h" HANDLE hSimConnect = NULL; void testOpenClose() { HRESULT hr; if (SUCCEEDED(SimConnect_Open(&hSimConnect, "Open and Close", NULL, 0, 0, 0))) { printf("\nConnected to Flight Simulator!"); hr = SimConnect_Close(hSimConnect); printf("\nDisconnected from Flight Simulator"); } else printf("\nFailed to connect to Flight Simulator"); } int __cdecl _tmain(int argc, _TCHAR* argv[]) { testOpenClose(); return 0; }
hmm, ich bin echt ein bischen verwirrt, und bevor ich es vergesse .. ich BIN ANFÄNGER.. blutiger
Danke Euch
Matthias
-
STF-DIR schrieb:
Hallo,
sorry für die blöde frage, aber ich muss das mal genau erklärt haben.
Was programmiere ich nun ?Ich arbeite mich hier durch ein englisches Tutorial. Jetzt zur Zeit ists C++/CLI. Erstellt habe ich mit Visual Studio 2005 mal ein Win32-Konsolenanwendung, dann mal eine CLR Konsolenanwendung .. na was denn nun ?
Ich bin ganz durhceinander. Ist das ( oder was davon ist denn nun .. ) .NET ?
Ist davon überhaupt etwas .NET ?
Jemand schrieb vorhin das bei .NET ein char ( den ich nicht wirklich begriffen habe ) sei hier nicht 1 Byte dondern 2Byte groß ??Könnt Ihr mir mal Helfen bitte ?
Also hier mal die Bsp:
// Derzeit sieht es so aus : #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; }
cli::array ist ein "template" von .NET; du programmierst also C++/CLI. Auch Console::WriteLine ist .NET. System und System::String ^ ebenfalls. Der springende Punkt ist, dass du mit C++/CLI keine eigentliche Trennlinie zwischen .NET und normalem C++ hast. Jeder (!) standardkonforme C++ Code ist automatisch ein gültiger C++/CLI Code, weil C++/CLI eine Erweiterung von C++ ist. Gerade das Vermischen von .NET und nativem Code ist eine Spezialität von C++/CLI. Zum Beispiel kannst du auch folgendes schreiben:
#include "stdafx.h" #include <iostream> using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); std::wcout << L"Hello World" << std::endl; return 0; }
Was die Sache mit dem char betrifft, ist ein wenig komplexer. Unter C++/CLI ist ein char ein ganz normaler char wie in C++, aber entspricht auch dem CTS-Datentyp System::Byte oder System::SByte (mit oder ohne Vorzeichen, je nach Einstellung). Der eigentliche char-Typ, den du mit .NET für Zeichenketten benutzt ist aber System::Char, unter C++ auch wchar_t genannt. Dieser unterstützt Unicode und ist daher im Minimum 2 Byte gross. Das spielt aber im Moment keine Rolle für dich da du damit vorläufig nie in Kontakt kommen wirst. Das Literal L"Hello World" ist vom Typ const wchar_t *, welcher implizit nach System::String konvertiert werden kann. Unter .NET arbeitet man fast nie direkt mit System::Char, sondern (wie in C++) mit String-Klassen. Was du begreifen musst, ist das grundlegende Typen nun mehrere Namen haben, so heisst void z.B. auch System::Void, float heisst auch System::Single und double auch System::Double. Schreibe sie so, wie es dir lieber ist. Oder mach ein typedef.
-
Tja, wir können leider nicht hellsehen, welches Tutorial du durcharbeitest. Das Tutorial muß aber echt schlecht sein, wenn man als Leser nicht erfährt, um was es da geht. Sollte es dir nicht zu denken geben, dieses Tutorial weg zuschmeissen?
Weiterhin ist auch die Frage, was du lernen willst? C++ oder C++/CLI? Diese zwei Dinge sind erstmal Programmiersprachen! .NET ist keine Programmiersprache! Somit ist schon alleine deine Frage falsch bzw. es müsste dir schon mal etwas klarer werden.
C++/CLI ist offiziell eine C++-Erweiterung. C++ ist schon komplex genug, und als Anfänger sich auch noch C++/CLI aufzuhalsen ist echt mutig, wenn nicht sogar gewagt.
Deshalb vielleicht der Rat: suche dir ein Tutorial/Buch über ISO-C++. Wenn du das kannst, wird dir C++/CLI viel einfacher fallen.
Zu deinen zwei Beispielcodes: Erstes Beispiel ist C++/CLI und es nutzt Funktionalitäten aus dem .NET-Framework.
Zweites Beispiel ist der mieseste C++ Code den man sieht, weil es C und nicht C++ ist.Wenn die Beispielcodes aus dem Tutorial sind, dann tut mir jeder Leser dieses Tutorials leid.
-
Hallo,
hmmm....
Also das Tutorial ist in englisch und nennt sich "Beginning Visual C++ 2005" von einem "Ivor Horton". Als webseite ist da http://www.wrox.com angegeben.
Also das ist schon das was ich suche, denn ich hab mir ja nicht umsonst das MS Visual Studio 2005 zugelegt.
Der erklärt das schon was das ist und derzeit soll ich immer eine C++/CLI Consolenanwendung erstellen, was ich auch getan brav habe .Mir gehts in erster Linie um das verstehen was genau ich denn eigentlich mache. Lernen muss/will ich das hier :
Ist aus einem MS SDK zum Flugsimulator. Die habe ich bis jetzt in Delphi geschrieben , wie alles andere, will aber jetzt doch VC++ lernen weil dieses SDK auf .NET aufbaut. ( die weiteren Beispiele ) Auch so wollte ich mich endlich mal an C++ wagen da ich das bis jetzt immer vor mir hergeschoben habe.Also so sieht z.B. so ein Beispiel aus :
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #include "SimConnect.h" HANDLE hSimConnect = NULL; void testOpenClose() { HRESULT hr; if (SUCCEEDED(SimConnect_Open(&hSimConnect, "Open and Close", NULL, 0, 0, 0))) { printf("\nConnected to Flight Simulator!"); hr = SimConnect_Close(hSimConnect); printf("\nDisconnected from Flight Simulator"); } else printf("\nFailed to connect to Flight Simulator"); } int __cdecl _tmain(int argc, _TCHAR* argv[]) { testOpenClose(); return 0; }
#ifndef _SIMCONNECT_H_ #define _SIMCONNECT_H_ #pragma once #ifndef SIMCONNECT_H_NOMANIFEST #if _MSC_FULL_VER >= 140040130 #ifdef _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' " \ "name='" "Microsoft.FlightSimulator.SimConnect " "' " \ "version='" "10.0.60813.5" "' " \ "processorArchitecture='x86' " \ "publicKeyToken='" "67c7c14424d61b5b" "'\"") #endif #endif #endif //SIMCONNECT_H_NOMANIFEST #ifndef DWORD_MAX #define DWORD_MAX 0xFFFFFFFF #endif #include <float.h> typedef DWORD SIMCONNECT_OBJECT_ID; //---------------------------------------------------------------------------- // Constants //---------------------------------------------------------------------------- static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument. . . . .
Also was ganz genau ist das denn nun ?
Was genau ist denn der Unterschied zwischen den verschiedenen sprachen ?
Matthias
-
Wie gesagt, deine jetzt wieder geposteten Beispiele sind nicht mal C++ und erst Recht kein C++/CLI. Es ist C!
Der MS Flightsimulator ist aufgrund seines Alters bestimmt kein .NET-basiertes Spiel. VC++ 2005 ist auch eine IDE mit der man C, C++ und C++/CLI entwickeln kann.
Da man von ISO-C++ aus auch C-Schnittstellen ansprechen kann, ist es empfehlenswert ISO-C++ zu lernen. C++/CLI bringt dir hier keinen nennenswerten Vorteil.
Die Unterschiede zwischen den Sprachen zu eklären ist hier sinnlos, weil du da blos unter http://de.wikipedia.com nachschlagen brauchst. Da werden die drei Sprachen beschrieben.
-
Hallo,
also so alt ist der Flusie nicht !!
Ist die Beta vom FSX...und der kommt erst noch rausNa gut, dann ist das also C...weiss ich das jetzt erst mal genau .. danke !!
Warum diese beispiele wie du sagst schlecht sind kann ich nicht beurteilen.Ich weiss nur das die erst vor kurzem DIREKT von den MS-Leuten entwickelt worden !!
Und daran gibt es keinerlei zweifel !Matthias
-
Schlecht in dem Zusammenhang, das es laut deines ersten Postings C++-Beispiele sein sollten/könnten. Ich habe es daraufhin überspitzt dargestellt. Als C-Code ist es natürlich i.O. Aber wenn mir jemand sagen würde, er programmiert so C++, wäre es halt seeehr schlecht.
Der Flusi mag zwar erst noch erscheinen, aber MS wird nicht jede Version von Grund auf neu programmieren. Die werden immer wieder die letzte Version nehmen und diese wieder aktualisieren. Indirekt ist der Flusi also schon älter.
-
Hallo,
dank Dir für die Antworten.
Jetzt verstehe ich aber nicht waruzm die MS Leute C benutzen , denn das SDK ist definitiv ganz neu. Der Flusie Code mag teilweise übernommen und verbessert worden sein, aber das interface zum verbinden mit dem FSX ist definitiv ganz neu geschrieben !!Aber wir schweifen eigentlich ab ... was ist denn nun mit dem char typen ?
C++ schjeints ja nicht so wirklich mit Strings zu haben oder ?
In der ASCII Tabelle stehen werte von 0-128.
Jemand hat vorhin, weiss nicht ob du das warst , geschrieben ein char ist für genau ein Zeichen. Wie/warum kann dann aber ein char z.b. -127 annehmen ?und warum passiert folgendes :
#include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { char var; var = Console::Read(); Console::WriteLine(L"Var : {0}", var); return 0; }
"Var : 97 "
????
Warum das denn wenn char ein Zeichen ist ??
Matthias
-
Jetzt verstehe ich aber nicht waruzm die MS Leute C benutzen , denn das SDK ist definitiv ganz neu. Der Flusie Code mag teilweise übernommen und verbessert worden sein, aber das interface zum verbinden mit dem FSX ist definitiv ganz neu geschrieben !!
Und warum sollten die MS-Leute es nicht in C oder C++ weiter coden? C und C++ sind ausgewachsene Sprachen die sich bewährt haben. Nur weil es andere neuere Sprachen gibt, muß es nicht heißen, das sie diese benutzen müssen.
Zu deiner char-Frage: du solltest was Computer angeht von ganz vorne anfangen. Bei Computern sind 0 und 1 die Grundlage und somit auch Zahlenwerte. char ist intern immer ein Zahlenwert. Der Computer kennt in wirklichkeit keine Buchstaben.
Console::WriteLine ist eine .NET-Funktion. Warum diese char nicht als Buchstaben auf der Konsole ausgibt, kann ich dir nicht sagen. Da sind andere in Sachen .NET fitter. Jedenfalls ist es so, das eine Funktion/Klasse darüber entscheidet, wie etwas letztendlich auf dem Bildschirm oder Drucker ausgegeben wird. Aber intern ist alles trotzdem immer eine Zahl.
-
Hallo,
ok, sowas in der Art hatte ich mir auch gedacht, also das das irgendwie nur an der ausgabe auf der Console liegt, bzw. an der Art wie ein char ausgegeben wird.
Naja, es gibt ja auch die String^ Klasse. Die kann dann schon etwas besser mit Strings umgehen.
Ich wollte ja nur eine Bestätigung das ein Char, wenn ich ihm 10 zu weise auch 10 ist und wenn ich ihm -120 zuweise ist er halt -120. Nur auf der Konsole wird bei manchen Arten der ausgabe ( cout, Console::WriteLine ) ein Char anders ausgegeben .Ok, also danke ich dir !
MAtthias
-
STF-DIR schrieb:
Ich wollte ja nur eine Bestätigung das ein Char, wenn ich ihm 10 zu weise auch 10 ist
Wenn du
char c = 10;
schreibst, dann ist das ein Linefeed.
char c = '10';
trifft's eher.
Schau mal da rein: http://www.torsten-horn.de/techdocs/ascii.htm
MfG
GPC
-
Hallo,
danke für den Link...so meinte ich das auch und hatte ich das ja nun endlich auch verstanden.
Ich danke Euch also allen für die Hilfe !Matthias
-
Das FlightSim SDK hat in der Tat .NET Bindings, ich würd da aber weniger C++/CLI verwenden als C#. Die Sprache ist um einiges klarer, und wenn du mit C++ auch erst anfängst, dann wärst du mit C# besser dran.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Artchi schrieb:
C++/CLI ist offiziell eine C++-Erweiterung. C++ ist schon komplex genug, und als Anfänger sich auch noch C++/CLI aufzuhalsen ist echt mutig, wenn nicht sogar gewagt.
Deshalb vielleicht der Rat: suche dir ein Tutorial/Buch über ISO-C++. Wenn du das kannst, wird dir C++/CLI viel einfacher fallen.
Das ist absoluter quatsch, dass kann ich aus eigener Erfahrung berichten.
Ich glaub ihr quatscht alle nur das nach was man früher mal gesagt hat.Man hat auch mal gesagt, dass man erstmal C lernen sollte um dann C++ zu lernen.
Ich habe mein Fachinformatiker in C++/CLI gemacht und hab zuvor auch wenig C++ geschrieben.
Kannst Du mir mal sagen warum ich vorher cout lernen soll um später WriteLine benutzen zu können?!
Selbst die doppelt verkette Liste in ISO C++ in aufwendiger als in C++/CLI.
Ich kann in C++/CLI managend und unmanagend Code schreiben und dadurch lerne ich schon ISO C++, weil halt viele Sachen noch mit unmanagend Code gemacht werden.
Lerne C++/CLI und Du wirst sehen, dass Du zuvor nicht ISO C++ lernen musst, weil Du das zwangsläufig lernst.
Ich habe hier auch gepostet bevor ich mein Studium angefangen habe, wenn ich auf diese Antworten gehört hätte wäre ich wahrscheinlich jetzt immer noch mit QBasic beschäftigt.
Gruß, Sven
-
Nun, für Deinen persönlichen Lernfortschritt kann hier keiner etwas. Wenn man sich mit der Komplexen Welt von C++/CLI beschäftigt sollte man die Basis darunter verstehen.
In C++/CLI treffen zwei Welten aufeinander. Die Welt der Garbage Collection und in Unmanaged die Welt der eigenen Ressourcenverwaltung. Hättest Du Dich mal mit C++ bechäftigt würde Dir auffallen das es deutlich mehr ist als cout und cin.
Schau Dir mal Beiträge in diesem Forum an. Durch fehlende Grundlagen wird C++/CLI nicht verstanden. Es fehlt die Ahnung was Klassen sind. Man versucht über die Klasse auf Instanzmember zu zugreifen.
Hätte man sich vorher mal C++ angeschaut hätte man diese Probleme durchaus nicht gehabt.
Und warum verwendet man C++/CLI überhaupt ? Mir fallen da nur wenige Punkte ein.
1. Man hat zuvor alles in C++ gemacht und will das weiterhin machen (da ist man mit C++/CLI aber leider am falschen Fleck, speziell wenns mit dem Formdesginer zusammenhängt. :o( )
2. Man benötigt eine Schnitstelle von Managed zu Unmanaged. Diese muss aber sehr stabil laufen, also sollte man C++ in den Grundlagen schon kennen.C++/CLI wird man wohl primär da einsetzten wo man viel mit unmanaged Code zu tun hat. Hat man dann nicht verstanden wie man C++ verwendet, trägt man eine geladene und entsicherte Pistole in seiner Hose und wartet nur darauf sich in den Fuß zu schiessen.
C++ != cout. cout gehört zu einer Bibliothek die genormt für C++ zur Verfügung steht. Die STL zu kennen ist kein Fehler, vorallem wenn man viel unmanaged schreiben muss. Aber auswendig muss man diese natürlich nicht kennenn.
.Net ist aber ebenso eine Blibliothek für C++/CLI wie es die STL für C++ ist.
Jemand der nicht gewillt ist sich mal ein weilchen mit C++ zu beschäftigen weil er rein .Net verwenden möchte wäre in C# besser aufgehoben.
Die Praxis wird Dir die Worte auf dauer schon näher bringen.
-
Und weils noch nicht erwähnt wurde: Der C Code sieht mir verdammt nach WinAPI aus. Hat also nix mit schlechtem Code zu tun, oder wie auch immer das genannt wurde, sondern mit der Windows Programmierschnittstelle. Da hätten wir dann wieder den Vorteil von C++/CLI wo man die "alten" unmanaged Module mit neuem managed Code mischen kann.
-
Dappeljuh schrieb:
Und weils noch nicht erwähnt wurde: Der C Code sieht mir verdammt nach WinAPI aus. Hat also nix mit schlechtem Code zu tun, oder wie auch immer das genannt wurde, sondern mit der Windows Programmierschnittstelle. Da hätten wir dann wieder den Vorteil von C++/CLI wo man die "alten" unmanaged Module mit neuem managed Code mischen kann.
Wieso vorteil ? C++/CLI ist schlicht weg exakt für solche Dinge gedacht. Der Vorteil von nem Auto ist ja auch nicht, das es fahren kann ;o)