You are not logged in.

1

Wednesday, July 14th 2010, 10:49pm

[C] Header Datei schreiben

Hallo @ all

Ich habe gerade eine Funktion geschrieben it der man ein Passwort einlesen kann. Diese sieht so aus:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
 
char Passwort(char cPasswort[], int iLaenge)
{
    char cTaste;
    int il, iloeschen=0;
 
    for (il=0;il<iLaenge;il++)
    {
        cTaste = getch(); //Taste auslesen
 
        If (cTaste == *MUSS ICH NOCH SUCHEN*) //Zahl für Leertaste suchen
        {
            printf("\7"); //Beep
            il--;
        }
        else if (cTaste == 8) //Backspace
        {
            if (iloeschen>0)
            {
                printf("\b \b"); //Curser zurück => überschreiben => Curser zurück
                cPasswort[il-1]=' ';
                il-=2;
                iloeschen--;
            }
        }
        else if (cTaste == 13) //Enter
        {
            break; //Schleife abbrechen
        }
        else
        {
            cPasswort[iloeschen]=cTaste; //Buchstabe wird gespeichert
            printf("*"); //Statt Buchstabe wird * ausgegeben
            iloeschen++;
        }
        fflush(stdin);
    }
 
    return (cPasswort);
}
 
int main()
{
    char cPass[80];
    int il, ilaenge;
    ilaenge=sizeof(cPass)/sizeof(char);
 
    for (il=0;il<ilaenge; il++)
        cPass[il]=' ';
 
    printf("Passwort: ");
    Passwort(cPass, ilaenge);
 
    printf("\n\n");
    for (il=0;il<ilaenge; il++)
        printf("%c", cPass[il]);
 
    getchar();
}


Nun möchte ich nicht immer diese ganze Funktion schreieben und habe dessweegn gedacht, sie vllt in eine Header Datei zu packen. Geht sowas? Das ich einfach immer über mein Projekt

#include <passowrt.h>

schreibe und dann über diesen Befehl

Passwort(cPass, ilaenge);

die Funktion aufrufe? Wenn das geht wie kann man das machen? Habe zwar schon eigene Header geschrieben allerdings sahen die so aus das ich einfach die benutzten Header Datei reinkopiert habe und die Funktionsköpfe. Wenn die Dateien im gleich Ordner lagen ging das wunderbar. Aber jetzt will ich ja eine komplett eigene Header Datei schreiebn. Das habe ich noch nie gemacht.

Hoffe auf eure Hilfe. Viele Grüße
Crosaider

2

Wednesday, July 14th 2010, 11:59pm

compiler ?

ansonsten halt einfach ne headerdatei mit .h endung erstellen und dann wie du ja bereits sagtest mit dem include befehl einfügen. die headerdatei muss natürlich noch im richtigen verzeichnis liegen, sodass sie später dann auch vom präprozi gfunne wird.

bei entwicklungs umgebungen wie visual c++ geht das alles ganz einfach.

3

Thursday, July 15th 2010, 12:32am

also kann ich die funktion einfach so wie isie ist in eine header Datei kopieren, diese dann einbinden und über den Befehl aufrufen?

4

Thursday, July 15th 2010, 8:41am

Eine Header-Datei ist im Grunde nichts anderes als ausgelagerte Funktionen (outsourcing ist das größte :D )

jetzt mal aus Sicht der VC++ IDE:

Neue Datei, deine Funktionen Schreiben und in deinen fall einfach als "password.h" abspeichern. Dann eben, wie du schon sagtest, mittels '#include' einbinden und viola...wir haben erfolgreich outgesourced ^^.
Was ich nun leider nichtmerh weiß aber bezweiflen wage, dass man einen Funktionsprototypen in der Header braucht. Müsste man sich erkundigen

Wie ich gern zu sagen Pflege: "Im zweifelsfall ausprobieren!" ^^

5

Thursday, July 15th 2010, 9:43am

Wobei eine ganze Funktion eigentlich nicht in ein Header-File gehört. In die Header Dateigehört nur die Deklaration der Funktion, die Implementierung liegt dann trotzdem in einem .c File.

6

Thursday, July 15th 2010, 11:11am

hallo,

sehe ich genauso wie rondrer. eigentlich nur deklarationen, defines, ... gehören ins h file und der rest gehört ins c file.

thx, truespin

7

Friday, July 30th 2010, 7:59pm

Für alle die nicht wissen, wie man eine Headerdatei schreibt, hier nochmal verdeutlicht:


C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
//hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
 
void hello()
{
printf("Hello World\n");
getch();
}
 
#endif



C/C++ Quellcode

1
2
3
4
5
6
7
8
9
//main.c
#include <conio.h>
#include "hello.h" 
//Hier wird die Header Datei hello.h eingebunden
int main()
{
hello(); //hier rufen wir die Funtion hello(); auf
return 0;
}


Ich habe schon verstanden, was die Profis gesagt haben, aber ich hatte keine Lust jetzt eine Riesenfunktion für ein kleines Beispiel zu schreiben,
das nur zeigen soll wie man in C eine Headerdatei schreibt.
mfg Pokertom

8

Saturday, July 31st 2010, 1:35pm

@pokertom
du meinst wohl ein Beispiel wie man es nicht macht ;)

In der Headerdatei werden nur die "Funktionsköpfe" definiert.
Der "Rumpf", also die eigentliche Implementierung sollte in einer extra Datei.


C/C++ Quellcode

1
2
3
4
5
//hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
void hello();
#endif


C/C++ Quellcode

1
2
3
4
5
6
7
//hello.c
#include "hello.h"
void hello()
{
printf("Hello World\n");
getch();
}

9

Saturday, July 31st 2010, 3:12pm

guten,

hätte da auch gleich ne frage zu diesen bedingten makros. also das hier:

Source code

1
#ifndef _HELLO_H_


zwei fragen hierzu:

1. diese _HELLO_H_ konstante, wo kommt die her bzw. ist das eine art konvention ? ich verstehe nicht wirklich wo die herkommt. in büchern zu diesem thema sehen die defs aber auch genauso aus, mit diesen unterstrichen. also semantisch kann ich mir nun ausmalen was das heisst, nämlich frägt er da ja dann ob hello.h noch nicht eingebunden wurde. das soll den zweck haben, so hab ich weiter gelesen, dass die hello.h datei nich mehrmals definiert wird. könnte mir da mal jemand nen quellcode schreiben, der absichtlich nen fehler provoziert ? ich meine es macht doch nichts aus wenn ich zwei module habe, und in jedem die hello.h "reininclude". dann steht der code eben zweimal da ? so als provozierende frage. natürlich weiss ich dass da dann der code doppelt da steht bzw. mehr speicher verbraucht wird. aber wie ist es denn mit den adressen z.b.. wenn ich hello.h in modul 1 und 2 definiere, dann beutzt modul2 doch ne andere adresskonvention als modul1, oder ? hoffe man kann einigermaßen verstehen was ich meine.

2. dann wenn der compiler die oben besagte anweisung erreicht, und dann dieses ifndef sieht, und nachschaut ob die headerdatei schon definiert wurde, setzt der compiler dann _HELLO_H von 0 auf 1 oder sowas, oder ändert er dann den wert, sodass er falls er nochmal drüberstolpert, dann merkt dass er die datei schonmal eingebunden hat ? oder bin ich jetzt total auf dem falschen pfad.

und ja eigentlich sinds in 1 mehrere fragen aufeinmal. sorry ^^ hab mich mit der thematik noch nie so richtig befasst wenn ich ehrlich bin und beim lesen heute hab ich nicht wirklich antworten zu ein paar sachen gefunden, die ich mich so dazu gefragt habe.

gruß

10

Saturday, July 31st 2010, 3:45pm

Dass die Konstante _HELLO_H_ heißt ist reine Konvention, man kann das prinzipiell nennen wie man will. Man lehnt es aber halt an den Dateinamen an, um zu verhindern, dass zwei verschiedene Header-Files die gleiche Konstante verwenden (weil dann ja nur eins von beiden verwendet werden würde).

Ohne es zu testen glaub ich, dass der Compiler sich beschweren würde, wenn Präprozessor-Konstanten und Funktionsköpfe mehrfach definiert würden. Daher verhindert man das durch das ifndef.

11

Saturday, July 31st 2010, 3:52pm

Sorry, aber macht man das nicht so wie ich, damit die C-Datei nicht zu unübersichtlich wird?
So habe ich den Sinn einer Header Datei verstanden, bin gerade ein bisschen verwirrt...
?(

12

Saturday, July 31st 2010, 3:53pm

ok. ich hatte die konstante _HELLO_H_ falsch interpretiert. hatte mich zu sehr an die defines aus meinem source code hier gewöhnt. dachte die käme von irgendwo aussen her, wäre irgendwie in einer standarddatei definiert, und immer wenn man einen unterstrich schreibt oder so, dann würde dass der compiler als selbstdefinierte konstante erkennen und dann einen wert zuweisen, der dann nach dem not def, wo ich dann gedacht hab das wär null, auf den wert eins gesetzt wird :D

naja ganz wirr. jetzt weiss ich wies gemeint ist.

gruß

This post has been edited 2 times, last edit by "user_z0" (Jul 31st 2010, 4:03pm)


Similar threads

Social bookmarks