016
20.05.2004, 14:48 Uhr
Spacelord
Hoffnungsloser Fall
|
Hi, heute hab ich mal nen bisschen Zeit um da näher drauf eingehen zu können. Du scheinst ja vorzuhaben so ne Art Funktionsbibliothek zu schreiben.
Zitat: |
RedEagle postete ja, aber die Header-datein können nicht auf globale variablen oder funktionen der main-datei zugreifen.
|
Wenn deine Funktionsbibliothek von globalen Variablen in ner anderen Datei abhängt ist das ohnehin schonmal Schrott. Aus deinen bisherigen Schilderungen folger ich dass du etwas in dieser Art machen möchtest:
main.cpp
C++: |
#include <iostream> #include <windows.h>
WORD setScreenColor(); WORD getOldSettings(); HANDLE hStdOut; CONSOLE_SCREEN_BUFFER_INFO conInfo; WORD farbe;
int main() { farbe= getOldSettings(); setScreenColor(); std::cout<<"Hallo RedEagle!"<<endl; return 0; }
|
g++ -c main.cpp
color.cpp
C++: |
#include<windows.h>
WORD getOldSettings() { //Der Einfachheit halber setze ich hier einfach nen Wert //anstatt ihn aus ner Datei auszulesen WORD temp = FOREGROUND_RED|BACKGROUND_BLUE; return temp; }
void setScreenColor() { DWORD pufferGroesse; DWORD rueckgabe; COORD curPos={0,0}; extern HANDLE hStdOut; extern CONSOLE_SCREEN_BUFFER_INFO conInfo; extern WORD farbe; hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdOut,&conInfo); pufferGroesse = conInfo.dwSize.X * conInfo.dwSize.Y; FillConsoleOutputAttribute(hStdOut,farbe,pufferGroesse,curPos,&rueckgabe); SetConsoleTextAttribute(hStdOut,farbe); }
|
g++ -c color.cpp g++ -o farbe.exe main.o color.o
Jetzt hast du globale Variablen die eigentlich garnichts in main zu suchen haben und obendrein noch,in der Datei wo sie benötigt werden,als extern gekennzeichnet werden müssen.Desweiteren musst du jedesmal die Prototypen der Funktionen aus deiner "Lib" von Hand deklarieren. Also die Prototypen kannst du schonmal locker in nen Header packen! Und die Variablen die deine Bibliotheksfunktionen benötigen kannst du auch in den Header packen.Die Funktionen benötigen die Variablen also gehören die auch dahin!!
Zitat: |
RedEagle postete In der datei ist nähmlich ne Funktion, die werte aus einer ini liest und in Globale variablen schreibt. diese werte sind wichtig für das aussehen (textcolor).
|
Warum musst du die Werte in globale Variablen schreiben??? Du kannst die doch der Funktion aus deiner Bibliothek als Parameter übergeben. Eine zweite Version die schon eher einer Funktionsbibliothek ähneln würde sehe eventuell so aus:
main2.cpp
C++: |
#include <iostream> #include "color.h"
int main() { setScreenColor(getOldSettings()); std::cout<<"Hallo RedEagle!"<<endl; return 0; }
|
g++ -c main2.cpp
color2.h
C++: |
#ifndef __COL_ #define __COL_
#include <windows.h> //in diesem Kontext ist static eine Art private für Arme static HANDLE hStdOut; static CONSOLE_SCREEN_BUFFER_INFO conInfo; static DWORD pufferGroesse; static DWORD rueckgabe; static COORD curPos={0,0}; void setScreenColor(WORD); WORD getOldSettings();
#endif
|
color2.cpp
C++: |
#include "color.h" WORD getOldSettings() { //Der Einfachheit halber setze ich hier einfach nen Wert //anstatt ihn aus ner Datei auszulesen WORD temp = FOREGROUND_RED|BACKGROUND_BLUE; return temp; }
void setScreenColor(WORD farbe) { hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdOut,&conInfo); pufferGroesse = conInfo.dwSize.X * conInfo.dwSize.Y; FillConsoleOutputAttribute(hStdOut,farbe,pufferGroesse,curPos,&rueckgabe); SetConsoleTextAttribute(hStdOut,farbe); }
|
Kompilieren wie gehabt mit g++ -c color2.cpp Exe erstellen: g++ farbe2.exe main2.o color2.o
Also,ich bilde mir mal ein dass diese Lösung schon deutlich "aufgeräumter" aussieht und weitaus besser gekapselt ist als der Mist mit den globalen Variablen,wobei die Variablen natürlich immer noch modulglobal sind aber eben wegen static nicht über extern von "ausserhalb" ansprechbar(wer will brauch natürlich nur den header zu ändern ). Naja,mit C++,oder besser Objektorientierung hat das Ganze aber noch immer nichts zu tun.Ist nur etwas geordneter....
Also der Vollständigkeit halber noch ne ganz simple C++ Lösung: LConsole.h
C++: |
#ifndef _LConsole_H_ #define _LConsole_H_
#include <windows.h>
class LConsole { public: LConsole(); void setScreenColor(WORD neueFarbe); WORD getOldSettings(); private: HANDLE hStdOut; CONSOLE_SCREEN_BUFFER_INFO ConInfo; DWORD PufferGroesse; DWORD RueckgabeDW; COORD CurPos;
};
#endif
|
LConsole.cpp
C++: |
#include "LConsole.h"
LConsole::LConsole() { hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdOut,&ConInfo); CurPos.X = 0; CurPos.Y = 0;
}
void LConsole::setScreenColor(WORD neueFarbe) { GetConsoleScreenBufferInfo(hStdOut,&ConInfo); PufferGroesse = ConInfo.dwSize.X * ConInfo.dwSize.Y; FillConsoleOutputAttribute(hStdOut,neueFarbe,PufferGroesse,CurPos,&RueckgabeDW); SetConsoleTextAttribute(hStdOut,neueFarbe); }
WORD LConsole::getOldSettings() { return (FOREGROUND_RED|BACKGROUND_BLUE); }
|
und die main noch:
C++: |
#include <iostream> #include "LConsole.h"
int main() { LConsole lc; lc.setScreenColor(lc.getOldSettings()); std::cout<<"Hallo RedEagle!"<<endl; return 0; }
|
Vielleicht hab ich dich ja auch ganz falsch verstanden,aber lass mal die 3 Varianten auf dich einwirken und versuch mal Vor und Nachteile zu finden.
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. |