Taschenrechnerproblem - compiler liefert "undefined reference to"
-
Hallo

Ich lerne gerade C++ und habe damit angefangen einen simplen Taschenrechner zu programmieren. Nach einiger Zeit kam ich zu dem Punkt an dem ich ausprobieren wollte den Taschenrechner in zwei Module aufzuspalten. Das hat alles prima funktioniert, doch heute wollte ich die Option auch mehrere Werte miteinander zu addieren hinzufügen. Der Compiler liefert mir nun:
obj/Debug/main.o||In function `main':| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|39|undefined reference to `addition(long, long)'| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|46|undefined reference to `addition(long, long, long)'| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|53|undefined reference to `addition(long, long, long, long)'| ||=== Build finished: 3 errors, 0 warnings ===|Bei addition mit 5 Parametern kommt komischer Weise kein Fehler... Hier der Gesamte Code der main.cpp:
#include <iostream> #include <iomanip> #include "calcfunctions.h" using namespace std; int main() { int choosen_number; //type of calculation that the user has choosen long number1, number2, number3, number4, number5; // Entered numbers --> program shall calculate with them cout << "Press: " << endl; cout << "1 for an addition" << endl; cout << "2 for a subtraction" << endl; cout << "3 for a multiplication" << endl; cout << "4 for a division" << endl; cout << "5 to square" << endl; cin >> choosen_number; if(choosen_number == 1) { unsigned int input; cout << "With how many numbers?" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; cin >> input; if(input == 2) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2; long result = addition(number1, number2); cout << "The result is " << result << endl; } else if (input == 3) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3; long result = addition(number1, number2, number3); cout << "The result is " << result << endl; } else if (input == 4) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3 >> number4; long result = addition(number1, number2, number3, number4); cout << "The result is " << result << endl; } else if(input == 5) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3 >> number4 >> number5; long result = addition(number1, number2, number3, number4, number5); cout << "The result is " << result << endl; } else { cout << "More or less numbers are not possible (yet)" << endl; } } else if(choosen_number == 2) { cout << "Type in the first number of your subtraction (note: if you want to calculate 10 - 5 the number would be 10):" << endl; cin >> number1; cout << "Type in the second number:" << endl; cin >> number2; long result = subtraction(number1, number2); cout << "The result is: " << result << endl; } else if(choosen_number == 3){ cout << "Type in the first number: " << endl; cin >> number1; cout << "Type in the second number: " << endl, cin >> number2; long result = multiplication(number1, number2); cout << "The result is: " << result << endl; } else if(choosen_number == 4) { cout << "Type in the first number (Note: if you would want to calculate 10 / 5, it would be 10): " << endl; cin >> number1; cout << "Type in the second number: " << endl; cin >> number2; division(number1, number2); } else if(choosen_number == 5) { cout << "Type in the number you want to square: " << endl; cin >> number1; long result = square(number1); cout << "The result is: " << result << endl; } else if(choosen_number == 3011995){ //Little easteregg because every programm should have one :D cout << "Thats my birthday ;)" << endl; } else { cout << "Don't hesitate, I'm propably out working on more features :D" << endl; } return 0; }Der Code der types_of_calc.cpp:
#include <iostream> #include <iomanip> using namespace std; long addition(long a, long b, long c=0, long d=0, long e=0) { return(a + b + c + d + e); } long subtraction(long x, long y) { return(x - y); } long multiplication(long x, long y) { return(x * y); } int unsigned division(long x, long y) { if(y != 0) { long result = x / y; cout << "The result is: " << result << endl; cout << "The remainder is: " << x % y << endl; return 0; } else { cout << "Devide by 0 error" << endl; return 0; } } long square(long x) { return(x * x); }Und schließlich noch der Code der Header Datei:
#ifndef CALCFUNCTIONS_H_INCLUDED #define CALCFUNCTIONS_H_INCLUDED long addition(long, long); long addition(long, long, long); long addition(long, long, long, long); long addition(long, long, long, long, long); long subtraction(long, long); long multiplication(long, long); long division(long, long); long square(long); #endif // CALCFUNCTIONS_H_INCLUDEDIch bin noch am Anfang meines C++ Studiums, das heißt auch hinweise auf formale Verbesserungen sind sehr erwünscht. (Meinen Code würde man wahrscheinlich spaghetti-code nennen, oder?
)
-
Du deklarierst im Header 4 addition-Funktionen, definierst aber in der cpp nur eine (mit 5 Parametern). Die anderen fehlen dann eben. Vermutlich wolltest du ja auch nur eine Funktion mit default-Parametern. Dazu musst du die Defaultwerte (=0) in den Header schreiben. Im cpp dürfen sie dann nicht mehr stehen. Die Funktionsdeklarationen mit weniger als 5 Parametern müssen entfernt werden. Dann sollte es gehn.
-
Erstmal vielen Dank für die Antwort

Also ich hab jetzt im Header die Zeiler folgendermaßen ausgebessert:
long addition(long, long, long=0, long=0, long=0);Ist das richtig?
Dazu hab ich in der nicht-main .cpp, also der types_of_calc.cpp die Defaultwerte entfernt, aber ich bekomme dennoch Fehler beim kompilieren.
Er meldet mir:obj/Debug/main.o||In function `main':| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|39|undefined reference to `addition(long, long, long, long, long)'| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|46|undefined reference to `addition(long, long, long, long, long)'| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|53|undefined reference to `addition(long, long, long, long, long)'| /home/david/Dropbox/C++lernen/Taschenrechner/main.cpp|60|undefined reference to `addition(long, long, long, long, long)'| ||=== Build finished: 4 errors, 0 warnings ===|
-
Hast du die andere .cpp auch richtig im Projekt in deiner IDE eingefügt bzw. gibst du sie im makefile oder der Kommandozeile auch richtig an den Linker weiter?
-
Da es vorher mit dem Aufruf mit 5 Werten geklappt hat, hast du vermutlich etwas beim Entfernen der Defaultwerte falsch gemacht. Wie sieht die cpp denn jetzt aus?
-
Also hier nochmal wie alle im Moment aussehen:
main:#include <iostream> #include <iomanip> #include "calcfunctions.h" using namespace std; int main() { int choosen_number; //type of calculation that the user has choosen long number1, number2, number3, number4, number5; // Entered numbers --> program shall calculate with them cout << "Press: " << endl; cout << "1 for an addition" << endl; cout << "2 for a subtraction" << endl; cout << "3 for a multiplication" << endl; cout << "4 for a division" << endl; cout << "5 to square" << endl; cin >> choosen_number; if(choosen_number == 1) { unsigned int input; cout << "With how many numbers?" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; cin >> input; if(input == 2) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2; long result = addition(number1, number2); cout << "The result is " << result << endl; } else if (input == 3) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3; long result = addition(number1, number2, number3); cout << "The result is " << result << endl; } else if (input == 4) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3 >> number4; long result = addition(number1, number2, number3, number4); cout << "The result is " << result << endl; } else if(input == 5) { cout << "Type in all the numbers (seperate them by pressing the enter key): " << endl; cin >> number1 >> number2 >> number3 >> number4 >> number5; long result = addition(number1, number2, number3, number4, number5); cout << "The result is " << result << endl; } else { cout << "More or less numbers are not possible (yet)" << endl; } } else if(choosen_number == 2) { cout << "Type in the first number of your subtraction (note: if you want to calculate 10 - 5 the number would be 10):" << endl; cin >> number1; cout << "Type in the second number:" << endl; cin >> number2; long result = subtraction(number1, number2); cout << "The result is: " << result << endl; } else if(choosen_number == 3){ cout << "Type in the first number: " << endl; cin >> number1; cout << "Type in the second number: " << endl, cin >> number2; long result = multiplication(number1, number2); cout << "The result is: " << result << endl; } else if(choosen_number == 4) { cout << "Type in the first number (Note: if you would want to calculate 10 / 5, it would be 10): " << endl; cin >> number1; cout << "Type in the second number: " << endl; cin >> number2; division(number1, number2); } else if(choosen_number == 5) { cout << "Type in the number you want to square: " << endl; cin >> number1; long result = square(number1); cout << "The result is: " << result << endl; } else if(choosen_number == 3011995){ //Little easteregg because every programm should have one :D cout << "Thats my birthday ;)" << endl; } else { cout << "Don't hesitate, I'm propably out working on more features :D" << endl; } return 0; }types_of_calc.cpp:
#include <iostream> #include <iomanip> using namespace std; inline long addition(long a, long b, long c, long d, long e) { return(a + b + c + d + e); } long subtraction(long x, long y) { return(x - y); } long multiplication(long x, long y) { return(x * y); } int unsigned division(long x, long y) { if(y != 0) { long result = x / y; cout << "The result is: " << result << endl; cout << "The remainder is: " << x % y << endl; return 0; } else { cout << "Devide by 0 error" << endl; return 0; } } long square(long x) { return(x * x); }header:
#ifndef CALCFUNCTIONS_H_INCLUDED #define CALCFUNCTIONS_H_INCLUDED /*long addition(long, long); long addition(long, long, long); long addition(long, long, long, long);*/ long addition(long, long, long=0, long=0, long=0); long subtraction(long, long); long multiplication(long, long); long division(long, long); long square(long); #endif // CALCFUNCTIONS_H_INCLUDEDdanke schonmal

-
Warum steht denn im cpp jetzt inline vor addition?
-
haha ich bin ein idiot
da hab ich vorhin ein bisschen rumgespielt aber jetzt geht es.. tut mir leid, ich hoff ich hab nicht zu sehr deine zeit verschwendet..auf jeden fall vielen dank, das ist ein großartiges forum
