Improved Console 4.0



  • 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



  • Hallo

    Wurde nun schon die Frage geklärt, wie sich das mit namespace verhält?

    chrische



  • Ehm nein, anscheinend hat das der SideWinder überlesen, mal sehen ob er jetzt drauf reagiert.



  • Ich öffne aus diesem Grund keine Namespaces in Header-Dateien und auch keine in den dazugehörigen Implementations-Dateien.

    Glaube aber - weiß allerdings nicht - dass man in der Impl-Datei den Namespace ohne Probleme öffnen kann, da es ja eine andere Übersetzungseinheit ist.

    In der Header-Datei ist auf jeden Fall davon abzuraten.

    ---

    @cpfix: Hast du auch brav das Platform SDK installiert? So wie auf der Download-Seite der IC unten beschrieben?

    MfG SideWinder



  • Hallo

    Das entspricht auch genau dem, was ich vermutet hatte. 😃 😃

    chrische



  • eigentlich schon.
    der Compiler schreibt ja irgendwas über einen Link Fehler. Ich hab bei bei der Installation des PSDK die Datei "corewin_express.vsprops" folgendermaßen abgeändert:

    <?xml version="1.0"?>
    <VisualStudioPropertySheet 
    	ProjectType="Visual C++" 
    	Version="8.00" 
    	Name="Core Windows Libraries">
    	<Tool 
    		Name="VCLinkerTool" 
    		AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" />
    </VisualStudioPropertySheet>
    

    allerdings lässt sich auch das Beispiel für ein Windows Programm aus der Anleitung nicht korrekt kompillieren.



  • also kann es zu Außwirkungen kommen, oder nicht?

    EDIT: Ich habe das ganze probiert, in meiner Testumgebung habe ich ohne namespace geschrieben aber das besagte im Header beibehalten, es gibt keine Probleme!



  • void Console::setWndSize (int x, int y)
            {
                if(!wndBufMode)
                {
                    zeroWndSize();
    
                    COORD bufSize;
                    bufSize.X = min(x,getMaxWndSizeX());
                    bufSize.Y = min(y,getMaxWndSizeY());
                    SetConsoleScreenBufferSize(hConsoleOutput,bufSize);
                }
    
                SMALL_RECT wndSize;
                wndSize.Top = 0;
                wndSize.Left = 0;
                wndSize.Right = min(x,getMaxWndSizeX()) - 1;
                wndSize.Bottom = min(y,getMaxWndSizeY()) - 1;
                SetConsoleWindowInfo(hConsoleOutput,TRUE,&wndSize);
            }
    

    ich habe hier ein problem: min undeclared



  • Ich hab ebenfalls folgendes bekommen:

    Fehler	1	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)".	ic.obj
    
    Fehler	2	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)".	ic.obj
    
    Fehler	3	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)".	ic.obj
    

    Gibt es da schon eine Lösung?

    SDK installiert, beide Quelldateien geladen, main.cpp mit folgendem Inhalt:

    #include <iostream>
    	#include "ic.hpp"
    	using namespace ic;
    	using namespace ic::shorties;
    	using namespace std;
    
    	int main ()
    	{
    	    textcolor(FG_RED);
    	    cout << "Hello World" << endl;
    	    return 0;
    	}
    

    Ich hoffe auf eine Antwort.

    MFG Proximo



  • Das Problem lässt sich sogar noch weiter verfolgen:

    #define _WIN32_WINNT 0x0500
    
    #include <windows.h>
    
    int main()
    {
    	ShowWindow ( GetConsoleWindow () , SW_HIDE ); 
    	return 0;
    }
    

    Wirft:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ShowWindow@8" in Funktion "_main". main.obj

    Was kann das sein?

    MFG Proximo


Anmelden zum Antworten