C++ Modulprinzip
-
@trequ
1. "stdafx.h" gehört nicht zum Standard (auch wenn's so aussehen mag) und ist irgendwas Microsoft spezifisches (im MFC oder WinAPI Forum findest du sicherlich mehr Infos dazu) - mein Tipp, schalte die vorkompilierten Header in den Projekteinstellungen ab
2. Aha.
3. kann deinen Problemcode leider nicht finden
4. Es gibt in C++ 2 Arten von Quellcodedateien, erstens die Übersetzungseinheiten (.cpp), welche dann letztendlich compiliert werden, und zweitens die Header (.h). Header werden nicht compiliert, sondern wie HumeSikkins schon sagte, vom Präprozessor in die Übersetzungseinheit eingebunden. Bildlich musst du dir das so vorstellen, dass die #include Anweisung vor dem Compilieren durch den kompletten Inhalt der Header per Copy & Paste ersetzt wird. Und da Übersetzungseinheiten sowieso compiliert werden, ist es keine sinnvolle Idee, diese in #include Anweisungen zu verwenden. Warum braucht man nun Header? Nun, so schnell kann man diese Frage nicht beantworten. Punkte dabei sind sicherlich die geringere Schreibarbeit und die Vermeidung von Inkonsistenzen. Stell dir vor, du brauchst eine Klasse in mehreren Übersetzungseinheiten. Du könntest natürlich in jeder Übersetzungseinheit die Klassenschnittstelle definieren. Wenn du daran aber was änderst, dann musst du das auch überall abgleichen. Oder du definierst die Klasse in einer Header und inkludierst diese dort wo du's brauchst. Was ist wohl sinnvoller? Es gibt aber noch mehr Gründe für die Notwendigkeit von Headern. In diesem Zusammenhang solltest du dir auch mal den Unterschied zwischen Deklaration und Definition anschauen.trequ schrieb:
Wenn man ein Visual C++ 6 Projekt mit Visual C++ .NET öffnet und Dateien anfügt, wird die .dsp oder die .dsw irgendwie nicht geändert...
Das ist nicht verwunderlich, da VC++ .NET .dsw und .dsp nicht mehr benutzt. Die relevanten Dateien sind .sln (Solution) und .vcproj (Projekt).
-
Hallo,
groovemaster schrieb:
3. kann deinen Problemcode leider nicht finden
Verstehe ich nicht.
Hier ist das BuildLog:
http://www.pctex.de/buildlog.htm
Ich habe das zip jetzt nochmal geändert.
Bei mir gibt es immer Fehler, weil die Datei DriveInfo.cpp nicht in das struct, welches in DriveInfo.h definiert ist, schreiben kann.mfg
trequ
-
Lass die Vorkompilierten Header auf jeden Fall drin und nutze sie auch, da es nur nen Header ist, funktioniert das Programm auf jedem anderen Compiler auch (sofern du halt nix Compilerspezifisches drin hast, etc.) und unter dem VC sparst du dir das ständige neuübersetzen der Header, also ruhig die Header die viel verwendet werden da rein packen.
-
Hallo,
So langsam bezweifle ich meine Entschluss, C++ zu lernen.
Ich habe inzwischen in 5 Foren die Frage gestellt, wie ich in einer externen Datei Funktionen eingebunden kriege.
Ich kriege viele tolle Ratschläge, welche alle mein Problem nicht lösen und sich mit ganz anderen Themen beschäfigen. Was interessiert mich ein Vorschlag zu irgendeiner Speicherersparniss?
Solange ich mein Programm nicht mal dazu kriege, dass es sich ausführen lässt, kann ich mir diese Vorschläge *** *** ****** *******.Ist das so ein riesiges Problem???
Es kann doch nicht sein, dass mir keiner sagen kann, warum das Zip-File nicht kompiliert...Ich kann mir nicht vorstellen, dass ich ein Programm in eine einzige Datei packen muss...
Ich kriege ich den ganzen Foren lauter Ratschläge (gegen die ja nix einzuwenden ist), welche allerdings mein Problem nicht lösen...
Eingentlich wollte ich über das Wochenende an dem Programm weiterschreiben...
Toll! Ich hätte meine Zeit auch besser verwenden können. *kotz*
Ich überlege ernsthaft, ob ich morgen anfangen soll, das Prog in Perl nochmal neu zu schreiben...mfg
trequ
-
Ich kann das nicht testen da ich kein VC++ habe, aber warum bastelst Du nicht einfach mal ein funktionierendes Minimalbeispiel?
Wenn Du die Basics dann verstanden hast, kannst Du ja auch Dein bestehendes Programm fixen.
-
trequ schrieb:
So langsam bezweifle ich meine Entschluss, C++ zu lernen.
wenn du C++ lernen willst, dann solltest du sinnigerweise mit konsolenanwendungen anfangen. die MFC ist wirklich grauenhaft und erschwert das ganze eh noch enorm (vorallem, wenn man deine fehler im code suchen soll). und in deinem program hatte ich so einige sachen gesehen (zb. unterschiedliche funktions-deklaration und definition etc.), die darauf schliessen lassen, dass du lieber mit "hello world" anfangen solltest.
C++ ist schwierig, mal eben ein programm zusammenwürfeln geht da leider nicht.
-
nman schrieb:
Ich kann das nicht testen da ich kein VC++ habe, aber warum bastelst Du nicht einfach mal ein funktionierendes Minimalbeispiel?
Wenn Du die Basics dann verstanden hast, kannst Du ja auch Dein bestehendes Programm fixen.Sorry, jetzt verstehe ich gar nix mehr...
Was ist das den bitte?
1. Projekt -> Neu -> c++ - MFC Anwendung
2. Dem Projekt hinzufügen -> CPP Quellcode Datei
3. Dem Projekt hinzufügen -> H Header DateiUnd dann habe ich vieleicht noch 10 Zeilen Code reingeschrieben.
Für mich ist das eine Minimalversion.
Ich werde jetzt nicht anfangen, irgendwelche sinnlosen Konsolenprogramme zu schreiben, die mir dann gar nix helfen.
Ausserdem sind bei den Konsolenprogrammen die ganzen Datentypen wieder anders...mfg
trequ
-
1. Projekt -> Neu -> c++ - MFC Anwendung
mach daraus ne konsolenanwendung, dann lernste wenigstens was. DIe MFC ist ein vc++ spezifischer riesen-hack, da lernt man wenn dann nur, wie mans nicht machen sollte
Ich werde jetzt nicht anfangen, irgendwelche sinnlosen Konsolenprogramme zu schreiben, die mir dann gar nix helfen.
was willst du denn eigentlich? programmieren lernen oder irgendein obercooles h4xx0r programm? wenn du letzteres willst, kannste im internet suchen, gibts bestimmt schon alles irgendwo zum download.
Wenn du ersteres willst: lern erst kriechen, dann laufen! du fällst so schon oft genug auf die schnauze, musst das nicht auch noch extra provozieren.Ausserdem sind bei den Konsolenprogrammen die ganzen Datentypen wieder anders...
nur dass das die standarddatentypen sind..und nur so ca 15 an der zahl(bool,char,short,int,float,long,double+unsigned versions+long versions) die kann man sich schon merken
-
@trequ
Keine Ahnung, was du für Probleme hast. Aber wenn ich mir dein buildlog anschau, dann sagt dir doch der Compiler ganz genau, was falsch ist. Übrigens, haben Compiler 'ne Fehlerdoku, du kannst ja mal googeln, dann findest du sicher auch was für C2065 und C2228. Solltest du das nicht verstehen, dann ist es vielleicht wirklich besser, sich erst mal mit den Grundlagen zu beschäftigen.btw:
Tod += MFC;
Wenn du was aktuelles haben willst, dann nimm .NET + Managed C++ oder zB das plattformunabhängige wxWidgets.
-
Auf JEDEN Fall erst die Grundlagen lernen (zumindest über Modularisierung), bevor du's dir antust, MFC zu benutzen. Aber pass mal auf, mach' es mir ganz genau nach, wenn du mit VC++ arbeiten willst:
1. Neues Projekt, bitte ein LEERES Projekt OHNE MFC
2. Dann eine neue Datei hinzufügen, deiner Headerdatei (die dann ganz eer sein müsste, ohne irgendeinen VC++-Schnickschnack
3. Dort schreibst du die Definitionen deiner Funktionen hin, also nur Prototyp, ohne Implementierung
4. Dann legst du eine neue cpp-Datei an (wieder Datei->Neu), wieder LEER, dann bindest du die Header ein und implementierst dort deine Funktionen
5. Nun kannst du weitere cpp-Dateien anlegen und überall, wo deine Funktionen gebraucht werden, inkludierst du deine Header UND SONST NICHTS, denn dann kennt der Compiler die Deklarationen. Beim Linken wird dann über VC++ automatisch das Modul deiner Funktionen (der kompilierte Code aus der Funktions-Cpp) hinzugelinkt
6. Das müsste dann funktionieren - Ganz ohne irgendwelche vorkompilierte Header oder sonstige Optimierungen, die für Anfängersind!
OK?
Hier ein Beispiel:
// func.h - hier sind deine Deklarationen #ifndef _FUNC_H_ #define _FUNC_H_ int add(int a, int b); #endif // das wars schon
So, nun die Implementierung
// func.cpp - hier sind die Implementierungen #include "func.h" int add(int a, int b) { return (a+b); } // fertig!
So, dieses Modul (die cpp-Datei) wird getrennt von anderen Modulen kompiliert. Wenn jetzt ein anderes Modul diese Funktion benutzen will...
// main.cpp - Hauptmodul #include "func.h" int main() { int number1 = 5, number2 = 3; return add(number1,number2); } // fertig
dieses Modul bruaucht nun NUR die Headerdatei zu inkludieren (damit der Compiler weiß, wie die Funktion aussieht und dass es sie überhaupt gibt), nachher beim Linken linkt der Linker (viele L's...) das Funktionsmodul an das Hauptmodul und er erkennt, dass die Referenzen durch das Headerfile durch das kompilierte Modul bestätigt werden - so einfach.
Wenn jetzt was nicht klappt, sag' es mir und bedenke - LEERE Projekte, KEINE MFC, KEINE Optimierungen, ok?