Visual C++ als Java Programmierer



  • Vielen Dank, damits gings! 🙂

    Ich benötige gerade eine Hashtable/Hashmap und leider liefert die C++ Standard Library keine Hashtable. Jetzt habe ich nach 2 stündiger Suche die STLPort Library gefunden und runtergeladen. Gibt es noch einen einfacheren Weg als externe Libraries zu nutzen? Oder habe ich etwas in der Standard-Library übersehen und sie bietet doch eine Hashtable an?

    Vielen Dank!



  • Eine Hashmap gibt es bisher nur im TR1 (eine Erweiterung zur StdLib, diese ist aber erst ab C++2009 mit in der StdLib fester Bestandteil), und schimpft sich std::tr1::unordered_map. Eine TR1-Implementierung wirst du aber eher nicht in deiner Infrastruktur haben, vermute ich (außer ihr habt eine eingekauft). Der MSVC hat aber noch eine stdext::hash_map . Die kann man immerhin in MSVC-Projekten nutzen.

    STLport benötigst du nicht, da der MSVC schon eine komplette StdLib-Implementierung mitbringt. Die STLport ist nur für Compiler gedacht, die keine komplette StdLib mitbringen oder jemand wirklich auf STLport schwört.

    Klar muss man die Grundlagen lernen. Aber in keinen in dem mir vorliegenden Bücher fällt z.B. ein Wort über vector. Was helfen einen tausende Seiten über OOP, MFC, ActiveX, Threads usw., wenn man einfach nur eine Datenstruktur sucht.

    Nochmal: das sind nicht C++-Grundlagen!!! MFC, ActiveX usw. sind spezielle Technologien von einem Hersteller, die zufällig mit C++ programmiert werden können. Besorg dir ein C++-Grundlagenbuch, wo C++-Grundlagen (z.B. die offizielle C++ Standard Library) vermittelt werden.

    Aber mit Strg+Umschalt+F werden bei Netbeans die imports vollautomatisch eingetragen. Da würde "Vector" auch ohne import-Anweisung gefunden und eingebunden. Somit reicht einem der Klassenname im Grunde immer aus.

    Und? Du gibts vector ein... schön, wie bist du auf "vector" gekommen? Weil das mal in einem Java-Tutorial/Buch drin stand, oder? Und hast du ein C++-Tutorial/Buch gelesen? Nein. Wenn du aber in die Index-Suche von der MSDN "vector" eingebenen hättest, hätte er dir std::vector mit Header-Info gezeigt. Und ich wette, auch wenn man nur vector und dann Strg+Space im Sourceeditor eingibt, zeigt er einem Vector an. Mit Grundlagenwissen, würde man auch ohne Referenz wissen, der Header könnte höchstwahrscheinlich <vector> heißen. Weil das irgendwie immer in der C++-Standardlib so ist.

    Ich will dich nicht angreifen oder sowas, aber ich will dir nur deine Defizite klar machen. Weil du immer von Java ausgehst aber dich immer noch nicht in der C++-Welt befindest.



  • Beispiel: http://search.msdn.microsoft.com/search/Default.aspx?brand=msdn&query=vector+c%2B%2B&lang=en-us
    Einfach mal in der MSDN "vector c++" eingeben, und was kommt als Ergebnis? Eben! Das ist auch nicht schwieriger als in Netbeans. Und die MSDN ist bei jedem MSVC dabei und meistens auf dem PC installiert, man muß also nicht mal online gehen.

    Stdlib-Index: http://msdn2.microsoft.com/en-us/library/cscc687y(VS.80).aspx



  • Hallo!

    plizer schrieb:

    Nun habe ich einen neuen Job und bin gezwungen auf C++ mit MFC bzw. ATL/WTL umzusteigen.

    Setzt ihr wirklich beides zusammen im Projekt ein oder sollst Du Dich für eins entscheiden?
    Wozu wollt ihr die Bibliotheken (od. Framworks) genau einsetzten?
    Geht's nur um das GUI oder brauchst Du auch

    - Datenbankanbindung
    - IPC

    Ferner : spielt XML eine Rolle?

    Zu den Themen könnte ich was sagen.

    Grüsse

    *this



  • @Artchi: Vielen Dank für den umfangreichen Beitrag. Klar, ich denke, dass ich mich im Moment etwas schwer tue, liegt auch vor allem daran, dass ich mir überlege wie ich etwas in Java machen würde und dann eine Lösung für C++ suche. Das ist ja so eigentlich nicht fair (weil man umgekehrt wahrscheinlich auch nicht viel finden würde), habe aber so wenigstens einen Anhaltspunkt (den vector gabs ja dann sogar namensgleich).
    In Java kann ich im Grunde zu jeder Zeile sagen, wofür die genau da ist. In C++ scheint es mir komplizierter, weil mir auch hier auf der Arbeit meist keiner sagen kann warum jetzt gerade vor einer Klasse _NL.... (weiss nicht mehr genau wie das hieß) steht. Z.B. habe ich bis jetzt nicht verstanden, warum manchmal ein _ oder __ vor irgendwelchen Variablen stehen. Dazu kommen natürlich die ganz unterschiedlichen Fehlermeldungen. Wenn man längere Zeit in einer Programmiersprache programmiert, bekommt man natürlich ein umfangreiches Wissen über Fehlermeldungen und sieht auch bei verwirrenden Fehlermeldungen, was das Problem ist. Bei den meisten Fehlermeldungen stehe ich im Moment einfach auf dem Schlauch und kann mir nur schwer selbst schnell weiterhelfen. Leider habe alle meine Freunde/Bekannte die programmieren keine Ahnung von C++ (meist Java-Entwickler, Delphi oder C#) und gerade bei kleinen Problemen ist es oft eine Sache von Sekunden, wenn man weiss wie es geht!

    Ich bin auf der Suche nach guten Grundlagenbüchern für C++. Könntest Du mir da welche empfehlen? Ich habe im Moment Inside Visual C++ 6.0 und Visual C++ 6.0 von bhv da, aber da wird ja mehr zusammengeklickt als grundlegende Dinge erklärt.

    Ich habe allerdings schon ein interessantes Online-Buch gefunden: http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf Das scheint schonmal recht ordentlich zu sein!

    Werde wohl demnächst mal ins Java-Forum schauen, vielleicht kann ich da ja auch ein wenig helfen, wenn einem hier so gut geholfen wird.

    @Gast++
    Es wird eigentlich mit ATL/WTL gearbeitet, Datenbankanbindung und OPC Server kommt demnächst auch noch. Der Hauptprogrammier, der 13 Jahre Entwicklungen unter C++ durchgeführt hat, ist gegangen und hat nur sehr viel hinterlassen. Da heisst es einarbeiten und da verliert man schnell den Überblick...

    Schöne Grüße,
    plizer



  • Ich weiß wie das ist, da ich selber beruflich Java programmiere (zur Zeit ein eigenes Framework auf Eclipse/OSGi-Basis für ca. 40 Java-Projekte, die auf dieses Framework migrieren werden), und ich kenne den Unterschied Java und C++. Eben gerade deshalb will ich nicht salopp sagen "naja, ist ein wenig anders.". Nein, das ist es ja nicht, sondern es ist ganz anders. Man muß wirklich im Kopf einen Schalter umlegen.

    weil mir auch hier auf der Arbeit meist keiner sagen kann warum jetzt gerade vor einer Klasse _NL.... (weiss nicht mehr genau wie das hieß) steht.

    Das hat z.B. keine Gründe in der C++-Sprache. Da wird irgend einer lustig gewesen sein, und wollte die Dinger _NL am Anfang benennen. So einfach ist das. 😉

    Z.B. habe ich bis jetzt nicht verstanden, warum manchmal ein _ oder __ vor irgendwelchen Variablen stehen.

    Ein "normaler" Programmierer braucht keine Unterstriche am Anfang oder Ende anwenden. Ganz im Gegenteil: zwei Unterstriche am Anfang und Ende eines Bezeichners (meist Makros) sind sogar ausschliesslich den Compiler-Herstellern vorbehalten. (ist im C und C++ Standard eine offizielle Regel) Du als Anwender des Compilers oder der Std-Lib solltest also eher nicht solche Namen vergeben (ein Unterstrich ist allerdings erlaubt, aber nicht Prflicht!).

    Bei den meisten Fehlermeldungen stehe ich im Moment einfach auf dem Schlauch und kann mir nur schwer selbst schnell weiterhelfen.

    Du hast mit dem MSVC und der MSDN eines der mächtigsten C++-Tools an der Hand. Wenn z.B. der Compiler oder Linker einen Fehler ausspuckt, und du diesen nicht verstehst, schau in die MSDN nach! Die Fehlermeldungen haben immer einen Code (C2009 oder LNK2097 u.ä.) den man nur in den MSDN-Index hauen braucht und schon gibts eine ausführliche Beschreibung.
    Das hast du eigentlich in fast keinem anderen C++-Entwicklungssystem, hier muß man einfach MS loben, auch wenn die angeblich schlechte Produkte haben. Aber Devtools können die.

    Wenn man einen Fehler bekommt, versucht man ihn systematisch zu beheben. Manchmal lösen sich auch mehrere Fehler durch eine einzige Fehlerbehebung auf. Deshalb sollte man die Ruhe bewahren, wenn z.B. der Compiler 100 Fehlermeldungen ausspuckt. 😉

    Ich bin auf der Suche nach guten Grundlagenbüchern für C++. Könntest Du mir da welche empfehlen? Ich habe im Moment Inside Visual C++ 6.0 und Visual C++ 6.0 von bhv da, aber da wird ja mehr zusammengeklickt als grundlegende Dinge erklärt.

    Da kann ich das von Ulrich Breymann empfehlen: http://www.oop-mit-cpp.de/
    Für den Buchumfang und auch die Qualität ist es auch günstig. Wer solch ein Buch nicht gelesen hat (ich meine nicht dieses eine spezielle, sondern die Art), hat kein richtiges C++ gelernt. Das Breymann-Buch vermittelt sehr gutes C++ und auch die Standardlibrary. In der aktuellen neu erschienen Ausgabe wird sogar auf den nächsten C++-Standard eingegangen, was ich sehr gut finde. Denn andere Bücher schaffen es nicht mal richtig den aktuellen C++2003-Standard zu vermitteln.
    Die von dir genannten VC6-Bücher sind meistens die jenigen, die keine ISO-C++-Basics vermitteln, sondern speziell die MFC und die IDE. Sowas sollte man eher nach den C++-Basics machen.

    Ich habe allerdings schon ein interessantes Online-Buch gefunden: http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf Das scheint schonmal recht ordentlich zu sein!

    Kennen ich nicht, aber nach einem Überfliegen als Ergänzung sicherlich eine gute Lektüre. Aber es behandelt z.B. am Anfang keine C++-Basics sondern wieder spezielle Themen, wie Corba. Hat mit C++-Basics nichts zu tun.

    Werde wohl demnächst mal ins Java-Forum schauen, vielleicht kann ich da ja auch ein wenig helfen, wenn einem hier so gut geholfen wird.

    Geholfen wird auch im C++-Forum (das hier ist das MFC-Forum, also wieder sehr speziell).



  • plizer schrieb:

    Es wird eigentlich mit ATL/WTL gearbeitet
    [...]
    -Datenbankanbindung und OPC Server

    Zu ATL/COM kenne ich kein besseres Buch als

    Dr. Richard Grimes
    "Professional ATL/COM-Programming"
    Wrox Press(?)

    Das ist zwar alt aber exzellent!

    Das "?" steht da weil ich mir nicht sicher bin dass sie's noch verlegen; zur Not kann man sich aber durchaus an den Autor wenden; Dr. Grimes hat mir mal sehr freundlich auf eine Frage nach Bezugsquellen geantwortet.

    Sinnvall für den Umgang mit ist der ATL ist es sich zunächst mal ein kleines "COM-Treiberprogramm" zu schreiben; das meint hier ein Programm dass nur ein COM-Interface instanziiert und mitttels dessen man mal testet wie man z.B. mit Standardkomponenten umgeht.

    Da bieten sich die MDAC-ADO Komponenten zum DB-Zugriff und der Microsoft XML-Parser an.

    In einem Thread des Benutzers "M@tt" hatte ich mal einen solches kleines Treiberprogramm mit etws COM-XML Handling gepostet, leider finde ich das nicht mit der Suchfunktion; er selbst müsste es aber noch haben.

    War aber auch letztlich auch nur dem o.g. Buch entlehnt; es gibt die Codebeispiele auch irgendwo zum Download.

    Mit dem ATL (NICHT WTL) Wizard kann man sich auch mal auf einfachste Art einen NT Dienst erzeugen. Dem sollte man dann ein Interface hinzufügen (Wizard) und sich den erzeugten Code mal anschauen; mit der Kontexthilfe kommt man zu vielen interessanten MSDN-Beiträgen.

    Grüsse

    *this

    P.S.:
    BSTRs sind wichtig; z.B.:
    http://www.codeproject.com/string/cppstringguide2.asp; ein Wrapper heisst "_bstr_t"

    VARIANTs sind auch wichtig; ein Wrapper heisst "_variant_t"



  • In der MSDN sind auch gute ATL-Tutorials. Bin der Meinung sogar auf deutsch. Jedenfalls richtig mit Step-by-Step, ziemlich idiotensicher. Mit dem ATL-Wizard kommt man sogar sehr gut voran. Man sollte aber immer im Hinterkopf behalten, das ATL MSVC-spezifische Schlüsselwörter benutzt. Für die ATL-Entwicklung sehr nützlich, aber nicht das man denkt, das es zu ISO-C++ gehört.

    Für die WTL wiederrum gibt es wenig gute Dokumentation. Da muß man sich bei Codeproject.com oder wtl.sf.net umschauen. In der WTL-Group von Yahoo ist eine sehr aktive Community die einem weiter helfen kann.



  • Wieder danke für die ausführlichen Antworten.

    Ich habe mir die neueste Auflage von dem C++ Buch von Ulrich Breymann bestellt, sollte also morgen da sein. Das Buch hat auch wirklich exzellente Bewertungen bekommen. Dann habe ich in den nächsten Tagen/Wochen eine gute Nachtlektüre! 🙂

    Ich habe nur irgendwie im Hinterkopf, dass ich ja hier eingestellt worden bin und bezahlt werde, um zu produktiv zu programmieren, was derzeit nicht wirklich klappt. Ich finde es selbst aber nicht besonders sinnvoll sich auf directX und ATL/WTL zu stürzen und versuchen etwas zusammen zu klicken, wenn man die Grundlagen nichtmal drauf hat. Man braucht dann viel zu lange und vor allem lernt man ja nie was man da dann eigentlich macht.



  • Ich habe nur irgendwie im Hinterkopf, dass ich ja hier eingestellt worden bin und bezahlt werde, um zu produktiv zu programmieren, was derzeit nicht wirklich klappt.

    Nur ruhig Blut! Eine gewisse Einarbeitungszeit muss man Dir schon zugestehen.



  • Thx an euch!

    Allerdings habe ich immer noch das Problem mit der Hashmap. Hab in der MSDN schon alles durchsucht danach, aber mein VC findet einfach den namespace stdext nicht. Wie komme ich da dran?



  • Welche MSVC-Version hast du?



  • Microsoft Visual C++ 6.0

    Unter Info und zusätzliche Informationen steht einmal Visual C++ 6.0 und darunter Visual C++ 6.0 Enterprise Edition!



  • 😮 😮 😮 Ach du heilige Sch****!!! Was ist das denn für ne Steinzeit-Version??? Die ist jetzt praktisch 10 Jahre alt.

    Ehm, ok... gaaaaaaanz ruhig bleiben! Keine Panik! Dann versuch mal die hash_map im std-Namespace und nicht stdext. Wenn das da auch nicht drin ist, hat vielleicht VC6 keine hash_map. Oder findet er wenigstens den Header?

    Dann darfst du nicht in die Online-MSDN schauen, weil die hauptsächlich ab MSVC7.1 los geht.



  • Na prima! Beim copyright steht auch 1994-1998! Kein Wunder, dass hier nix dabei ist. Wenn man ne 10 Jahre alte Java Version nimmt, würde das auch ganz anders aussehen ^^.

    Gibt es denn eine 100% abwärtskompatible Version von VC, die aktueller ist? Das könnte ich hier ja mal ansprechen. Weiss allerdings nicht wie teuer sowas ist, oder ob es auch freie Versionen gibt.



  • Also 100% abwärtskompatibel eigentlich nicht. MSVC6 war überhaupt nicht ISO-C++ konform. Ab MSVC7.1 (aka MSVC 2003) ist der Compiler zum Glück viel ISO-C++ konformer geworden. D.h. da wird es wahrscheinlich Fehler oder Warnings geben, die man aber sicherlich einfach beheben kann.

    Weiterhin hat sich auch die ATL und MFC weiter entwickelt und es gab auch hier Änderungen. Aber diese werden in der MSDN beschrieben. Ist nicht so, das man von MS im Regen stehen gelassen wird.

    Aber dafür gibts halt sowohl bessere C++-Sprachunterstützung, aktuellere Libs und Frameworks. Die IDE selbst hat sich auch geändert, wobei dieses sich erst in der MSVC2005 (8.0) richtig bemerkbar macht. Ab MSVC2003 gibts immerhin schon Docking, Auto-Hide-Fenster usw.

    Die Preise sind unterschiedlich. Wenn du die ATL und MFC brauchst, mußt deine Firma auf jeden Fall mind. die Standard-Edition kaufen (ca. 300 EUR, Upgrade ist billiger). Oder am besten auf die aktuelle Professional oder wie der Nachfolger der MSVS6 Enterprise heißt.

    Das einzelne MS VisualC++ gibt es nur noch bis 2003, ab 2005 kann man "nur" noch das MS VisualStudio kaufen (da sind dann aber alle Programmiersprachen drin, also C++, C#, VB.NET und J#).
    http://www.microsoft.com/germany/msdn/vstools/default.mspx
    Die Express ist zwar kostenlos, aber der fehlt die ATL und MFC (die man auch nicht nachrüsten kann!).



  • Achso ne, der findet da nichts, auch nicht im std!



  • VS 2005 Express ist kostenlos, da du aber MFC/ATL nimmst, bringt dir die nichts, weil das Zeug erst ab der Standardversion dabei ist(kostet um die 320 €)

    Mit abwärtskompatibel ist so ne Sache. Der VC 6 lässt einiges Sachen zu, die nicht standardkonform sind(altersbedingt^^)
    Wenn du also viel alten 6er Code hast und dieser viele solcher "Hacks" nimmt, müsstest du das alles anpassen.
    Ansonsten kommen auch oft viele deprictated warnungen.



  • plizer schrieb:

    Achso ne, der findet da nichts, auch nicht im std!

    Komisch. Findet er die Header <hash_map>??? Dann schau einfach da rein (ist ja auch nur ne Textdatei) und versuch das Template zu finden und in welchem Namespace es drin ist. (Ist für nen C++-Anfänger vielleicht nicht gerade ne einfache Übung)

    Ansonst probier noch das aus:

    std::ext::hash_map oder einfach nur hash_map.

    Wenn das alles nichts hilft: vorrübergehend std::map benutzen. Ist jetzt auch nicht gerade das langsamste. Haste wenigstens was zum Arbeiten.



  • Aso, dann ist das Ganzen mit dem Umstieg doch wieder problematisch. Da ich 13 Jahre VC Programme vererbt bekommen habe... Ich hoffe bei einem neuen Projekt findet ein Umstieg statt, obwohl natürlich große Komponenten immer wieder gebraucht werden.

    So langsam denke ich, dass ich doch besser nen Job als Java-Entwickler hätte aufsuchen sollen, allerdings nur aus dem Grund, weil ich vom anderen keine Ahnung habe und nicht weil ich meine dass es besser ist oder so.

    Ihr seid ja mal echt fix mit dem Antworten, das muss man euch lassen! 😉


Anmelden zum Antworten