Krångel med return värde i C!

Här diskuteras programmering och utveckling
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Krångel med return värde i C!

Inlägg av ZerQ »

Hej

Jag har i skolarbetet gjort en miniräknare som skall använda funktioner men har problem med returvärdet ifrån en funktion. Se koden nedan:

Kod: Markera allt

char felkontroll(cOperator)
{
	/* Nu kontrollerar vi om användaren har anget rätt räknesätt i raden ovan, om det 
	är fel så frågar programmet efter ett korrekt operator. Denna funktion håller kvar 
	användaren så länge som det är fel tecken i inmatningen*/
	while (TRUE){
		if ((cOperator == '+') || (cOperator == '-') || (cOperator == '*') || (cOperator == '/'))
			return;
		else{
			printf("Du har angett felaktigt r\x84knes\x84tt, korrekta \x84r: +, -, *, /\n");
			printf("Ange korrekt r\x84knes\x84tt och avsluta med enter!\n");
			scanf("%c", &cOperator);
			fflush(stdin);
			return cOperator;}}
}
Detta är en nekel felkontroll som skall kolla om användaren har skrivit korrekt tecken i uträkningen, kruxet är att den fungerar alldeles utmärkt tills jag har skrivit in fel värde och else satsen skall åtgärda detta, variabeln cOperator får värdet som jag skriver in men returvärden ifrån funktionen blir samma som skrevs in som fel ifrån början!

Om jag exempelvis har skrivit 5 h 5, då reagerar felkontrollen och vill att jag matar in rätt, skriver då + men får tillbaka h.......

Vart har jag gjort fel?
Säljer massa saker kolla in min hemsida http://www.befta.com
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Krångel med return värde i C!

Inlägg av gasol »

Det första felet du gör är att din funktion är definerad att returnera ett char värde men om operatorn stämmer så returnerar du inget alls utan bara kör return; utan något retur värde.

Det andra felet som finns i koden är att oavsett om cOperator är en giltig operator eller inte så kommer du att returnera den i else satsen.
Vad är det för mening att ha while loopen om du kommer att returnera i första iterationen?

Kod: Markera allt

			printf("Du har angett felaktigt r\x84knes\x84tt, korrekta \x84r: +, -, *, /\n");
			printf("Ange korrekt r\x84knes\x84tt och avsluta med enter!\n");
			scanf("%c", &cOperator);
			fflush(stdin);
			return cOperator; <---- den här vet du inte om den är giltig eller inte så du kan inte returnera den!

edit: Ett tips är att alltid kompilera med -Wall flaggan i gcc och alltid fixxa ALLA varningar du får av gcc, i princip alla varningar man får är fel!
Senast redigerad av 1 gasol, redigerad totalt 5 gånger.
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Krångel med return värde i C!

Inlägg av Smygis »

Jag skulle skriva såhär:

Kod: Markera allt

bool felkontroll(cOperator)
{
	while (true){
		if ((cOperator == '+') || (cOperator == '-') || 
		      (cOperator == '*') || (cOperator == '/'))
			return true;
		else
			return false;
	}
}
och i 'main' ha:

Kod: Markera allt

do{
	//inmatning
while(!felkontroll(variabel));
men det är bara jag.

Men du, Sätt måsarna rätt för helvt.!
return cOperator;}}
ser ut som skit.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Krångel med return värde i C!

Inlägg av gasol »

Loopen i felkontroll är helt onödig du kommer ju att returnera i första iterationen!
Smygis skrev: Jag skulle skriva såhär:

Kod: Markera allt

bool felkontroll(cOperator)
{
	while (true){
		if ((cOperator == '+') || (cOperator == '-') || 
		      (cOperator == '*') || (cOperator == '/'))
			return true;
		else
			return false;
	}
}
och i 'main' ha:

Kod: Markera allt

do{
	//inmatning
while(!felkontroll(variabel));
men det är bara jag.

Men du, Sätt måsarna rätt för helvt.!
return cOperator;}}
ser ut som skit.

The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Krångel med return värde i C!

Inlägg av Smygis »

gasol skrev: Loopen i felkontroll är helt onödig du kommer ju att returnera i första iterationen!
Blä, Jag började ändra på hans sedan sket jag i det. Glömde ta bort loopen :/
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

SV: Krångel med return värde i C!

Inlägg av per9000 »

ZerQ skrev: [...]

Kod: Markera allt

char felkontroll(cOperator)
{
/* ... */
			scanf("%c", &cOperator);
/* ... */
}
[...]
Har du rätt typ här? Du tar in en char? Om jag inte har fel så antas det vara en int om man inte anger typ. Detta kanske ger dig problem när du läser in &cOperator sen också? Du vet: pekare/referens/värde och hela den historien.

/Per
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

SV: Krångel med return värde i C! [LÖST]

Inlägg av ZerQ »

Hej igen och tack för svaren, vad det gäller måsvingarna så är jag inte så konsekvent än på hur jag vill ha det i koden  :-[

Det andra har jag gjort om så jag slapp skicka in det till funktionen och istället gjorde kontrollen direkt i main funktionen. Vart mycket enklare då att få till det riktigt.  :-\
Säljer massa saker kolla in min hemsida http://www.befta.com
Skriv svar

Återgå till "Programmering och webbdesign"