Header Dateien ... wie nutzen ?
-
Okay, das habe ich nun endlich verstanden verstanden. Definieren und Deklarieren musste ich mir nochmal durch den Kopf gehen lassen...
Den Sinn bei so einem kleinen Programm kann ich zwar nicht verstehen, aber vielleicht kommt das spaeter , haha.
#include <stdio.h> #include "globals.h" #include "rational.h" rational load_rational ( int num , int den ) { num = rational.numerator; den = rational.denominator } void print_rational ( rational rat ){ printf ("Your first rational number is: %d / %d", rat.numerator, rat.denominator);\ }
Habe heute mal angefangen zu schreiben, ich weiss das ist noch nichts, aber ich habe schon meine ersten Probleme. Wie vorgegeben sollen wir eine Funktion schreiben die die Rationalen Zahlen laedt. Da es sich um ein struct handelt habe ich gedacht ich fuelle es einfach mit X = structname.variable , aber das scheint nicht zu funktionieren . Ich bekomme immer die Fehlermeldung "expected expression before rational " , woran liegt das ?
-
Hab das jetzt versucht zu loesen, aber das Ergebniss spinnt ... mein Numerator ist mein Denominator aus irgendeinem Grund...
#include <stdio.h> #include "globals.h" #include "rational.h" rational load_rational ( int num , int den ) { rational buffer; buffer.numerator = num; buffer.denominator = den; return buffer; } void print_rational ( rational rat ){ printf (" %d / %d", rat.numerator, rat.denominator);\ }
Was ich im Allgemeinen nicht verstehe ist, wie soll ich ein Struct fuellen was ich in main.c definiert habe, wenn ich es nicht an meine Funktion uebergebe ?
-
In C kannst du Strukturvariablen nicht nur als Parameter übergeben, sondern auch als Rückgabewert nutzen, und das nutzt du im deinem Programm aus.
Den Rückgabewert beim Funktionsaufruf weist du sofort der betreffenden Variable im aufrufenden Kontext zu und fertig.rational r = {1,1}; print_rational( r ); r = load_rational(2,2); /* hier passiert das o.g., also die Strukturinhaltskopie */ print_rational( r );
-
Ja gut, das habe ich doch oben so gemacht, indem ich wie in main.c steht n und d uebergebe. Und dort dann mit load und print rational nutze. Aber warum ist mein denominator mein numerator ?
Wenn ich es ausfuehre und drucke ( printf ) , steht dort anstatt eingelesen 5 und 6 zum Beispiel 6 / 5 ...
-
Schreibfehler.
Zeig deinen Code.
-
DirkB schrieb:
Schreibfehler.
Zeig deinen Code.
#include <stdio.h> #include "globals.h" #include "rational.h" rational load_rational ( int num , int den ) { rational buffer; buffer.numerator = num; buffer.denominator = den; } void print_rational ( rational rat ){ printf (" %d %d", rat.denominator, rat.numerator); } rational add_rational( rational rational1, rational rational2 ){ rational buffer; if ( rational1.denominator == rational2.denominator ){ buffer.denominator = rational1.denominator; buffer.numerator = rational1.numerator + rational2.numerator; } }
add_rational kann ignoriert werden , bringt ja nix wenn ich nicht die richtigen den und num Werte bekomme, bzw. diese getauscht werden
-
Dann schau dir noch mal genau Zeile 20 an.
-
Ohhhh nein nein, das habe ich geandert damit dann endlich das richtige Ergebniss steht. Wenn ich es richtig schreibe rat.num..... / rat.den..... , steht es umgekehrt dort.
Sorry fuer die Verwirrung, ich dachte ich aender es einfach und dann am Ende kommt das richtige raus, aber der "Grader" guckt sich nicht nur den Output an sondern auch den Code
-
Dann bitte den kürzesten vollständigen Code in dem der Fehler auftaucht.
In deinem Beispiel wird print_rational noch nicht mal aufgerufen.Den kürzesten und vollständigen Code in dem der Fehler auftaucht.
Kein "Ich habe gedacht das ist nicht wichtig" und kein "... kann ignoriert werden".
Wenn es nichts mit dem Fehler zu tun hat, schmeiß es raus. Und compilier es auch.
-
DirkB schrieb:
Dann bitte den kürzesten vollständigen Code in dem der Fehler auftaucht.
In deinem Beispiel wird print_rational noch nicht mal aufgerufen.Den kürzesten und vollständigen Code in dem der Fehler auftaucht.
Kein "Ich habe gedacht das ist nicht wichtig" und kein "... kann ignoriert werden".
Wenn es nichts mit dem Fehler zu tun hat, schmeiß es raus. Und compilier es auch.#include <stdio.h> #include "globals.h" #include "rational.h" #include "rational.c" int main( int argc, char *argv[] ) { rational rational1, rational2, rational3 ; int n, d ; printf( "Rational1: Please enter two integer values: " ) ; scanf("%d", &n) ; scanf("%d", &d ); rational1 = load_rational( n , d ) ; printf("\nThe rational number is " ); print_rational( rational1 ) ; printf("\n"); printf( "Rational2: Please enter two integer values: " ) ; scanf("%d", &n) ; scanf("%d", &d ) ; rational2 = load_rational( n, d ) ; printf("\nThe rational number is " ); print_rational( rational2 ) ; printf("\n"); }
#include <stdio.h> #include "globals.h" #include "rational.h" rational load_rational ( int num , int den ) { rational buffer; buffer.numerator = num; buffer.denominator = den; } void print_rational ( rational rat ){ printf (" %d %d", rat.numerator, rat.denominator); }
-
Gibt es auch ein
return buffer;
inload_rational()
-
Jap gab/gibt es. Aendert aber nichts an der Situation leider
Okay, gefixt. Weiss nicht woran es lag, aber jetzt funkt es
#include <stdio.h> #include "globals.h" #include "rational.h" rational load_rational ( int num , int den ) { rational buffer; buffer.numerator = num; buffer.denominator = den; return buffer; } void print_rational ( rational rat ){ printf (" %d %d", rat.numerator, rat.denominator); } rational add_rational( rational rational1, rational rational2 ){ rational buffer; if (rational1.denominator == rational2.denominator){ buffer.denominator = rational1.denominator; buffer.numerator = rational1.numerator + rational2.numerator; } else{ buffer.denominator = rational1.denominator * rational2.denominator; buffer.numerator = ( rational1.numerator * rational2.denominator ) + ( rational2.numerator * rational1.denominator); } return buffer; }
-
Arbeite an deinem Einrückungsstil
z.B.:rational add_rational( rational rational1, rational rational2 ) { rational buffer; if (rational1.denominator == rational2.denominator) { buffer.denominator = rational1.denominator; buffer.numerator = rational1.numerator + rational2.numerator; } else { buffer.denominator = rational1.denominator * rational2.denominator; buffer.numerator = ( rational1.numerator * rational2.denominator ) + ( rational2.numerator * rational1.denominator); } return buffer; }
da kann man viel besser den Programmfluß erkennen.
Das wird dior und auch deinem "Grader" helfen.
-
DirkB schrieb:
Arbeite an deinem Einrückungsstil
z.B.:rational add_rational( rational rational1, rational rational2 ) { rational buffer; if (rational1.denominator == rational2.denominator) { buffer.denominator = rational1.denominator; buffer.numerator = rational1.numerator + rational2.numerator; } else { buffer.denominator = rational1.denominator * rational2.denominator; buffer.numerator = ( rational1.numerator * rational2.denominator ) + ( rational2.numerator * rational1.denominator); } return buffer; }
da kann man viel besser den Programmfluß erkennen.
Das wird dior und auch deinem "Grader" helfen.Okay, vielen Dank
-
Ich habe meine letzte Funktion gereda geschrieben.
bool equal_rational( rational rational1, rational rational2 ) { bool buffer; if( rational1.numerator == rational2.numerator ) { if ( rational1.denominator * rational2.denominator){ buffer = 1; } } else buffer = 0; return buffer; }
aufgerufen wird sie durch main und zwar ...
if ( equal_rational( rational1, rational2 ) ) printf("\nThey are two equal rational numbers.\n"); else printf("\nThe are not equal.\n") ;
Leider gibt es mir aus das 5 / 5 und 5 / 5 ungleich sind und umgekehrt, was mache ich hire falsch ? Habe auch extra noch stdbol.h eingefuegt