c++ fel meddelande: make: *** [run] Error 1

Permalänk
Medlem

c++ fel meddelande: make: *** [run] Error 1

Hej!

jag får inge problem under compile, men när jag kör så får jag "make: *** [run] Error 1" vilket jag inte riktigt förstår.

main.cpp

#include "person.h" #include <iostream> using std::cout; void print(person p) { cout << p; } int main() { person p1; p1.name = "Testname1"; p1.age = 14; p1.length = 3.1464667; person p2(p1); p2.name = "Testname2"; print(p1); print(p2); return 0; }

Person.h

#include <string> #include <iostream> using std::string; using std::ostream; using std::endl; struct person { string name; int age; double length; }; ostream operator << (ostream& lhs, person& rhs){ lhs << rhs.name << ", " << rhs.age << ", " << rhs.length << endl; }

vad beror detta på?

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

min åsikt är att ut skriften ska vara:

$ ./out.a $ Testname1, 14, 3.1464667 $Testname2, 14, 3.1464667 $

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk

Som standard borde g++ döpa den körbara filen till "a.out" inte "out.a".
Vill du ändra det så använd -o. Till exempel

g++ main.c -o test

Så får du en exekverbar fil med namnet test istället.

#include <string> #include <iostream> using std::string; using std::ostream; using std::endl; struct person { string name; int age; double length; }; void operator << (ostream& lhs, person& rhs){ lhs << rhs.name << ", " << rhs.age << ", " << rhs.length << endl; }

Permalänk
Medlem

min Makefile

comp: main.cpp g++ -o Labb1 main.cpp run: Labb1 ./Labb1

när jag kör programmer:

$make run $./Labb1 $Testname1, 14, 3.14647 $make: *** [run] Error 1

så de är inte de som är felet bara jag som slarva lite när jag skrev inlägget.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Datavetare

Att ditt program överhuvudtaget kompilerar visa hur extremt fula / komplicerade buggar man kan åka på med C++

Du har gjort ett väldigt litet fel, som leder till minnesöverskrivning i print(p1);

Din överlagring av << väljs, men den har fel returnvärde. Den måste returnera den ström du skickar in och göra det by-reference. Din kod skapar en ny ström med default ctor och den lär nog mest innehålla skräp...

Du kan t.ex. göra denna ändring

ostream& operator << (ostream& lhs, person& rhs){ return lhs << rhs.name << ", " << rhs.age << ", " << rhs.length << endl; }

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk

Så här borde en mer korrekt variant se ut.

#include <string> #include <iostream> using std::string; using std::ostream; using std::endl; struct person { string name; int age; double length; }; ostream& operator << (ostream& lhs, person& rhs){ lhs << rhs.name << ", " << rhs.age << ", " << rhs.length << endl; return lhs; }

Skillnaden mot tidigare är att i det här fallet går det att anropa utskrift av struct person flera gånger.

void print(person p) { cout << p<<p<<p; }

Permalänk

För övrigt är det inte bra att blanda stora och små bokstäver. Man bör vara konsekvent. Om du har stor bokstav på filen Person.h så bör du även ha det när du inkluderar den genom include.

Man bör även låta bli blanda in "kod" i h-filen. Där bör endast finnas deklarationen och variabler. Hela funktionen "ostream& operator << (...)" borde antingen flyttats till main.cpp eller till en egen fil, person.cpp.

person.h

#include <string> #include <iostream> using std::string; using std::ostream; using std::endl; struct person { string name; int age; double length; }; ostream& operator << (ostream& lhs, person& rhs);

person.cpp

#include "person.h" ostream& operator << (ostream& lhs, person& rhs){ lhs << rhs.name << ", " << rhs.age << ", " << rhs.length << endl; return lhs; }

Sen ska man inte glömma att lägga till person.cpp i kompileringsraden.

g++ -o Labb1 main.cpp person.cpp

Lycka till med kodandet i fortsättningen :).

Edit:
Med utökade varningar så hade kompilatorn hittat det här felet själv.

g++ -o Labb1 main.cpp -Wall

In file included from main.cpp:1:0: person.h: I funktion ”std::ostream operator<<(std::ostream&, person&)”: person.h:19:1: varning: ingen retursats i funktion som returnerar icke-void [-Wreturn-type]

Permalänk
Medlem

var bara return lhs; tack allesammans!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6