C Enum als Rückgabewert

ali7566

Lieutenant
Registriert
Feb. 2007
Beiträge
961
Hallo,

habe hier folgenden Code

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


enum boolean {FALSCH, WAHR};
typedef enum boolean boolean;

int isDouble(char *str)
{
boolean f= FALSCH, w=WAHR;
int i,anz=0;
char gleitKomma[20];

for(i= 0; str != '\0'; i++)
anz++;

for(i= 0; i< anz; i++)
gleitKomma= str;

gleitKomma= '\0';


if((gleitKomma[0] == '+' ^ '-' ^ ( gleitKomma[0] >= '0' && gleitKomma[0] <= '9') ^ '.') && (gleitKomma[i-1]!='.'^'+'^ '-'))
{
return w;
}

else
return f;
}


int main()
{
char s[20];
boolean wert;

printf("Geben Sie eine Gleitkommazahl ein: \n");
scanf("%s", s);
wert= isDouble(s);

if(wert == WAHR)
printf("%s", s);

if(wert == FALSCH)
printf("Eingabefehler \n");

getch();
return 0;
}



Ich habe mir ein enum erstellt mit dem ich quasi boolean imitiere und möchte nun das wenn in der oberen funktion die Bedingung wahr oder falsch ist, eben WAHR oder FALSCH zurückgegeben wird und möchte dies einer Variable gleichen types übergeben. Leider meckert der Compiler, wie könnte ich das am besten lösen ?

Compiler meldung: Ein Wert vom Typ ""int"" kann keiner Entität vom Typ ""boolean"" zugewiesen werden.

jedoch gebe ich doch als rückgabewert ebenso einen "boolean" datentyp zurück der auch in eine Boolean variable gespeichert wird, wo ist da mein Fehler.

Vielen dank und gruß

Ali.
 
Zuletzt bearbeitet:
Ich hätte noch ein anderes problem, ich möchte eine Zeichenkette prüfen, ob sie am anfang +, - und '.' hat und wenn am ende der Zeichenkette kein '-', '+' oder '.' ist soll WAHR ausgegeben werden andernfalls unter einer weiteren Bedingung die sagt das wenn am ende ein '-', '+' und '.' auftaucht das FALSE zurückgegeben wird.

Ich bekomme jetzt mit folgendem Code:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


enum boolean {FALSCH, WAHR};
typedef enum boolean boolean;

boolean isDouble(char *str)
{
boolean f= FALSCH, w=WAHR;
int i,anz=0;
char gleitKomma[20];

for(i= 0; str != '\0'; i++)
anz++;

for(i= 0; i< anz; i++)
gleitKomma= str;

gleitKomma= '\0';


if((gleitKomma[0] == '.' || '-' || '+' || (gleitKomma[0] >= '0' && gleitKomma[0] <= '9')) && (gleitKomma[i-1]!= '-' || '+' ||'.'))
return w;


else if(gleitKomma[i-1]== (('.'||'+') ||'-'))
return f;


}


int main()
{
char s[20];
boolean wert;

printf("Geben Sie eine Gleitkommazahl ein: \n");
scanf("%s", s);
wert= isDouble(s);

if(wert == WAHR)
printf("%s", s);

if(wert == FALSCH)
printf("Eingabefehler \n");

getch();
return 0;
}



immer nur WAHR zurückgegeben, auch wenn ich z.B. 14- schreibe was ja FALSCH sein soll.
 
Zuletzt bearbeitet:
Also zuächst eine persönliche Meinung:

Sowas:
Code:
if((gleitKomma[0] == '.' || '-' || '+' || (gleitKomma[0] >= '0' && gleitKomma[0] <= '9')) && (gleitKomma[i-1]!= '-' || '+' ||'.'))

würde zumindest zu Testzwecken dringend verkürzen bzw. aufteilen.

Dann steht darüber:

Code:
gleitKomma[i]= str[i];

gleitKomma[i]= '\0';

Da heisst Du weisst gleitKomma zuerst den Wert zu der in str steht. Wo ist denn das array namens "str" erstmalig gesetzt worden ?
Danach aber schreibst Du ein '\0' rein. So wie ich das sehe, ist das gesamte array immer mit '\0' vollgeschrieben.

Und wenn Du die obige if-Bedingung mal anschaust, steht da unter anderem als ausreichend Bedingung für ein TRUE:
Code:
gleitKomma[0] >= '0' && gleitKomma[0] <= '9'
Also wenn gleitKomma[0] >='0' UND gleichzeitig <='9'. Hier werden die Werte der ASCII-Tabelle geprüft, auch sowas beachten.


Bau doch mal zur Fehleranalyse ein paar printf-Ausgaben ein. Z.B. welcher Wert das aktuelle array-index hat usw.
Und unbedingt die if-Bedingung mal verkleinern. Durch diese ganzen logischen UND/ODER-Verknüpfungen hat man ganz schnell eine Kleinigkeit übersehen und die gesamte Bedingung wird TRUE...
 
Zuletzt bearbeitet:
lalas schrieb:
Sowas:
Code:
if((gleitKomma[0] == '.' || '-' || '+' || (gleitKomma[0] >= '0' && gleitKomma[0] <= '9')) && (gleitKomma[i-1]!= '-' || '+' ||'.'))

würde zumindest zu Testzwecken dringend verkürzen bzw. aufteilen.

Darüberhinaus ist es falsch :) Bei der || Verkettung muss natürlich wieder ein Ausdruck hin, nicht nur '-' oder '+'
 
Allerdings frage ich mich, wofür du überhaupt ein Enum haben möchtest, als ein Pseudo-Boolean funktioniert? Ein Enum ist auch nichts anderes als ein ganzzahliger Wert.
Somit wird FALSE als 0 und TRUE als 1 ausgewertet. Genauso, wie C es immer macht. Ein Enum ist in C auch nichts weiter als ein Integer. Nur dass die Werte Namen aufweisen können.
Abfragen ala if (variable == TRUE) lässt sich auch eleganter mit if (variable) bzw. für FALSE if (!variable) lösen. Eine Überprüfung nach TRUE oder FALSE ist nicht nötig. Dementsprechend kann man den code
Code:
printf("Geben Sie eine Gleitkommazahl ein: \n");
scanf("%s", s);
wert= isDouble(s);

if(wert == WAHR)
printf("%s", s);

if(wert == FALSCH)
printf("Eingabefehler \n");

gegen

Code:
printf("Geben Sie eine Gleitkommazahl ein: \n");
scanf("%s", s);

if(isDouble(s)) 
  printf("%s", s);
else
  printf("Eingabefehler \n");

tauschen. Wenn isDouble() ungleich 0 ist, kann er nur noch 0 sein. Darum ist die Abfrage nach FALSE schon mal überflüßig.
Ich weiß jetzt nicht, ob isDouble wirklich einen Rückgabewert von ungleich 0 hat, wenn es True ist. Die meisten Funktionen in C geben dort eine 0 zurück und eine 1, wenns False ist. Darum wäre dein Enum schon eine Fehlerquelle.
 
Zuletzt bearbeitet:
ein boolean enum ist quatsch ;)
lass einfach als typ int stehen und gib 0 oder 1 zurück, bzw. entsprechend TRUE oder FALSE (wenns im preprocessor definiert ist).
bei c++ hast du überdies den datentyp bool mit true und false als werte.

außerdem ist die art und weise wie du || verwendest grundlegend falsch!
if((gleitKomma[0] == '.' || '-' || '+' || (gleitKomma[0] >= '0' && gleitKomma[0] <= '9')) && (gleitKomma[i-1]!= '-' || '+' ||'.')

das hier bedeutet so wie du es hingeschrieben hast:
if((gleitKomma[0] == '.' || '-' != 0 || '+' != 0 || (gleitKomma[0] >= '0' && gleitKomma[0] <= '9')) && (gleitKomma[i-1]!= '-' || '+' != 0 ||'.' != 0)

und da '-' != 0 etc. immer wahr ist, ist diese if-bedingung auch immer erfüllt!
 
Zuletzt bearbeitet:
Zurück
Oben