Zum Inhalt springen

Mr. Miyagi

Mitglieder
  • Gesamte Inhalte

    26
  • Benutzer seit

  • Letzter Besuch

  1. Sehr schönes Tool und Danke für die Antwort zu den Statics. Ist tatsächlich kein Überbleibsel meines Programms. Es greift noch ein anderer Prozess auf den Ordner zu. Ist es eigentlich überhaupt möglich, dass ich mein Programm komplett beende, es noch irgendwo Reste im Speicher „herum liegen“ und man deswegen den Ordner nicht löschen kann? Nur für den Fall, dass mal kein weiterer Prozess auf meine Programme zugreift und ich anfange zu rätseln.
  2. Tag alle zusammen, soweit ich das mitbekommen habe, werden statische Member einer Klasse oder Typen beim Start des Programms einmalig initialisiert, und können dann auch ohne eine Instanz des jeweiligen Objektes direkt aufgerufen werden (solange sie nicht protected oder private in dieser sind). Aber wann werden die Daten denn eigentlich wieder gelöscht ? Sind diese dann bis zum Programmende im Speicher, oder nur solange wie mindestens ein Objekt der jeweiligen Klasse existiert ? Was auch komisch wäre, da - wie oben erwähnt - sie ja kein Objekt der eigenen Klasse benötigen. Wenn ich z.B. versuche mein Projekt zu beenden und den Ordner zu löschen sagt mir Windows: „Die Aktion kann nicht abgeschlossen werden, da der Ordner in einem anderen Programm geöffnet ist.“ Hab ich da vergessen irgendwo Speicher wieder frei zu geben (verwende aber kein new *** in dem Projekt) oder hab ich was initialisiert, was ich vergessen hab wieder zu beenden? Danke für eure Hilfe.
  3. Das mit dem Überladen war ja meine erste Idee. Nur will ich nicht den gleichen Funktionsnamen mit unterschiedlichen Parametern nutzen, sondern mit den gleichen Funktionsnamen, die gleichen Parameter, nur mit unterschiedlichen Rückgabewerten. Einzige Möglichkeit wäre die Variante, für jeden Datentyp seine eigene Funktion zu schreiben und als Rückgabewert dann den richtigen Wert. Denke es geht auch nicht anders, und wenn dann nur mit aufgeblähtem Code.
  4. Also eigentlich kann ich den kompletten Code in eine Funktion schreiben. Hab es mal versucht und nun bläht sich das Programm nicht so im Arbeitsspeicher auf. Eigentlich kann ich nur abwägen zwischen einem langsameren Zugriff auf die Daten, dadurch das jedes mal abgefragt wird um welchen Typ es sich handelt, oder einen schnelleren Zugriff dadurch, dass die richtige Funktion je nach Parameter benutzt wird. Nachteil ist, dass ich für jeden Datentyp die Funktion erstellen muss. Denke aber das es einfach nicht anders gehen wird. Sieht dann ungefähr so aus. bla.h class bla { public: template <class T> T getValue(std::string Section, std::string Key) { T TheType; func(TheType,Section,Key); } private: void func(bool TheType,std::string Section,std::string Key); void func(int TheType,std::string Section,std::string Key); ... ... }; bla.cpp void bla::func(bool TheType,std::string Section,std::string Key) { ... } void bla::func(int TheType,std::string Section,std::string Key) { ... } ... ... Der Code benutzt jetzt keine Pointer oder Referenzen. Ist halt nur zur Veranschaulichung. Wenn ich aber so darüber nachdenke, ist das Template in der Form komplett überflüssig. Und eine Möglichkeit der Funktion "func()", einfach T als Parameter zu übergeben, funktioniert ja auch nicht. Ist ja schließlich kein Template. Oder gibt es da einen "Trick" das sowas doch funktioniert ?
  5. Tag alle zusammen, erstmal beschreibe ich die aktuelle Situation. Ich bastle zur Zeit einer Klasse, die eine Ini File (oder beliebige txt) einließt, sie dann parst und ihre Werte in eine static std::map schreibt. Nun soll der Benutzer Werte auslesen können, indem er ein Objekt der Klasse erstellt, den Abschnitt und Schlüssel als Parameter einer Funktion übergibt und dann einen Pointer auf den Wert in der static std::map zurück liefert. Genau da liegt das Problem. Jetzt könnte ich für jeden Datentyp eine Funktion schreiben die mir den richtigen Typ zurück liefert das würde die Klasse aber einfach nur unnötig groß machen. Die eleganteste Variante die mir dann dazu eingefallen ist, ist die Benutzung von Templates. Mit Templates will ich zum Beispiel folgenden Funktionsaufruf erreichen. if(cfg.getValue<bool>("WINDOWSETUP","bFullScreen")) { ... } Sollte mir nach Möglichkeit einen Pointer auf den Boolean Wert in der Datenstruktur zurück liefern, tut es aber nicht, weil ein „undefined reference“ Fehler erzeugt wird. Deklariere ich das ganze als Inline Funktion innerhalb der Klasse bläht sich der Code zur Laufzeit extrem auf. Das sagt mir zumindest die Prozessanzeige im Task Manager. Meine Frage also: Wie kann man ein Template in einer Klasse verwenden ohne den Code in den Header zu schreiben und ohne den „undefined reference“ Fehler zu erzeugen ? Danke Schon mal für die Antworten.
  6. Danke, Danke ^^ Wird die Favoriten-Liste wieder größer. Benutze den GCC Compiler und muss sagen ... ... Google findet eine Menge zu "Predefinied GCC Macros" Hab halt nur nach "Macro List C++" und sowas geguckt, aber bin nie auf predefinied gekommen. Danke noch mal.
  7. Hi an Alle, wie man wahrscheinlich an der Überschrift schon erkennt, suche ich so etwas wie eine Makroliste, am besten speziel für CodeBlocks C++. Mein Problem ist, dass ich ein Makro suche welches aussagt ob Windows benutzt wird oder Linux und je nachdem der passende Code ausgeführt wird. So wie in etwa: #ifdef BUILD_DLL #define ***MACRO*** ***CODE*** #endif Hab schon in der C::B Manual geguckt und gegoogelt, doch ich finde nichts. Wäre schön so eine Liste zu sehen. Danke schon mal im Voraus
  8. Hat sich schon erledigt. Habe in dem Projektordner einen Header zum DLL Export und einen für das Testen der Klassen und Funktionen. Habe die Klasse im Projektheader deklariert, aber in der Cpp-Datei den Header für den DLL Export noch zu stehen gehabt. Ist ja dann kein Wunder das die Klasse dann in der Cpp- Datei nicht erkannt wird. Na ja, war wohl gestern etwas blind auf den Augen. Danke euch ... Mr. Miyagi
  9. Der Sinn soll sein, dass man eine Art Mainheader hat, den man einbindet und dieser dann mehrere Klassen beinhaltet. Anstatt dann alle Klassen einzeln in sein Projekt einzubinden, soll man einen großen Header einbinden können. Damit man nicht alles in eine Cpp-Datei macht, gibt es einen Header und mehrere Cpp-Dateien dazu die dann die jeweiligen Funktionen enthalten. Habe gerade ein kleines Beispiel gemacht, aber das führt er ohne Probleme aus. Werde erst einmal weiter versuchen das eigentliche Projekt auch so zum laufen zu bekommen.
  10. Hi, wie der Titel schon sagt, möchte ich mehrere Klassen in einen Header unterbringen. Zum aktuellen Problem: Ich habe einen Header in den stehen mehrere Funktionen, die nicht teil einer Klasse sind. Innerhalb der Cpp-Datei befinden sich dann diese Funktionen. In der Cpp Datei selber befinden sich noch ein paar Funktionen die nicht im Header auftauchen, da man nicht auf diese zugreifen soll, wenn man den Header einbindet. Nun will ich eine Klasse hinzufügen ... Die Deklaration in der Header-Datei verläuft ohne Probleme, der Compiler meckert nicht und das Programm startet so wie es soll. Will ich nun aber in der Cpp-Datei den Constructor und Destructor hinzufügen, beendet das Programm mit der Compilermeldung: "Klasse" has not been declared" Ich hab sowohl den Header in die Cpp-Datei eingebunden (sonst würden die Funktionen davor schon nicht funktionieren), als auch den Namen der Klasse richtig geschrieben und auf Groß- und Kleinschreibung habe ich auch geachtet. Warum tut dann der Compiler trotzdem so als ob er die Klasse in der Cpp-Datei nicht kennt ? Danke schon mal im Voraus mfg Mr. Miyagi
  11. Hab es nun hinbekommen eine DLL-Datei zu erstellen und diese statisch einzubinden. Habe ein schönes Tutorial gefunden, dass alles ziemlich gut erklärt. Wer selber mal Interesse hat ... ... hier befindet sich das Tutorial. Danke für eure Hilfe und das ihr mich auf die DLL's aufmerksam gemacht habt. mfg Mr. Miyagi
  12. Hab mal im C::B Porjektordner geschaut und da legt er ja einen Ordner mit dem Namen Obj an. Dort sind dann *.o Dateien, welche ja compilierte Cpp Dateien sind. Da ich die selbe Dateiendung auch schon im lib Verzeichnis von C::B gesehen habe, dachte ich mir, dann kann ich ja einfach meinen Header in den Include Ordner packen und meine *.o Datei in den lib Ordner. Dann müsste ich ja nur noch im Linker die *o.Datei angeben und fertig. Es funktionierte aber wieder nicht. Es kam nur wieder der Fehler: Von dll Dateien habe ich absolut keine Ahnung. Hab mich da mal ein wenig eingelesen und würde auf anhieb entscheiden, wenn ich es denn so mache, eine statische dll zu erstellen. Erscheint mir persönlich einfacher. Also hab ich versucht in C::B ein neues dll Projekt zu erstellen. Da ist aber eine Menge Code den ich nicht verstehe. Wäre also nett wenn mir mal jemand den Code unten genauer erklären kann. Erstmal der Header der automatisch erzeugt wird. #ifndef __MAIN_H__ #define __MAIN_H__ #include <windows.h> /* To use this exported function of dll, include this header * in your project. */ #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif void DLL_EXPORT SomeFunction(const LPCSTR sometext); #ifdef __cplusplus } #endif #endif // __MAIN_H__ Hier die Main.cpp die automatisch erzeugt wird. #include "main.h" // a sample exported function void DLL_EXPORT SomeFunction(const LPCSTR sometext) { MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful } Was mir schon mal gar nicht gefällt ist, dass in dem Code viel zu oft Windows auftaucht. Deswegen wollte ich auch wissen ob man (außer in dem Beispiel) Windows weglassen kann. Wenn nicht: Gibt es eine Alternative zu den dll's die plattformunabhängig ist ? Noch ein Problem: Wenn ich auf Compilieren gehe kommt eine Fehlermeldung die sagt: "You must select a host application to run a libary ..." Geht man auf "Project->Set Programs' Arguments" kann man die host application auswählen, aber wozu braucht das Projekt eine *.exe um meine dll zu erstellen? Wenn ich dann dort eine beliebige *exe hinzufüge kommt aber wieder ein Fehler der dann sagt: "Execution of '"Test.exe" ' in 'C:\... DLLTest' failed." Übrigens habe ich dann im bin Verzeichnis trotz den Fehlermeldungen die Test dll zu stehen. Meine Fragen zusammen gefasst. Wie erstelle ich eine dll Datei und worauf muss man achten? Ist eine dll plattformunabhängig benutzbar? So das ist dann wieder eine kleine Geschichte hier, aber dafür beschreibt es mein Problem ausführlich. ^^ mfg Mr. Miyagi
  13. Es funktioniert. Es hat tatsächlich am dem undefinierten Pointer gelegen. Den Satz vergess ich definitiv nicht. ^^ Dann bedanke ich mich nochmal für eure guten Tipps und die Hilfe. mfg Mr. Miyagi
  14. Wie mache ich das dann mit meinen eigenen Headern? Ich will ja möglichst nur den Header deklarieren und dann gleich loslegen. Also ein Rundum-sorglos-Paket. Muss ich dafür eine eigene Bibliothek erstellen die in den lib Ordner kommt?! Wenn ja, woher weiß dann der Header wo diese ist ?! Irgendwie müssen ja die Header wissen woher sie ihre Daten bekommen.
  15. Das ist nur 1,6 MB groß weil die SDL Bibliothek noch beiliegt. Ich wollte ja nur das Gesuche nach den Dateien vermeiden. Ja ehm. Wenn der Zeiger nicht richtig ist ... was dann? Wie muss ich das denn richtig initialisieren? Ich hoffe mal das der Fehler darauf beruht, aber wenn ich eine Klasse genauso aufrufe die nicht SDL verwendet dann geht das trotzdem.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...