Hallo Lug,
mal wieder was ganz banales...Ich uebe gerade Wertuebergabe in C.
Ueber eine Fkt., die int zurueckgibt, komme ich aber irgendwie nicht hinaus: "float fkt()" bringt mir Warnungen beim Compilieren und gibt fantastische Werte zurueck. Habe schon diverse Literatur durchgeguckt...
Kann mir jemand einen Tip geben? Torsten
Die Warnungen:
gcc -o aufgabe14 aufgabe14.c
aufgabe14.c:34: warning: type mismatch with previous implicit declaration aufgabe14.c:26: warning: previous implicit declaration of `calc' aufgabe14.c:34: warning: `calc' was previously implicitly declared to return `int'
#include <stdio.h>
int main(void)
{ float x,y; char op;
printf("\n\n\n------------------------------------\n"); printf("| Kleinrechner Vers. 1 |\n"); printf("| Grundrechenarten - max 2. Zahlen |"); printf("\n------------------------------------\n\n\n"); printf("Nur Integer-Werte!\n"); printf("Operatoren: +,-,*,/\n\n"); printf(">> ");scanf("%f%c%f",&x,&op,&y);
if(op=='+'||op=='-'||op=='*'||op=='/') { /*printf("\nOperator: OK...");*/ if(y==0 && op=='/') printf("\n>> ...Division durch Null\n\n"); /*else printf("\n\nEinen Moment......\n");*/ } else printf("\nSyntax Fehler: %c kein Operator",op);
calc(&x,&y,&op); if(calc(&x,&y,&op)==EOF) printf(">> = Fehler\n\n\n"); else printf("\n>> = %f\n\n\n",calc(&x,&y,&op)); }
float calc(float *ix, float *yp, char *op) { float gibt;
switch(*op) { case '+': gibt=*ix+*yp;break; case '-': gibt=*ix-*yp;break; case '*': gibt=(*ix)*(*yp);break; case '/': if(*yp!=0) gibt=(*ix)/(*yp); else gibt=EOF; default: gibt=EOF;break; }
return(gibt); }
Torsten Lange wrote:
Hallo Lug,
mal wieder was ganz banales...Ich uebe gerade Wertuebergabe in C.
Ueber eine Fkt., die int zurueckgibt, komme ich aber irgendwie nicht hinaus: "float fkt()" bringt mir Warnungen beim Compilieren und gibt fantastische Werte zurueck. Habe schon diverse Literatur durchgeguckt...
Kann mir jemand einen Tip geben? Torsten
*nachschau* ... hm nichts leichter als das ...
Die Warnungen:
gcc -o aufgabe14 aufgabe14.c
aufgabe14.c:34: warning: type mismatch with previous implicit declaration aufgabe14.c:26: warning: previous implicit declaration of `calc' aufgabe14.c:34: warning: `calc' was previously implicitly declared to return `int'
#include <stdio.h>
int main(void)
{ float x,y; char op;
printf("\n\n\n------------------------------------\n"); printf("| Kleinrechner Vers. 1 |\n"); printf("| Grundrechenarten - max 2. Zahlen |"); printf("\n------------------------------------\n\n\n"); printf("Nur Integer-Werte!\n"); printf("Operatoren: +,-,*,/\n\n"); printf(">> ");scanf("%f%c%f",&x,&op,&y);
if(op=='+'||op=='-'||op=='*'||op=='/') { /*printf("\nOperator: OK...");*/ if(y==0 && op=='/') printf("\n>> ...Division durch Null\n\n"); /*else printf("\n\nEinen Moment......\n");*/ } else printf("\nSyntax Fehler: %c kein Operator",op);
calc(&x,&y,&op);
Wenn ich richtig sehe, ist das hier das erste Auftreten der Fkt. calc(). Da sie hier keinen Rueckgabewert hat und auch vorher kein Prototyp da war, wird der Standardrueckgabewert int angenommen ...
if(calc(&x,&y,&op)==EOF) printf(">> = Fehler\n\n\n"); else printf("\n>> = %f\n\n\n",calc(&x,&y,&op)); }
float calc(float *ix, float *yp, char *op)
Was dann hier natuerlich zu Konflikten fuehrt ...
{ float gibt;
switch(*op) { case '+': gibt=*ix+*yp;break; case '-': gibt=*ix-*yp;break; case '*': gibt=(*ix)*(*yp);break; case '/': if(*yp!=0) gibt=(*ix)/(*yp); else gibt=EOF; default: gibt=EOF;break; }
return(gibt); }
Die Loesung habe ich ja schon fast gesagt. Einfach einen Prototyp fuer die Ftk. calc vor die main-Fkt. schreibt ... also in etwa so:
float calc(float *, float *, char *);
Ungetestet. Falls das nicht hilft, frag' mal nochmal. Dann schau ich naeher hin ...
Bye.
Jens
On Mon, Apr 03, 2000 at 09:06:56PM +0200, Torsten Lange wrote: : Hallo Lug, : : mal wieder was ganz banales...Ich uebe gerade Wertuebergabe in C. : : Ueber eine Fkt., die int zurueckgibt, komme ich aber irgendwie nicht : hinaus: "float fkt()" bringt mir Warnungen beim Compilieren und gibt : fantastische Werte zurueck. Habe schon diverse Literatur durchgeguckt... : : > gcc -o aufgabe14 aufgabe14.c : aufgabe14.c:34: warning: type mismatch with previous implicit : declaration : aufgabe14.c:26: warning: previous implicit declaration of `calc' : aufgabe14.c:34: warning: `calc' was previously implicitly declared to : return `int'
Da brauchen wir den Rest garnicht ansehen. Du hast wahrscheinlich Deine Funktion definiert, nachdem sie verwendet wurde.
Wenn eine Funktion vor der ersten Benutzung nicht _deklariert_ (Prototyp) wurde, nimmt der Compiler an, es handelt sich um `int f()', wobei der Typ und die Anzahl der Parameter keine Rolle spielt.
Diese `automatische' Deklartion beisst sich natuerlich mit der spaeteren wirklichen _Definition_.
Loesung:
(A) Funktion _vor_ der Verwendung definieren. (Also main() als letzte Funktion in Deiner Datei.) Ist aber m.E. eher unueblich.
(B) Funktion erst deklarieren (Prototyp). Dann muessen aber auch Typ und Anzahl der Parameter stimmen.
#include ....
float calc(float, float);
int main(int argc, char **argv) { ... }
float calc(float a, float b) { float r; ... return r; }
PS: Eine sehr gute Investition ist:
Programmieren in C, Kernighan & Richie (also die, die's wissen muessen, und obendrein ist's auch sehr (!) gut aufgebaut. Es ist m.E. _das_ Standardwerk schlechthin.)
Heiko
lug-dd@mailman.schlittermann.de