Improved Console 4.0



  • Oh mist!
    Ich hab meinen Fehler, also in der 3.4 Version gab es ja noch die ic.h mit den namespaces. Ich hab schlicht und ergreifend vergessen, die namespaces zu setzen und schon überhäuft man mich mit Fehlern!

    Also die License.txt und Readme.txt würde ich unverändert in das Package mit einbauen, wobei ich die Changes noch mit der Readme.txt kombiniere, ok?



  • Wieso willst du die unbedingt kombinieren? Sehe keinen Sinn außer erhöhten Wartungsaufwand.

    MfG SideWinder



  • naja man hat bei den Packages einmal die Möglichkeit eine Lizenz und danach die Readme anzuzeigen und ich denke das wäre besser wenn die Änderungen mit zu sehen wären, oder soll ich die 3 Dateien License.txt, Readme.txt, Changes.txt alle drei nochmal extra mit kopieren, sodass man diese 3 Dateien jederzeit zur Hand hat?

    PS:
    Hab die IC am laufen, die Fehler lagen zum Teil auch an den geänderten Funktionsnamen getMaxSizeX->getMaxWndSizeX() und solche Späße!



  • Ich bräuchte ein Paar Angaben:

    Kann man als kleine Beschreibung der Library den folgenden Text nehmen:

    Ein Framework, welches den Konsolenteil der WinAPI kapselt und so eine leichteren Zugriff auf selbigen gibt. Dabei vorallem auf den Teil, der sich mit der Formatierungen beschäftigt.

    Als Kontaktadresse dient sicherlich deine Seite und deine Email Adrresse, oder hast du andere Kontaktanschriften?



  • Einfach einzusetzendes Framework für die Win32-Konsolen-API. Ersetzt die in vielen Fällen sehr abgespeckte <conio.h> vollständig.

    -> Als Kontakt-Homepage die Homepage, ja
    -> Als Kontakt-Adresse mich wenn es um die IC geht, dich wenn es eher um das DevCPP-Package geht
    -> Okay, wenn das mit ReadMe und License so schön geht wirf die Changes in die ReadMe.

    Wichtig: Die Lib sollte funktionieren ohne etwas am ursprünglichen IC-Code verändern zu müssen um mir Wartungsaufwand bei zukünftigen Versionen zu ersparen. Wenn für den DevCpp Änderungen am Code notwendig sind gib vorher Bescheid, dann bau ich noch eine allgemeine Lösung ein.

    MfG SideWinder



  • also ich habe mich dran gemacht, ne statische lib mit Endung .a gemacht(einfach die beiden Dateien ic.hpp und ic.cpp zusammen reingehauen und fertig) ohne Änderungen am Code selber.

    Das DevPack muss man sich als Archiv vorstellen, dass bedeutet man muss es mit jeder neuen Version schnell neu komprimieren. Also falls es eine neue Version gibt sag mir das und in 10Minuten hast du das Package dazu, da ich einfach das Dev Projekt aufrufe, die lib neu erstellen lasse, die Dateien in den jeweiligen Ordnern ersetze und alles neu Archiviere, mit geänderte .DevPackage Datei, inder die Informationen für das Setup stehen, das herausgekommene tar.bz2 Archiv bennent man dann in DevPack um und schon funktioniert das ganze.

    Also das Setup habe ich wie folgt eingerichtet:
    die include-Files(ic.hpp und ic.cpp) im Ordner include, werden in den Ordner:
    <Stammverzeichnis von DevC++>\Include\ic\
    kopiert

    das lib File mit Namen ImprovedConsole.a und im Ordner lib, wird in den Ordner:
    <Stammverzeichnis von DevC++>\lib\
    kopiert

    und die Documentationen(License.txt,Readme.txt,Changes.txt) im Ordner docu, werden in den Ordner:
    <Stammverzeichnis von DevC++>\Docs\ImprovedConsole4.0\
    kopiert.

    Hier habe ich Changes.txt und Readme.txt auseinander gemacht, hingegen beim Setup sind sie zusammen.

    Man muss in seinem Projekt nur noch ImprovedConsole.a mitlinken und kann ic.hpp includieren, alles läuft wunderbar. Wohin soll ich dir das DevPak senden, damit du es hochladen kannst?

    Ich hoffe du und die anderen werden zufrieden sein und achja ich habe uns in der kurzen Beschreibung beide genannt.



  • Hinterher gleich eine technische Frage zur IC:

    Erstmal wie nennt man das wenn man nach der Klassendeklaration und Definition ein einziges Objekt der Klasse erstellt und es nicht weiter möglich ist ein weiteres Objekt zu erstellen, da der Konstruktor private ist?

    Und nun zu deinem, du deklarierst in der .hpp Datei eine Console Referenz(extern), der du dann mit einer Funktion in deiner cpp einen wert zuweist(das neue Objekt) worauf sie referenzieren soll. Nun ich habe es in einer meiner Klasse ohne diese Zuweisung eines neuen Objektes versucht und es klappt auch wenn ich die Referenz extern deklariere und dann bei der Definition der Referenz keinen Wert zum Referenzieren zuweise, bisher funktioniert das tadellos, könntest du mir vielleicht erklären wozu deine Methode gebraucht wird und was das Wörtchen extern genau bewirkt, desweiteren könntest du, da wir schonmal dabei sind ein Paar Worte über inline verlieren? Wäre echt nett!



  • Wohin soll ich dir das DevPak senden, damit du es hochladen kannst?

    SideWinder@c-plusplus.net

    Erstmal wie nennt man das wenn man nach der Klassendeklaration und Definition ein einziges Objekt der Klasse erstellt und es nicht weiter möglich ist ein weiteres Objekt zu erstellen, da der Konstruktor private ist?

    Das ist ein Singleton - ein Design Pattern.

    Die Referenz ist extern, damit der Linker später weiß, dass die Definition dazu in einer anderen Übersetzungseinheit liegt. Die Zuweisung in der Cpp-Datei ist wichtig, weil sonst die Referenz ins leere zeigt. Natürlich kannst du das auch alles weglassen und immer Console.getInstance() aufrufen.

    inline ist eine Empfehlung an den Compiler eine bestimmte Funktion nicht über einen Sprung zu einem anderen Codestück aufzurufen sondern direkt in den Code einzufügen. Sowas dann:

    // Ohne Inline:
    Anderer Code
    doSth(i); // Hier wird zur Ausführungsadresse von doSth gesprungen
    Anderer Code
    
    // Mit Inline:
    AndererCode
    doSth(i) // Hier wird der Inhalt von doSth direkt an diese Stelle kopiert
    AndererCode
    

    Allerdings ist das nur eine Empfehlung an den Compiler, der kann dann daraufhin immer noch entscheiden ob das optimal ist und wirklich gemacht werden soll.

    MfG SideWinder



  • achso, aber wenn ich eine Referenz direkt vom Ursprungsobjekt ableite, dann muss die Referenz doch nirgendwo hinzeigen, dies ist zwar dann etwas Zweckentfremded, aber es funktioniert, jedenfalls bei mir! Und ich habe nix wie eine getInstance(); Methode, respektive Funktion!



  • Referenz vom Ursprungsobjekt ableiten? Huh? Zeig mal was du da gemacht hast 🙂

    MfG SideWinder



  • Bisheriger Code:
    log.h

    //==============================================================================
    /*
              |--------------------------------------------------------|
              |   Name         : Logbuchklasse CLog                    |
              |   Copyright By : Kevin Jakob                           |
              |   Version      : 1.3                                   |
              |   Lizenz       :                                       |
              |Die Klasse darf frei verwendet werden, falls dieser     |
              |schriftliche Vermerk und damit die Lizenzbedingungen,   |
              |in der von ihnen verwendeten Version des Dateienpakets/ |
              |der Klasse vorhanden bleibt und etwaige weitere         |
              |Lizenzbedingungen selber eingehalten werden.            |      
              |--------------------------------------------------------|
    */
    //==============================================================================
    #include "log_os.h"
    //==============================================================================
    #ifdef WIN_COMPILE_LOG
    #include <windows.h>
    #endif
    //==============================================================================
    #ifdef LINUX_COMPILE_LOG
    #endif
    //==============================================================================
    #ifdef NON_SPECIFIC_OS_COMPILE_LOG
    #endif
    //==============================================================================
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <conio.h>
    //==============================================================================
    using namespace std;
    //==============================================================================
    #define SUCCESS 0
    #define FAILURE 1
    //==============================================================================
    #define INT    11
    #define FLOAT  12
    #define BOOL   13
    #define STRING 14
    //==============================================================================
    class CLog
    {
        private: 
                CLog();          
        public:             
                int write_to_log(string cText,bool bNewline);
                int exit();
                int init(string cProgram_name);
                //==================================================================
                //Public-Funktionen set() und get() befinden sich hier im Header, da
                //template-Funktionen nur in Headern definiert werden können und nicht
                //im Header deklariert und in der zugehörigen Source-Datei(.cpp) definiert
                //werden.
                //Um die Übersicht zu wahren habe ich beide Funktionen ans Ende der 
                //Klassendeklaration geschrieben!
                //==================================================================
                template<class T>
                int set(int iVariable_type,string cSet_variable_name,T New_content)
                {
                    switch(iVariable_type)
                    {
                        case INT:
                                return SUCCESS;
                                break;
                        case FLOAT:
                                return SUCCESS;
                                break;
                        case BOOL:
                                return SUCCESS;
                                break;
                        case STRING:
                                return SUCCESS;
                                break;
                        default:
                                return FAILURE;
                    }
                    return FAILURE;
                }
                //==================================================================
                template<class T>
                int get(int iVariable_type,string cGet_variable_name,T &Output)
                {
                    switch(iVariable_type)
                    {
                        case INT:
                                return SUCCESS;
                                break;
                        case FLOAT:
                                return SUCCESS;
                                break;
                        case BOOL:
                               return SUCCESS;
                                break;
                        case STRING:
                                return SUCCESS;
                                break;
                        default:
                    }
                }
                //==================================================================
    };
    //==============================================================================
    extern CLog& log;
    

    und so sieht die Stelle in der log.cpp aus:

    CLog &log;
    

    diese Zeile steht ganz unten und dat funktioniert, so kann ich zum Beispiel
    log.init("Irgendwas"); ausführen, ohne das es Probleme gibt!



  • Hallo

    Ich wollte nur mal anmerken, dass du in der Headerdatei vielleicht besser kein:

    using namespace std;
    

    verwenden solltest, weil es sonst zu Namenskonflikten bei Usern deiner Klasse kommen kann, oder?

    chrische



  • inwiefern? kannst du Mal ein Beispiel geben?



  • Hallo

    Wenn beispielsweise jemand seine eigene string-Klasse geschrieben hat und mit Ihr arbeitet.

    string Text;  //(was für ein String: std?, oder eigene Klasse?)
    

    wenn du allerdings so etwas schreibst, wird alles klar:

    std::string Text; //std-String
    string Text2; //eigene String-Klasse
    

    chrische



  • das using namespace bezieht sich ja aber nur auf meine Klasse und nicht außerhalb davon, mann muss ne using Direktive doch immer an jeden Anfang einer Datei schreiben für die man eben etwas usen will. Damit verwende ich intern zwar den namensbereich std aber extern können die Leute doch gerne mit std::string oder std::cout arbeiten??? oder etwa nicht!?



  • Hallo

    Ich bin mir selber nicht 100% sicher, aber ich glaube, dass wenn du using namespace in die Headerdatei schreibst und jemand diese inkludiert, gilt dieses using namespace auch für die Datei, wo der Header inkludiert wurde. Und genau wäre das Prblem.

    chrische



  • wartn wir auf SideWinder, der weis dat sicher!



  • ich hab mir jetzt auch mal die improved console geladen. Ich wollte das sample kompillieren, allerdings kommen ich immer auf diesen fehler:

    1>------ Erstellen gestartet: Projekt: improved, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>imp.cpp
    1>Verknüpfen...
    1>ic.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ShowWindow@8" in Funktion ""public: void __thiscall ic::Console::hide(void)" (?hide@Console@ic@@QAEXXZ)".
    1>ic.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetWindowRect@8" in Funktion ""public: int __thiscall ic::Console::getWndPosX(void)const " (?getWndPosX@Console@ic@@QBEHXZ)".
    1>ic.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__SetWindowPos@28" in Funktion ""public: void __thiscall ic::Console::setWndPos(int,int)" (?setWndPos@Console@ic@@QAEXHH@Z)".
    1>E:\Dev\C\improved\Debug\improved.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://e:\Dev\C\improved\improved\Debug\BuildLog.htm" gespeichert.
    1>improved - 4 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    und kann man die improved console auch problemlos für C einsetzen?



  • 1. Du musst die .cpp-Datei auch wie beschrieben dem Projekt hinzufügen
    2. Nein, derzeit ist es rein für C++ gedacht. Aber viele C-Compiler sind ohnehin nur noch C++-Compiler mit einem C-Modus. Mit denen ist es kein Problem.

    MfG SideWinder



  • ich habe eigentlich die .cpp und die .hpp datei hinzugefügt. Zwar nicht über "Datei -> Vorhandenes Element hinzufügen", weil es das bei mir (VC++ Express) nicht gibt sondern über "Projekt -> Vorhandenes Element hinzufügen".

    Ich hab mal einen Screenshot gemacht:
    http://img361.imageshack.us/img361/4840/improvedconsole6ih.jpg

    PS: Schön zu sehen, dass es hier noch jemanden aus Linz Umgebung gibt


Anmelden zum Antworten