Visual C++ als Java Programmierer
-
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...
-
Stimmt, Du hast Recht! <map> geht! Werd mir das dann mal genauer anschauen!
-
Ja, das man in einem neuen und bestehenden Projekt überfordert ist, geht jedem so. Aber man kann sich einarbeiten! Ich sehe das nur so, das dir die Basics fehlen. Z.B. warum brauche ich einen Header? Wie arbeitet der Compiler und Linker? Diese ganzen Sachen gibt es in Java nicht. OOP ist nur eine Fasette am C++. Deshalb ist es schon mal gut, das du das Breymann-Buch bestellt hast. Du solltest auch nicht die ersten Kapitel überspringen (ok, die OO-Einführung, was ne Klasse ist, vielleicht schon
). Weil am Anfang schon erklärt wird, wie man einen Compiler bedient. Die IDE versteckt viele C++-Konzepte (die man als Erfahrener auch nicht sehen muß). Aber ein Linker-Fehler ist z.B. kein Compile-Fehler. Wenn man das nicht sieht (Fehlermeldung genau lesen!) und nicht versteht, wird man den Fehler an der falschen Stelle suchen.
-
Die Devise ist wahrscheinlich wie immer: Immer weitermachen und nie aufgeben, was?
Aber stimmt, ich verstehe zuviele C++ Konstrukte nicht, Beispiel:
CGraph::CGraph(HWND hWnd) : CAxDialogImpl<CGraph, CAxWindow>(), m_ParenthWnd(hWnd) { }
Wenn ich mir das anschaue, denke ich folgendes: Es ist ein Konstruktor für die Klasse CGraph mit dem Parameter HWND hWnd.
Gedanke: Warum wird diese HWND groß geschrieben? Und h stand für handle, WND wahrscheinlich für Window? Also bekomme ich über den Parameter nen handle zum Window?
Danach kommt ein Doppelpunkt. Kenn ich aus Java nicht, aber ich habe gelesen, dass dies gleich die Zuweisung ist. Aber das in den eckigen Klammern krieg ich nicht so zugeordnet. Würde denken, dass ist ne Typdefinition, damit man weiss was reinkommt? Was auch verwirrend ist, ist das Komma und danach die Membervariable (und dazu hat ne Membervariable noch nen Parameter?!). Warum?Solche Zeilen gibt es in Programmen natürlich wie Sand am Meer. Nur wenn man dann zu einem Arbeitskollegen geht und nachfragt und der sagt, er hat auch keine Ahnung. Wie soll man das dann verstehen? Da bleibt mir ja nur übrig zu sagen, dass ich jetzt erstmal nur 3 Monate Grundlagen mache, weils so keinen Sinn hat.
Obwohl ich gerade merke, dass ich jetzt von der Zeile oben schon mehr verstanden habe als vor dem Posting
-
Die Zeile ist ganz normaler C++ Code. Steht alles im Breyman erklärt. OK, nicht HWND wird erklärt, aber z.B. was der einzeln stehende Doppelpunkt da zu suchen hat (hat was mit Vererbung zu tun, ist vergleichbar mit extend aus Java!!! Also eigentlich ganz einfach). usw. usf.
Du weißt praktisch nichts über C++.
Du mußt wirklich bei null anfangen. Aber vieles wirst du sofort verstehen, weil die Syntax nur anders ist. Aber es gibt auch vieles in C++, was es in Java nicht gibt. Also wirst du auch mehr lernen, was ja auch Spaß macht.
-
Mal in Java (in etwa, lässt sich nicht wirklich in Java abbilden):
public class CGraph extends CAxDialogImpl { CGraph(HWND hWnd) { super.CAxDialogImpl(); m_ParenthWnd = hwnd; } }
naja, so in etwa... WTL ist ein wenig crazy, wenn man keine Templates in Java abbilden kann.
-
Klar den Doppelpunkt bei C+ kenn ich wohl, aber nur bei Klassen! Im C++ Code war doch aber nur der Konstruktor dargestellt? Na auf jeden Fall freu ich mich auf das Buch, was ich gleich zuhause liegen haben sollte ;). Dann kommt vielleicht mal Licht ins Dunkel. Ich wusste ja schon vorher dass ich hier auch viel mit C++ zu tun haben werde, wollte diese Sprache auch noch unbedingt gerne lernen, da ich denke, dass es einfach zu einem guten Programmierer dazugehört.
Bis zur nächsten dummen Frage von mir
-
Ich hatte mal ein MFC6-Projekt nach MFC7.1 migriert.
Wir haben so ca. 200 Projekte von MFC6 nach MFC 8 migriert. Wie Archi schon schreibt, die Änderungen sind überschaubar. Bei uns waren es vor allem nicht Ansi-konforme for-Schleifen, implizite Casts und einige Projekteigenschaften. Allerdings haben wir bisher nicht auf Unicode umgestellt, weil Zeit und Bedarf fehlen.
Du hast dann wirklich bessere Möglichkeiten.
Aber wenn dein Chef sich quer stellt?
-
Ich habe nun ein Problem mit der map (wär hätte das gedacht).
#include <map> funktioniert. Daher bekomme ich auch keinen Fehler in der Quellcodedatei, wenn ich schreibe:map<string, string> mapDaten;
Allerdings bekomme ich 210 Warnungen, die insgesamt über 100 Seiten lang sind. D.h. der Start des Programms verzögert sich schon allein deswegen um 10 Sekunden.
Was ist an der Zeile verkehrt? Hier einfach einen kleinen Ausschnitt aus den Warnungen:
d:\msstudio\vc98\include\xtree(77) : warning C4786: '??Econst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAEAAV012@XZ' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
d:\msstudio\vc98\include\xtree(81) : warning C4786: '??Econst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAE?AV012@H@Z' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
d:\msstudio\vc98\include\xtree(84) : warning C4786: '??Fconst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAEAAV012@XZ' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
-
Sind eigentlich die Fehlermeldung in neueren Version auch so schwer zu verstehen? Ich hatte einmal einen Bezeichner genutzt, den er nicht gefunden hat. Aber anstatt zu sagen: "unbekannter Bezeichner" wurde ich von Fehlermeldung zugeschüttet und habe Ewigkeiten gebraucht, dass er einfach den Bezeichner nicht kennt. Und was auch nervt ist, dass das VC keine Fehler im Quellcode markiert. Man muss immer compilieren, um zu sehen, ob eine Zeile einen Fehler enthält.
-
Da dran ist nichts falsch, du nutzt einfach nur die STL.
Mach mal oben in die Headerdatei#pragma warning(disable : 4786)
Dann ist Ruhe.
Die Warnung ist auch nicht schlimm, das hier ist der Kern:
Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
Dem ist einfach eine Zeichenkette zu lang.
-
Hach ist das schön. von 210 auf 0
thx!
-
Das liegt an der alten MSVC6-Version. Weil die Debug-Infos nicht länger als 255 Zeichen lang sein dürfen.
In neueren Versionen ist diese Grenze (natürlich) aufgehoben, und dann gibts auch keine Warnings.
Und wie gesagt, die Warnings und Errors genau lesen:Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduzier
Ist zwar versteckt, steht da aber, warum das Warning kommt.
Fehlermeldungen sind bei Template-Fehlern auch in neueren Versionen immer besser, kürzer und verständlicher geworden. Zu Zeiten des MSVC6 waren Templates noch unbekanntes Terrain. Heute hat sich das ganze technisch weiter entwickelt, entsprechend entwickelt sich auch der MSVC weiter.
Ist halt eine alte Version die du da hast...
-
Und was auch nervt ist, dass das VC keine Fehler im Quellcode markiert. Man muss immer compilieren, um zu sehen, ob eine Zeile einen Fehler enthält.
Das ist eine etwas schwierige Angelegenheit. Weil C++ sehr komplex ist, kannst du froh sein, das wenigstens der Compiler den Code fehlerhaft erkennt.
Ist jetzt überspitzt dargestellt, aber kommt schon so in etwa hin. Auch ist das Buildsystem ganz anders als bei Java u.a. Sprachen.
ABER (und das habe ich glaube ich auf der ersten Seite des Threads gesagt!) solltest du dir VisualAssistX bestellen!!! Weil das macht Syntaxfehler-Erkennung on the Fly. Zwar nicht perfekt, aber immerhin versucht es und es funktioniert, dafür das C++ so komplex ist.
VisualAssist X hat aber noch mehr Features, vorallem ein besseres IntelliSense, Refactoring-Funktionen usw. Aber muß deine Firma halt mal ca. 115 EUR (je nach Dollarkurs) ausgeben. Lohnt sich!!! Dann kommt schon so Netbeans/Eclipse-Feeling auf.
-
Ich muss nochmal nerven!
Ich habe jetzt eine WTL Anwendung erstellt. Was ich jedoch nicht verstehe ist, dass die vorhandenen Steuerelemente die gleichen sind, unabhängig davon welche Oberfläche ich nutzen will. Müssten diese sich dann nicht unterscheiden? Oder werden die nur unterschiedlich behandelt? Zu WTL finde ich im Netz ja so gut wie keine Infos. WTL und Strukturansicht ergibt selbst in Google 0 Treffer! Ist das so unüblich? Oder sollte ich das Ganze besser nur in MFC schreiben. Da es ein selbstständiges Programm ist, könnte ich das wohl machen, auch wenn alles andere bisher in WTL geschreiben wurde.
Und noch ein kleines Problem. Wie kann ich nun Informationen zu z.B. der Klasse CDialog finden (für WTL oder MFC?!)? Ich habe schon die MSDN befragt und auch andere Seiten, aber ich bekomme einfach nicht raus welches #include ich brauche um diese Klasse zu nutzen. VC6.0 ergänzt zwar den Namen vollautomatisch (warum macht er das, wenn er die Klasse im Quelltext selbst aber nicht kennt?!) aber es sagt mir dann, dass die Basisklasse CDialog undefiniert ist.
Das C++ Buch von Breymann ist wirklich sehr gut geschrieben und dieses arbeite ich nebenbei durch, allerdings hilft es mir bei den Oberflächenproblemen natürlich nicht weiter.
Vielleicht erbarmt sich ja noch jemand auf meine Fragen einzugehen!
Vielen Dank!
-
plizer schrieb:
Wie kann ich nun Informationen zu z.B. der Klasse CDialog finden (für WTL oder MFC?!)? Ich habe schon die MSDN befragt und auch andere Seiten, aber ich bekomme einfach nicht raus welches #include ich brauche um diese Klasse zu nutzen. VC6.0 ergänzt zwar den Namen vollautomatisch (warum macht er das, wenn er die Klasse im Quelltext selbst aber nicht kennt?!) aber es sagt mir dann, dass die Basisklasse CDialog undefiniert ist.
Mach mal den Link auf: http://msdn2.microsoft.com/en-us/library/132s802t.aspx
Drück dann die Ende Taste, dass du den letzten Teil der Seite siehst.
Bei meiner 1200er Auflösung steht jetzt etwa auf halber Höhe unter "Requirements", welchen Include du brauchst.
Das findest du immer bei der Erklärung der jeweiligen Klasse.
Normalerweise muss man es allerdings nicht includen, wundert mich etwas.
-
Liegt es vielleicht daran, dass es ein WTL-Projekt ist und kein MFC?
Auf jeden Fall scheint CDialog schon eingebunden, da nach dem Einfügen von:#include <afxwin.h>
Die Meldung kommt:
fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>
-
Keine Ahnung, bei WTL muss ich passen.