Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Fehler in Angabe zur A1
Das mit dem Makefile für die Aufgabe 1 war wohl nix… :-p
A1 hängt garnicht von den *.o ab sondern direkt von den *.cpp, dadurch werden die CXXFLAGS garnicht benutzt. Hmm, die src files haben windows zeilenenden…
Patch:
Der Complex::operator-() darf natürlich keine Referenz zurückgeben (complex.h):
class Complex {
//...
public:
Complex operator-();
/..
}
Sonst müßte man entweder eine Referenz auf eine lokale Variable zurückgeben oder ein neues Objekt auf dem Heap erzeugen… beides keine wirklich gute idee…
Stimmt, das ist in der Tat ein Fehler. Danke fuer den Hinweis!
Complex operator-();
Bitte aendert das entsprechend in der Complex.h und Complex.cpp ab. Bei neuen Handins habe ich das ganze angepasst.
Es ist Absicht, dass keine *.o gebildet werden. Dadurch wird naemlich erzwungen, dass matrix.cpp immer mit kompiliert wird. Dein Makefile hat genau das Probelem was dadurch verhindert wird: Wenn du (mit deinem Makefile) in der matrix.cpp eine Aenderung machst wird es nicht neu kompiliert!!!
Die CXXFLAGS werden in der Tat nicht benutzt, was allerdings nicht weiter tragisch ist; wenn ihr Flags verwenden wollt koennt ihr das Makefile natuerlich gerne anpassen. Prinzipell soll das Makefile nur eine kleine Hilfe sein (ich habe das Default Makefile aber geaendert, sodass die Flags mit benutzt werden):
Es wird zwar eine .o Datei erstellt, aber die ganzen Funktionen kann er nicht kompilieren, weil er die konkreten Templates noch nicht kennt. Ausfuehrbarer Code wird erst bei Instanziierung erstellt (hier mit der main.cpp).
Der Inhalt von matrix.cpp kompiliert wenn du
g++ -Wall -g -DLINUX -Werror -pedantic -c main.cpp -o main.o
ausfuehrst.
Das wird bei dir beim zweiten mal naemlich nicht mehr gemacht, daher ist dein Makefile schlecht
Du kannst das Phaenomaen ganz einfach mal testen indem du irgendwas in dein print() in matrix.cpp reinschreibst und dann erneut make machst. Du wirst fesstellen, dass deine Aenderungen nicht realisiert werden.
das scheint dann wohl auch der grund zu sein, warum ich im visual studio nie änderungen, die ich in der matrix.cpp gemacht hab, angezeigt bekommen hab, ausser ich hab was an der main.cpp geändert…
2D-Arrays koennen ineffizient werden, daher ist es wohl im Allgemeinen besser 1D Arrays zu verwenden
Man muesste ja etwas in der Art dann machen:
T** array = new T*[size_x];
for (unsigned int i = 0; i < size_x; i++) {
array[i] = new T[size_y];
}
Zum einen waeren es dann size_x + 1 Speicherallociierungen (im Gegensatz zu einer einzigen) und zum anderen kann es passieren die ganzen Subarrays wild verstreut im Speicher liegen. Das waere wiederrum fuer Cachingeffekte schlecht.
Ah, OK, ich war erst bei der Complex-Klasse und mir war nicht klar, dass Matrix eine Template-Klasse ist.
Aber man kann es „richtig“ machen, in dem man Abhängigkeiten angibt oder sie vom gcc generieren läßt (GNU make Manual: 4.14 Generating Prerequisites Automatically).