funktion in header datei aus hauptprogramm heraus aufrufen
-
Hi @ all,
ich bin relativ neu in C++, desshalb bitte nicht über diese Frage beschweren
bin zwar kein totaler programming-noob mehr (hab schon PHP erfahrungen, aber das ist mit C++ nicht zu vergleichen, ich weiß) aber habe dennoch ein kleines Problem mit Funktionen in C++, die ich in header-dateien auslagern möchte.
Falls dies das falsche Forum ist, bitte verschieben, aber trotz gründlichem gucken kamen mir die anderen Foren nicht so passend vor.
Also, nun zu meinem Problem:
Ich hab ein Programm für die Win-Konsole geschrieben. Dieses soll mit zwei vom User eingegebenen Zahlen rechnen. Zuerst hatte ich die rechenoperationen mit im Quelltext einfach an die entsprechenden stellen gesetzt, aber da ich mich mal mit Funktionen vertraut machen wollte (ohne üben kein können) habe ich sie in eine funktion geschrieben, welche ich am anfang des quellcodes deffieniert habe. dies hat auch so weit geklappt, aber nun finde ich so eine lange funktion im quelltext störend und wollte sie in eine header-Datei auslagern, und dabei kommen die ersten probleme...
Hier mal der Quelltext. ich hoffe ihr könnt mir helfen, ich blick da nicht so ganz durch, wobei ich sonnst solche sachen relativ schnell raffe...
Datei rechner.cpp:
#include <iostream> #include <stdlib.h> #include "rechner" //rechner.h includieren using namespace std; int zustimm = 2; int rechne(double Zahl_1, double Zahl_2, int rechenart); //prototyp der funktion int main(int argc, char *argv[]) { cout << "JDs Taschenrechner v0.1\n"; cout << "Diese Software ist Freeware, darf kostenlos weitergegeben aber NICHT veraendert werden!\n"; cout << "Damit muessen Sie einverstanden sein, sonnst koennen Sie diese Software nicht verwenden!\n"; cout << "\nEinverstanden?\n\n"; cout << " 1 = ja\n"; cout << " 2 = nein\n\n"; cin >> zustimm; while(zustimm == 1) //kontrullieren ob den Bedingungen zugestimmt wurde { double zahl_1; //Locale double zahl_2; //Variablen int rechenart; //deffinieren cout << "\n\nBitte die Rechenart auswaehlen\n"; cout << "\n 1 = Addition"; cout << "\n 2 = Subtraktion"; cout << "\n 3 = Multiplikation"; cout << "\n 4 = Division"; cout << "\n\n"; cin >> rechenart; //gewählte rechenart in variable speichern cout << "\nBitte zwei Zahlen angeben!\n"; cout << "\nAchtung:"; cout << "\nDas Komma (,) bei Kommazahlen muss wie im Englischen durch einen Punkt (.) ersetzt werden! Eine Zahl laesst sich nicht durch 0 teilen!"; cout << "\n\nZahl eins:"; cin >> zahl_1; //erste zahl in variable speichern cout << "Zahl zwei:"; cin >> zahl_2; //zweite zahl in variable speichern rechne(zahl_1, zahl_2, rechenart); //mit funktion "rechne" die rechnung durchführen } }
Datei rechner.h:
int rechne(double Zahl_1, double Zahl_2, int rechenart) { double ergebnis; if(rechenart == 1) // falls rechenart = 1 dann addieren { ergebnis = Zahl_1 + Zahl_2; } if(rechenart == 2) // falls rechenart = 2 dann subtraieren { ergebnis = Zahl_1 - Zahl_2; } if(rechenart == 3) // falls rechenart = 3 dann multiplizieren { ergebnis = Zahl_1 * Zahl_2; } if(rechenart == 4) // falls rechenart = 4 dann dividieren { ergebnis = Zahl_1 / Zahl_2; } cout << "\nErgebnis: " << ergebnis << "\n\n"; // ergebnis ausgeben }
Log des Compilers (dev-c++ 4.9.9.0):
Compiler: Default compiler Führt g++.exe... aus g++.exe "C:\Dokumente und Einstellungen\Jürgen\Desktop\c++\rechner.cpp" -o "C:\Dokumente und Einstellungen\Jürgen\Desktop\c++\rechner.exe" -g3 -I"C:\Dev C-plusplus\include\c++\3.3.1" -I"C:\Dev C-plusplus\include\c++\3.3.1\mingw32" -I"C:\Dev C-plusplus\include\c++\3.3.1\backward" -I"C:\Dev C-plusplus\lib\gcc-lib\mingw32\3.3.1\include" -I"C:\Dev C-plusplus\include" -L"C:\Dev C-plusplus\lib" -g3 C:/Dokumente und Einstellungen/Jürgen/Desktop/c++/rechner.cpp:3:19: rechner: No such file or directory Ausführung beendet
ich hoffe ihr könnt mir helfen, ich komm vor allem mit der compiler-meldung "rechner: No such file or directory" nicht so ganz klar, googlen ergab auch nichts...
vielleicht werdet ihr jetzt sagen, dass mein gesammter code humbug ist, aber dann verzeiht mir bitte, bin halt noch neu in C++... ausserdem hat es ja mit der funktion in der rechner.cpp geklappt...
gruß und danke schon jetzt:
jd-fun
-
Wie wär's it rechner.h?
-
geht auch net, immer dieser fehler... hab ich alles schon versucht...
<rechner>
<rechner.h>
"rechner"
"rechner.h"funzt alles net...
wobei bei "rechner.h" anscheinend erst gar nicht die datei includiert wird, denn dann kann er auch mit der verwendeten funktion in der rechner.cpp nichts anfangen, und sagt die sei nicht bekannt... bei den anderen bleibt dieser fehler aus, also denke ich, dass dort die datei zwar includiert aber irgendwie nicht koreckt verwendet wird...
ich erkenn den fehler im code einfach nicht, hab noch zu wenig erfahrung in C++... und das, wo ich mich ja nicht erst seit gestern mit programmierung im allgemeinen (jetzt mal egal, welche sprache) beschäftige
und kann man seit dem neuesten C++-standart das ".h" nicht sogar weglassen bzw. muss dies sogar?
aber danke für die schnelle hilfe, echt super!
gruß:
jd-fun
-
OK, hab den Fehler jetzt selber gefunden
hatte in der header-datei vergessen den namensraum aufzuheben...ein
using namespace std;
in die rechner.h und jetzt fuzt es einwandfrei!
danke dir trptzdem, du hast mir den denkanstoß gegeben, nochwas rumzu experimentieren...
gruß:
jd-fun
-
Trotzdem sollte man dich drauf hinweisen, dass du deine Headerdatei falsch anwendest.
In Headerdateien sollten immer nur Deklarationen stehen!
Hier ein Beispiel wie man es machen sollte und auch normalerweise gemacht wird:main.cpp
#include <iostream> #include "rechne.h" int main(void) { double laenge = 5, breite = 7, flaeche; cout << laenge << " * " << breite << " = "; flaeche = rechne_flaeche(laenge, breite); cout << flaeche; return(0); }
rechne.h
#ifndef RECHNE_H #define RECHNE_H double rechne_flaeche(double p_laenge, double p_breite); #endif
rechne.cpp
double reche_flaeche(double p_laenge, double p_breite) { return(p_laenge * p_breite); }
Wenn du eine IDE hast und ein Projekt, dann musst du alle .cpp bzw. .c Dateien dem Projekt hinzufügen, damit alles compiliert und dann auch richtig zusammengelinkt wird.
Wenn du noch Fragen hast, frag einfach
(ich geh mal davon aus du hast welche :D).
-
jo, hab ich
und zwar frage ich mich, wo der unterschied zwischen header- und source-dateien liegt... heißen die einfach der übersicht halber anders?
und warum so umständlich?
kann man, wenn die deklaration schon nichts in der haupt-datei zu suchen hat, sie nicht zum beispiel noch in die nebendatei mit der funktion packen? weil wenn ich eine funktion in eine externe datei packe, dann ja auch, um sie in anderen projekten oder dateien des selben projektes wieder verwenden zu können... und umso weniger dateien ein projekt umfasst, umso übersichtlicher ist es... und umso leichter lassen sich fehler finden...ich mein, ihr habt mehr erfahrung, und ich möchte dies hier auch gar nicht anzweifeln, abger wenn ihr mir erklären könntet, warum dies so sein sollte, dann verstehe ich es auch... und verstehen = lernen
und noch eine hab ich:
kennt jemand eine seite, wo alle fehlermeldungen des dev-c++ einmal aufgeführt und erklärt sind? weil wenn ich eine zeilennummer hab, aber nicht weiß, was der complier an dieser zeile auszusetzen hat, kann ich den fehler nicht so einfach bis gar nicht finden, wenn ich allerdings die fehlermeldungverstehe, weiß ich schonmal, was dem compiler am code nicht recht ist und kann dann den fehler (versuchen zu :)) beheben...gruß:
jd-fun
-
jd-fun schrieb:
...weil wenn ich eine funktion in eine externe datei packe, dann ja auch, um sie in anderen projekten oder dateien des selben projektes wieder verwenden zu können...
Genau deshalb wird das so "umständlich" gemacht.
Wenn du Deklaration und Definition in eine Datei steckst und diese in verschiedenen anderen Dateien includierst, dann wird dir der Compiler anmeckern, dass du die Funktion mehrfach anlegst (Darum auch das #ifndef ... #endif in der Headerdatei).
Dann hat es noch den Grund, dass du Deklaration und Definition trennst. Du könntest ja auch den Source deiner Funktion in eine Library oder DLL stecken, aber wie willst du jetzt dem Compiler beibringen, dass da eine Funktion ist, die er aber nicht compilieren kann. Du müsstest alle möglichen Deklarationen per Hand in deine Dateien einbauen und dann auch noch aufpassen, dass du sie nicht doppelt deklarierst. Deswegen ist es einfacher die Headerdatei zur Bibliothek einzufügen, denn da sind bereits alle Deklarationen für die Funktionen drin und du brauchst einfach nur noch die Funktionen verwenden, wenn du die Headerdatei includiert hast.
Bestes Beispiel dafür sind die Standardfunktionen, wie z. B. printf() oder in C++ cout. Du musst nur den Header includieren und schon kannst du es verwenden. Stell dir mal vor du müsstest die Klassendeklaration zu cout erst manuell anlegen, bevor du es benutzt.Ich hoffe das war verständlich genug erklärt (ist nicht ganz so einfach :)). Wenn nicht, frag einfach nochmal genauer nach ;).
-
stimmt, da ist was drann!
so hab ichs noch gar nicht betrachtet, aber es stimmt...weil wenn die deklaration mit in der datei für die funktion ist, kann man nicht mittel #ifndef und #endif dafür sorgen dass sie nicht mehrmals deklariert wird... weil wenn ich damit die ganze cpp-datei mit definition und deklaration ausschließe ist für andere dateien als die hauptdatei die funktion nicht verfügbar, wenn nicht, dann kommt ein compilerfehler... auf deine weise hab ich die funktion überall und kann nur die deklaration ausschließen...
geschickt!
danke für die antworten, ich glaub ich komm jetzt öfter hier ins bord bei meinen probs! bin vorher immer in meine lieblings-community gegangen, aber die ist hauptsächlich webdesign und hat nur ein paar c++-coder und nur eine programming-kategorie "Sonnstiges" (neben PHP, HTML, JavaScript etc.) wo ich das immer reingepackt habe... Hier ist es aber ja ausschlißlich für C++!
gruß:
jd-fun