conat.h
-
Moin =b
hab mich mal für meine Klasse vor den PC gehängt und für Visual Studio 2008/10
ein paar funktionen geschrieben, welche ich fein säuberlich auf header und .c dateie getrennt geschrieben habe.hier mal der code:
conat.h
// ///////////////////////////////////////////////////////////////////////////// // // -----------------------------conat.h----------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // /* Autor: Daniel Bauer alias ITEDVO Datum: 13.01.2011 Ort: Schallendorf, Österreich Details: Funktionen zur Setzung der Textattributen */ // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // #ifndef conat_h #define conat_h // ///////////////////////////////////////////////////////////////////////////// // // --------------------------------Datentypen----------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // typedef short cord; // wert für coordinaten typedef const unsigned int Uint; // farbwerte // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////////////////// // // --------------------------------Konstanten----------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // #define BLACK 0 #define BLUE 1 #define GREEN 2 #define CYAN 3 #define RED 4 #define VIOLET 5 #define BROWN 6 #define LIGHTGREY 7 #define DARKGREY 8 #define LIGHTBLUE 9 #define LIGHTGREEN 10 #define LIGHTCYAN 11 #define LIGHTRED 12 #define LIGHTMAGENTA 13 #define YELLOW 14 #define WHITE 15 #define DARKBLUE 128 #define GREY 221 #define PINK 222 // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////////////////// // // ---------------------------Funktions Prototypen------------------------------ // // ///////////////////////////////////////////////////////////////////////////// // void gotoxy(cord x, cord y); /* Setzt den Cursor der Console an die gewünschte Position Returnwert: Keiner Parameter: x und y des typs 'cord' (cord --> siehe oben!) */ void textcolor(Uint color); /* Setzt die Schriftfarbe auf die gewünschte Farbe Returnwert: Keiner Parameter: color des typs 'Uint' (Uint --> siehe oben!) */ void TextBackgroundColor(Uint color); /* Setzt die Farbe des Hintergrundes des Textes Returnwert: Keiner Parameter: color des typs 'Uint' (Uint --> siehe oben!) */ void CursorOff(); /* Blendet den Cursor aus Returnwert: Keiner Parameter: Keine */ void CursorOn(); /* Blendet den Cursor ein Returnwert: Keiner Parameter: Keine */ cord wherex(); /* Ermittelt die Position von X Returnwert: X Positon als 'cord' (cord --> siehe oben!) Parameter: Keine */ cord wherey(); /* Ermittelt die Position von Y Returnwert: Y Position als 'cord' (cord --> siehe oben!) Parameter: Keine */ // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // #endif /*conat_h*/ // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------EOF---------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// //
die .c datei
// ///////////////////////////////////////////////////////////////////////////// // // -----------------------------conat.c----------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // /* Autor: Daniel Bauer alias ITEDVO Datum: 12.01.2011 Ort: Schallendorf, Österreich Details: Funktionen zur Setzung der Textattributen */ // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////////////////// // // ------------------------------Includes--------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // Prototypes and typedefs #include "conat.h" // windows.h für die Attribute #include <windows.h> // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////////////////// // // -------------------------------Funktions------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // void gotoxy(cord x, cord y){ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X=x-1; // speichert X Position pos.Y=y-1; // speichert Y Position SetConsoleCursorPosition(hCon, pos); // Cursorposition } void textcolor(Uint color){ HANDLE console; console=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(console, color); } void TextBackgroundColor(Uint color){ HANDLE console; console=GetStdHandle(STD_OUTPUT_HANDLE); switch(color){ case BLUE: SetConsoleTextAttribute(console, BACKGROUND_BLUE | BACKGROUND_INTENSITY ); break; case BROWN: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_GREEN ); break; case DARKBLUE: SetConsoleTextAttribute(console, BACKGROUND_BLUE ); break; case DARKGREY: SetConsoleTextAttribute(console, BACKGROUND_INTENSITY ); break; case GREEN: SetConsoleTextAttribute(console, BACKGROUND_GREEN ); break; case GREY: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE ); break; case LIGHTBLUE: SetConsoleTextAttribute(console, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY ); break; case LIGHTGREEN: SetConsoleTextAttribute(console, BACKGROUND_GREEN | BACKGROUND_INTENSITY ); break; case PINK: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); break; case RED: SetConsoleTextAttribute(console, BACKGROUND_RED ); break; case VIOLET: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_BLUE ); break; case WHITE: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); break; case YELLOW: SetConsoleTextAttribute(console, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY ); break; } } void CursorOff(){ CONSOLE_CURSOR_INFO ci = {15,NULL}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci); } void CursorOn(){ CONSOLE_CURSOR_INFO ci = {15,2}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci); } cord wherex(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.X+1; } cord wherey(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.Y + 1; } // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------------------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////////////////// // // ----------------------------------EOF---------------------------------------- // // ///////////////////////////////////////////////////////////////////////////// //
die Frage: ist das ok so? oder hab ich was wesentliches übersehen? (ich weiß, es
gibt bereits headerdateien/bibliotheken welches das ganze behandeln, aber es ist ja nur für die klasse.und ein kleines problem hab ich, was aber weniger schlimm ist: textcolor(Uint color) ist mit TextBackgroundColor(Uint color) nicht kompatibel, sprich das eine hebt das andere auf. wieso eigentlich? wenns nicht gelöst wird auch weniger schlimm.
ich würd das ja gerne den mitschülern geben damit sie sich die dateien in das include-verzeichnis vom compiler schmeissen, aber nach 3h googeln geb ichs auf. denn ich hab keinen blassen schimmer wo vs2008/10 die .c/.cpp dateien für die .h dateien speichert. die .h dateien sind einfach, einfach ins include verzeichnis rein aber das nützt nichts wenn ihm die .c/.cpp datei fehlt.
vieleicht kennt ihr ja die location, wenn nicht... auch nicht schlimm, die können sich ja die zwei dateien ja auch jedes mal in das projektverzeichnis kopieren und mit
#include "conat.h"
statt
#include <conat.h>
includieren!
gruß
ITEDVO
-
Du solltest die Funktionen in den Header geben, damit man keine .c/cpp braucht.
-
Die *.c dateien für die Standard *.h werden bei kommerziellen Compilern selten mitgeliefert (oder nur gegen gute Bezahlung).
Die Funktionen die in den .h deklariert sind befinden sich in den Libraries (.lib oder *.dll)
Deine Erweiterungen solltest du am besten in einem eigenen Verzeichnis unterbringen und nicht mit den Compiler-Headern mischen.
Damit der Preprozessor die findet kannst du im Projekt noch weitere Suchpfade angeben.
-
Hier:
cord wherex(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.X+1; } cord wherey(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.Y + 1; }
fehlt noch ein Funktionsaufruf vor der return - Anweisung.
-
314159265358979 schrieb:
Du solltest die Funktionen in den Header geben, damit man keine .c/cpp braucht.
Das ist natürlich Schwachsinn.
-
itedvo schrieb:
#define BLACK 0 #define BLUE 1 #define GREEN 2 #define CYAN 3 #define RED 4 #define VIOLET 5 #define BROWN 6 #define LIGHTGREY 7 #define DARKGREY 8 #define LIGHTBLUE 9 #define LIGHTGREEN 10 #define LIGHTCYAN 11 #define LIGHTRED 12 #define LIGHTMAGENTA 13 #define YELLOW 14 #define WHITE 15 #define DARKBLUE 128 #define GREY 221 #define PINK 222
Besser und robuster aus mehreren Gründen ist:
typedef enum { BLACK, BLUE, GREEN, CYAN, RED, VIOLET, BROWN, LIGHTGREY, DARKGREY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE, DARKBLUE=128, GREY=221, PINK=222} Farbwerte; /*und dann die Variablendefinitionen*/ Farbwerte farbwerte; /*und die Funktionsparameter*/ void blafasel(Farbwerte f); /*statt*/ void blafasel(int f);
Du solltest auch vorsichtig bei der Vergabe von kurzen, prägnanten define-Namen sein, da diese evtl. schon verwendet werden und du vom Compiler bestenfalls eine Warnung erhälst.
Bei der enum-variante bekommst du dagegen einen Fehler, ebenso sind enum für Debuggingzwecke besser geeignet als defines.
-
hmm, danke... die tipps hören sich gut an. werde mich gleich daran setzen und
das ganze verbessern.wie das ganze mit den libs funktioniert, weiß ich jetzt nicht wirklich, da es
ja eigentlich für die klasse (ich besuch ne htbl) bestimmt ist, war mein 1.
hintergrundgedanke, dass die klasse etwas davon lernt, übernimmt und ev. wieder
verwendet. es geht mir ja nicht direkt etwas zu verstecken xDdennoch, für spätere zwecke: was für ein project-typ muss ich überhaupt bei
visual studio 2008/10 verwenden für eine .lib? was ist besser und voralem besser
für sowas kleines geeignet?Wutz schrieb:
314159265358979 schrieb:
Du solltest die Funktionen in den Header geben, damit man keine .c/cpp braucht.
Das ist natürlich Schwachsinn.
da ich bis jetzt geschlafen habe und ich noch alles halbwegs verschwommen sehe,
hät ich dass noch fast geglaubt, was 314159265358979 geschrieben hatte xD
danke wutz, hast mich vor verwirrung gerettet xDtypedef enum { BLACK, BLUE, GREEN, CYAN, RED, VIOLET, BROWN, LIGHTGREY, DARKGREY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE, DARKBLUE=128, GREY=221, PINK=222} Farbwerte;
woher weiß der compiler jetzt was für einen wert jetzt zum beispiel: lightred hat?
und typedef hab ich ja verwendet... zb:
typedef short cord; // platzsparend, brauch nicht mehr! typedef unsigned int Uint; // hab ich für die farbwerte verwendet, brauch keine werte im bereich Z[h]- // und dann für die funktion: void textcolor(Uint color);
aber wenn ich das obere verstehe, verwende ich gerne deinen code...
Belli schrieb:
Hier:
cord wherex(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.X+1; } cord wherey(){ CONSOLE_SCREEN_BUFFER_INFO info; return info.dwCursorPosition.Y + 1; }
fehlt noch ein Funktionsaufruf vor der return - Anweisung.
was für ein funktionsaufruf? info.dwCursorPosition.Y zeigt auf die cursor position... anfangs ist sie bei 0 (auch bei X)... erst im späteren verlauf des
programmes wird sie aktualisiert. sprich: bei printf, bei gotoxy() etc. ich versteh nich welche funktion du meinst...danke noch mals =b
gruß
ITEDVO
-
Na, die where - Funktionen sollen doch die aktuellen Positionen zurückliefern, die stehen aber in info nicht drin, wenn Du nicht vorher
GetConsoleScreenBufferInfo
aufrufst.
-
Es ist einfacher, die kleinen Funktionen in einem Header zu halten, auch zur Verwendung.
-
Belli schrieb:
Na, die where - Funktionen sollen doch die aktuellen Positionen zurückliefern, die stehen aber in info nicht drin, wenn Du nicht vorher
GetConsoleScreenBufferInfo
aufrufst.
bin gerade beim essen drauf gekommen, aber danke xD
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
314159265358979 schrieb:
Es ist einfacher, die kleinen Funktionen in einem Header zu halten, auch zur Verwendung.
ein schwachsinn², schreibst du eine funktion in einer headerdatei (also mit dem
befehls block), dann lässt der compiler mit einer schönen fehlermeldung grüßen.
einzig die prototypen sind erlaubt und sinnvoll!
-
Du hast nen Knall.
-
314159265358979 schrieb:
Du hast nen Knall.
dann gib mir code-beispiele... ev. überseh ich ja was wesentliches, aber
visual studio 2008 meckert ununterbrochen und in jedem tutorial wird entweder
direkt darauf hingewiesen das die funktionen in der .cpp liegen und die prototypen in der .h weils sonst nicht geht oder indirekt in dem darauf hingewiesen wird das eine .cpp benötigt wird, ausser man schreibt eine .dll oder .lib. also, gib mir konkrete beispiele und ich nehme zurück was ich
geschrieben habe.
-
Mach deine Funktionen
static
und es geht. Allerdings solltest du dann beachten, dass die Funktion danach in jeder C-Datei vorhanden ist. Das gibt keine Linkerfehler (nicht Compilerfehler), aber du kannst natürlich nichts mehr machen, wo du drauf angewiesen bist genau die selbe Funktion auszuführen. Wie zum Beispiel statische Variablen in der Funktion.
-
ók, ich nehme das geschriebene zurück... aber dennoch, ist glaube ich eher
unschön? oder?
-
itedvo schrieb:
typedef enum { BLACK, BLUE, GREEN, CYAN, RED, VIOLET, BROWN, LIGHTGREY, DARKGREY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE, DARKBLUE=128, GREY=221, PINK=222} Farbwerte;
woher weiß der compiler jetzt was für einen wert jetzt zum beispiel: lightred hat?
enum verwendet jeweils eine implizite Initialisierung der Elemente, wenn keine explizite angegeben ist, das erste Element beginnt bei 0, jedes folgende Element dann +1.
-
ach so... danke, dann werd ich das mal übernehmen... auf dich kann man
sich halt so gut wie immmer verlassen wutz =b
-
so, hab jetzt einige dinge ergänzt und das ganze jetzt als *.dll project
erstellt. funktioniert alles sehr gut...etwas, was mich jetzt wunder nimmt ist folgendes: wenn ich jetzt die *.dll
erweitere, kann ich dann nur die *.dll weiter geben, ohne die *.lib + *.h mit
zu geben? falls ja, wieso?
-
Solange du nur neue Sachen ergänzt und nichts änderst, sollte es kein Problem geben. Die *.h und *.lib benötigst du nur, um dein Programm zu erstellen. Damit weiß der Compiler, wie es in der *.dll drin aussieht.
-
Das zuverlässige und portable Standardverfahren ist, die *.h und *.lib zu liefern, den ganzen DLL-Schrott würde ich nur unsympathischen Leuten zumuten.
-
Wutz schrieb:
Das zuverlässige und portable Standardverfahren ist, die *.h und *.lib zu liefern, den ganzen DLL-Schrott würde ich nur unsympathischen Leuten zumuten.
wer sagt denn, dass mir meine klasse sympathisch ist =b =b =b
hmm, ich mag google nicht wirklich, wisst ihr eh oder? ich meine: ich such nach
tutorials für *.lib und alles was kommt fängt mit dll an... gibts da vieleicht
n´halbwegs gutes tutorial?