Visual C++ als Java Programmierer
-
@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 ServerZu 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!
-
Artchi schrieb:
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.
<hash_map> findet er nicht. Ich werde aber mal die festplatte nach hash_map.h durchsuchen.
Bei std::ext::hash_map sagt er mir
'ext' : Ist kein Element von 'std'
Bei std::map kommt die gleiche Meldung, nämlich
'map' : Ist kein Element von 'std'
-
Naja, so ebend mal aus Jux das Projekt auf MSVC2005 umstellen ist sicherlich nicht gedacht. Man könnte aber z.B. die MSVS2005 Standard kaufen und sozusagen "nebenbei" das ganze evaluieren. Um dann sagen zu können "OK, das können wir vergessen" oder "Gut, das sind ja nur kleinere Änderungen, das können wir machen.".
Denn es ist ja nicht so, ds wenn du deine VC6-Projektmappe nach MSVS2005 importierst, du in jeder Codezeile einen Error bekommst. Es wird sich auf spezielle Stellen eingrenzen.
Ich hatte mal ein MFC6-Projekt nach MFC7.1 migriert. Das einzige was ich ändern mußte, war die CString-Klasse, weil die sich von der MFC in die ATL verschoben hat.
An manchen Stellen mußte ich ne for-Schleife abändern, weil sie der Scope geändert hat.
Am Ende kann sich das aber schon rentieren. Weil auch die Produktivität des Entwicklers besser wird. Und wenn der Kunde z.B. eh WinXP-Rechner hat, kann man auch XP-Features nutzen usw.
Natürlich hängt es auch von den Ziel-Systemen ab. Also wo wird das Ergebnis eingesetzt? Ist es Inhouse? Oder geht das raus an die Kunden? Kann man sicherlich nicht übers Knie brechen.
Aber man sollte sich schon die Frage stellen: Wollen wir in 10 Jahren immer noch mit MSVC6 rumgurken? Klar, du mußt erstmal mit dem Projekt warm werden. Aber ich würde mir zumindest demnächst Gedanken dazu machen. Deinem Vorgänger war es entweder egal oder er wollte auch umsteigen, und durfte vielleicht nicht.
Realistisch gesehen sieht es ja so aus: MS hat den Support für MSVS6 schon längst eingestellt. Das hat schon seinen Grund.
Und sind wir ehrlich: es gab viiiiiieeeeeeele MSVC6-Kunden, und die haben irgendwann auch den Umstieg gewagt.
-
plizer schrieb:
<hash_map> findet er nicht. Ich werde aber mal die festplatte nach hash_map.h durchsuchen.
Na, dann brauchste auch erst garnicht hash_map versuchen zu benutzen. Ohne Header läuft in C++ nichts. Wäre so, als wenn in du in Java kein import hast.
plizer schrieb:
Bei std::map kommt die gleiche Meldung, nämlich
'map' : Ist kein Element von 'std'
OK, das ist ne harte Nuss. Die Map ist auf jeden Fall beim MSVC6 dabei, die habe ich damals selbst auch benutzt. Ich hatte aber auch immer das aktuelle Servicepack installiert. Würde ich auch mal schauen, welche SP du für MSVC6 installiert hast (weiß nicht ob man das im Info-DIalog sehen kann).
Wie hast du denn std::map benutzt? Hast du auch den Header <map> inkludiert?
Beispiel:#include <map> void foo() { std::map<int, int> mymap; }
-
Die entwickelte Software wird auch an Kunden rausgegeben! Und es sind zum Teil sehr große Projekte (bis zu mehreren Mannjahren). Mein Chef hat schon am Anfang gesagt, dass er nicht erwartet, dass ich schon nach 2 Monaten produktiv bin. Ich habe mir allerdings die Einarbeitung, die ein Kollege machen sollte, etwas anders vorgestellt. Ich habe jetzt einen riesigen Quellcode-Haufen vor mir liegen, der sich nicht compilieren lässt. Ich habe auch keine Ahnung was die Hunderten von Fehlermeldung zu bedeuten haben. Weiterhin sind die beiden Hauptentwickler, die vieles in den letzten 13 Jahren entwickelt haben, seit Ende April nicht mehr da. Das andere Problem ist, dass es zu dem Ganzen keine Dokumentation gibt und mir auch keiner weiterhelfen kann, weil die selbst nicht viel drüber wissen.
Kurzgefaßt: Schlichtweg überfordert und auch bisher keinen Plan, wie ich die Situation in den nächsten Wochen / Monaten ändern soll. Allerdings wird schon auf ein Programmteil gewartet...