Konstanten im Header Datei

Schnelle objektorientierte, kompilierende Programmiersprache.
Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Konstanten im Header Datei

Beitrag von Ivo » So Mär 01, 2015 4:03 pm

Hallo an alle,
ich habe eine Frage:
warum muss man die Konstanten im Header Datei nummerieren?
wenn ich sie im Header Datei nicht nummeriere es zeigt mir im C Datei Warnungen.
Weißt jemand warum ist es so?
Vielen Dank!
Bsp. Header Datei

Code: Alles auswählen

#ifndef TEXTANALY_H_
#define TEXTANALY_H_

#define MAXLAENGE [18] 

#define VOR_WORT 1		/* Konstanten definieren  */
#define IM_WORT	2
#define KEIN_WORT 3
#define CTL	4
#define BU 5
#define SAZ 6
#define SONST 7


int zeichenkette(int c);	
int stateMachine(int old,  int cat);
void ausWL(int wla[], int len);

#endif /* TEXTANALY_H_ */
im C Datei

Code: Alles auswählen

int zeichenkette(int c)
{
	int ausgabe; 
	if(c <= 32)
	{
		ausgabe = CTL;    /* zeigt Warnung*/
	}

	else if((c > 'A' && c < 'Z') || (c > 'a' && c > 'z') || c == '_')
	{
		ausgabe = BU;     /* zeigt Warnung*/
	}
	else if(c =='.' || c == ',' || c == ';' || c == '!' || c == '?' || c == ':')
	{
		ausgabe = SAZ;   /* zeigt Warnung*/
	}

	else{ ausgabe = SONST;}   /* zeigt Warnung*/

	return ausgabe;
}
int stateMachine(int old,  int cat) 
{
	int ausgabe;


	return .....   ;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Konstanten im Header Datei

Beitrag von cloidnerux » So Mär 01, 2015 4:13 pm

warum muss man die Konstanten im Header Datei nummerieren?
Wie nummerieren?
wenn ich sie im Header Datei nicht nummeriere es zeigt mir im C Datei Warnungen.
Was für Warnungen? Normalerweise will dir der Compiler mit sowas etwas mitteilen, von daher ist es extrem Wichtig, sich das ganze auch mal durchzulesen.

Nur zum Verständnis:
Alles was du mit "#define" Deklarierst ist Symbolisch, heißt der Ausdruck wird vor dem Compilieren durch den Präprozessor mit dem angegeben Wert ersetzt.
Der Präprozessor Ersetzt dir also dein "BU" mit 5 oder CTL mit 4, bevor es compiliert wird.
Gibst du keinen Wert an,

Code: Alles auswählen

#define BU
statt

Code: Alles auswählen

#define BU 5
wird dementsprechend BU mit nichts ersetzt und der Compiler sieht dann

Code: Alles auswählen

ausgabe = ; 
was dementsprechend falsch ist.

Für Bezeichner die Automatisch hoch zählen, schaue dir mal den Datentyp "enum" an:
https://www.proggen.org/doku.php?id=c:type:enum
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten im Header Datei

Beitrag von Xin » So Mär 01, 2015 4:26 pm

Ivo hat geschrieben:Hallo an alle,
ich habe eine Frage:
warum muss man die Konstanten im Header Datei nummerieren?
wenn ich sie im Header Datei nicht nummeriere es zeigt mir im C Datei Warnungen.
Weißt jemand warum ist es so?
Das hat cloidnerux schon erklärt.
Ivo hat geschrieben:

Code: Alles auswählen

#ifndef TEXTANALY_H_
#define TEXTANALY_H_

#define MAXLAENGE [18] 

#define VOR_WORT 1		/* Konstanten definieren  */
#define IM_WORT	2
#define KEIN_WORT 3
#define CTL	4
#define BU 5
#define SAZ 6
#define SONST 7
Zustände definiere besser mit enums:

Code: Alles auswählen

[/quote]
enum Position
{
  VOR_WORT, 
  IM_WORT,
  KEIN_WORT
};
Diese Zustände kannst Du nutzen, wie die Code-Ersetzungen, die Du mit Define geschaffen hast. Im Prinzip passiert auch nichts anderes. Die Zustände werden durchgezählt.

Konstanten würde ich auch tatsächlich als Konstanten definieren:

Code: Alles auswählen

int const MaxLaenge = 18;
double const Pi = 3.1415;
Was Du da mit MAXLAENGE machst, weiß ich nicht, aber koscher sieht es nicht aus. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Re: Konstanten im Header Datei

Beitrag von Ivo » So Mär 01, 2015 4:37 pm

es zeigt Fragezeichen und wird geschrieben Syntaxis error.
also der Präprozessor sieht nur die Ziffern?
Warum ist es so falsch? wie ich das verstanden habe, ich kann die
Konstanten mit einer enum func im C datei ersetzen oder?
Bsp.

Code: Alles auswählen

enum positionen
{
CTL,
BU,
SAZ,
SONST,
WOR_WORT,
IM_WORT,
KEIN_WORT
};

int zeichenkette(int c) 
{
	int ausgabe; 
	if(c <= 32)
	{
		ausgabe = CTL;
	}

	else if((c > 'A' && c < 'Z') || (c > 'a' && c > 'z') || c == '_')
	{
		ausgabe = BU;
	}
	else if(c =='.' || c == ',' || c == ';' || c == '!' || c == '?' || c == ':')
	{
		ausgabe = SAZ;
	}

	else{ ausgabe = SONST;}

	return ausgabe;
}


int stateMachine(int old, int cat)
{
	int ausgabe;
	switch(old)
	{
		case VOR_WORT:
				switch (cat)
				{
				case CTL:
					ausgabe=VOR_WORT; break;
				case BU:
					ausgabe=  IM_WORT; break;
				default: ausgabe=KEIN_WORT; break;

				}
		break;

		case IM_WORT:
			switch(cat)
			{
			case CTL:
				ausgabe=VOR_WORT; break;
			case SAZ:
				ausgabe=KEIN_WORT; break;
			default: ausgabe=IM_WORT;break;
			}
		break;

		case KEIN_WORT:
			switch(cat)
			{
			case CTL:
				return VOR_WORT; break;
			default: ausgabe=KEIN_WORT;break;
			}
			break;
	}


	return ausgabe;
}
es zeigt kein Fehler.
Also Zustände deklariert man mit enum und muss ich sie nicht im Header Datei definieren.
Zuletzt geändert von Ivo am So Mär 01, 2015 4:59 pm, insgesamt 2-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten im Header Datei

Beitrag von Xin » So Mär 01, 2015 4:47 pm

Ich weiß nicht, was eine "enum func" ist, aber ich weiß, dass Du a) Fehlermeldungen des Compilers mitposten solltest, damit wir nicht raten müssen, b) dass Du die Fehlermeldungen lesen solltest und c) dass ich Kommas zwischen den Enum-Werten habe. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Re: Konstanten im Header Datei

Beitrag von Ivo » So Mär 01, 2015 5:03 pm

Also Zustände deklariert man mit enum und muss ich sie nicht im Header Datei definieren.
Wie ich das oben geschrieben habe oder?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Konstanten im Header Datei

Beitrag von cloidnerux » So Mär 01, 2015 5:57 pm

Also Zustände deklariert man mit enum und muss ich sie nicht im Header Datei definieren.
Das hängt einzig davon ab, was du haben möchtest.

Enum ist extra dafür gedacht, diese Art der Aufzählungen zu realisieren, von daher macht es sinn, diese auch zu nutzen. Du musst es aber nicht. Du kannst auch deine #defines nutzen, das ist halt aufwändiger und du musst selber hoch zählen.

Der Ort der Deklaration ist auch dir Überlassen. Wenn du das in deiner*.c Datei machst, ist der Datentyp nur da bekannt. Das ist gut, wenn der auch nur da gebraucht wird.
Du kannst das ganze aber auch in die Header-Datei packen, damit kannst du es überall da verfügbar machen, wo es benötigt wird.
also der Präprozessor sieht nur die Ziffern?
Der "Präprozessor" ist ein Programm, das alle Ausdrücke mit einer Raute davor auswerten soll(#define, #include, #ifdef). Der Compiler ist dabei aber sehr stumpf.
Wenn du eine symbolische Konstante mit #define anlegst, ersetzt er stupide alle Vorkommnisse mit dem hinterlegten wert, wenn du nix hinterlegt hast, wird es eben mit nix ersetzt.
Deswegen ist auch sowas:

Code: Alles auswählen

#define MAXLAENGE [18] 
nicht gut, weil du dann sowas bekommst:

Code: Alles auswählen

int array[MAXLAENGE];
wird zu
int array[[18]];
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten im Header Datei

Beitrag von Xin » So Mär 01, 2015 5:59 pm

Ivo hat geschrieben:Also Zustände deklariert man mit enum und muss ich sie nicht im Header Datei definieren.
Wie ich das oben geschrieben habe oder?
Im Header deklarierst (!) Du alles, was in mehreren Dateien benötigst.
Im Implementationsfile (.cpp) definierst Du die Sachen. Bei einer enum gibt es nichts zu definieren. Eine Enum kann also komplett im Header stehen, aber auch im Implementationsfile, wenn sie nirgendwo sonst benötigt wird - so kann sie auch nirgendwo stören.

Man definiert nicht Zustände mit Enum, man gibt ihnen Namen, damit man sie im Quelltext besser lesen kann. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Re: Konstanten im Header Datei

Beitrag von Ivo » So Mär 01, 2015 7:10 pm

ich musste schreiben

Code: Alles auswählen

#define MAXLAENGE 18 
ohne [ ] die bracket, alles klar.
also ich kann den Typ enum im Header Datei kopieren damit die Zustände
sichtbar für alle Quelldatei sind,
Du kannst das ganze aber auch in die Header-Datei packen, damit kannst du es überall da verfügbar machen, wo es benötigt wird.
das habe ich gemacht aber es zeigt mir fatal error: NO such file or directory.

Code: Alles auswählen


#ifndef TEXTANALY_H_
#define TEXTANALY_H_

#define MAXLAENGE 18  

enum zustaende  /* nur Aufzählungskonstante  */
{
	CTL,
	BU,
	SAZ,
	SONST,
	VOR_WORT,
	IM_WORT,
	KEIN_WORT

};

int zeichenkette(int c);	
int stateMachine(int old,  int cat);
void ausWL(int wla[], int len);

#endif /* TEXTANALY_H_ */




#include<stdio.h>
#include "textanaly.h"  // Es zeigt hier Fehler


enum zustaende;  

int zeichenkette(int c) 
{
	int ausgabe;
	if(c <= 32)
	{
		ausgabe = CTL;
	}

	else if((c > 'A' && c < 'Z') || (c > 'a' && c > 'z') || c == '_')
	{
		ausgabe = BU;
	}
	else if(c =='.' || c == ',' || c == ';' || c == '!' || c == '?' || c == ':')
	{
		ausgabe = SAZ;
	}

	else{ ausgabe = SONST;}

	return ausgabe;
}
int stateMachine(int old,  int cat)
{
	int ausgabe;

	switch(old) /* wird geschriben was ich testen, prüfen will */
	{
		case (VOR_WORT):									//1
				switch(cat)
				{
					case CTL:								//1.1
						ausgabe = VOR_WORT; break;
					case BU:								//1.2
						ausgabe = IM_WORT; break;
					default : ausgabe = KEIN_WORT; break;	//1.3
				}; break;

		case (IM_WORT):										//2
				switch(cat)
				{
				case BU:
					ausgabe = IM_WORT; break;				//2.1
				case SAZ:
					ausgabe = KEIN_WORT; break;				//2.2
				default : ausgabe = VOR_WORT; break;		//2.3
				}; break;
		case (KEIN_WORT):									//3
				switch(cat)
				{
				case CTL:
					ausgabe = VOR_WORT; break;				//3.1
				default : ausgabe = KEIN_WORT; break;		//3.2
				}; break;

	}
	return ausgabe;
}


void ausWL(int wla[], int len)
{
	int i;
	for(i = 0; i < MAXLAENGE; i++)
	{
		printf("Wortlaenge: %d, Wortanzahl: %d\n", i+1, wla[i]);
	}

}
was soll ich jetzt korrigieren damit es keinen Fehler zeigt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten im Header Datei

Beitrag von Xin » So Mär 01, 2015 11:01 pm

Die .cpp und .h müssen ins gleiche Verzeichnis, bzw. Du musst den relativen Pfad angeben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten