CG - Anfangsprobleme

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.

CG - Anfangsprobleme
Hi!

Hab ein kleines Problem beim lösen der CG Aufgaben.

Das Skirpt, um mein Abgabeverzeichnis anzulegen, habe ich ausgeführt. Wenn ich meine Datei nun dort speichere und mit folgenden Optionen kompiliere meckert er leider. Ich glaub er findet die Library nicht, obwohl ich diese explizit angebe, oder hab ich was vergessen?

g++ A1.1.C -L/proj/i9cg/bgs/A1.1/lib -lbgs -static
A1.1.C:7:25: error: base/stdinc.h: No such file or directory
A1.1.C:8:24: error: base/Image.h: No such file or directory

Danke!


Er findet die header-Dateien base/*.h nicht, die du irgendwo inkludiert hast.

Die Option -v spuckt Statusinformationen aus, darunter auch die Pfade, unter denen er nach header-Dateien sucht.
Du kannst mit -I/path/to/include/dir den Pfad angeben, relativ zu dem die beiden Dateien base/* existieren.

re
Kurze Frage: Bei mir gibt es den entsprechenden Ordner (/proj/i9cg/handin/A1.1/sifrpoll) nicht.
Laut PDF soll da aber das createCgHandin-Skript liegen.
Kommen die Verzeichnisse erst noch oder mache ich was falsch?


danke für die Antwort, das ging zwar aber dann meckert der ld … ich glaub ich muss das libbgs.a File direkt einbinden … ich versuchs weiter!

@ sleipnir: Ja danach hab ich heute auch ne ganze Weile gesucht, vor allem weil es ja explizit auf den Folien steht.

Geh mal in /proj/i9lib/bin (Verzeichnis ist eventuell unsichtbar, einfach reinwechseln) und da liegt dann auch das Skript ;).


Was meinst du mit “direkt einbinden”?
Direkter als die Bibliothek statisch einlinken zu lassen gehts nicht mehr.


Naja ich denk doch mal dass dir Header Files allein mir nicht reichen werden. Und soweit ich das sehe liegen in dem Verzeichnis nur die Header Files …

In der Library müsste dann alles gepackt drin sein … ansonsten versteh ich jetzt gar nix mehr confused :slight_smile:


Wir reden aneinander vorbei. Also:

Du brauchst die header-Dateien, damit der Compiler die Funktionen kennt: -I/path/to/headers/
Du brauchst die Library, damit der Linker die Funktionsreferenzen auflösen kann. entweder full qualified angeben oder mittels -L/-l

War da kein Standard Makefile dabei?
Was meckert denn ld genau?


Ich denke da sollte die nächsten Tage ein fertig gebackenes Makefile erscheinen…
Zumindest hat der Verantwortliche für die Programmieraufgaben doch extra gesagt,
dass man die Header irgendwie in der Form

# include "base/header.h"

einbinden soll und dass das Makefile das dann schon alles entsprechend regeln würde…
Zumindest kann ich mich da an irgendwas erinnern…


Das meckert er:

faui05 [/proj/i9cg/handin/A1.1/sifrpoll]> make
g++  A1.1.C -L/proj/i9cg/bgs/A1.1/lib -I/proj/i9lib/include/bgs -lbgs
/proj/i9cg/bgs/A1.1/lib/libbgs.a(Image.o): In function `Image::Image(char const*)':
Image.C:(.text+0x1980): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_empty_rep_storage'
Image.C:(.text+0x199c): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_empty_rep_storage'
/proj/i9cg/bgs/A1.1/lib/libbgs.a(Image.o): In function `Image::Image(char const*)':
Image.C:(.text+0x2870): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_empty_rep_storage'
Image.C:(.text+0x288c): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_empty_rep_storage'
/proj/i9cg/bgs/A1.1/lib/libbgs.a(Image.o): In function `Image::drawGL(Vector2D, Vector2D) const':
Image.C:(.text+0x45be): undefined reference to `glPixelZoom'
Image.C:(.text+0x45c6): undefined reference to `glRasterPos2dv'
Image.C:(.text+0x45e2): undefined reference to `glDrawPixels'
Image.C:(.text+0x45f4): undefined reference to `glPixelZoom'
collect2: ld returned 1 exit status
make: *** [a1] Error 1

Der zugehörige Quelltext (unverändert bisher) ist:

#include "base/stdinc.h"
#include "base/Image.h"

//=================================================================
// Fill in your code here

// Implement a file writer for PPM files only.
// You can ignore the "type" argument
// Format description: http://netpbm.sourceforge.net/doc/ppm.html
void Image::write(const char* filename, const char* type)
{
}

// Don't edit below this line
//=================================================================

int main(int argc, char** argv)
{
  if (argc != 2) {
    cerr << "usage: " << argv[0] << " <inputFile>" << endl;
    exit(EXIT_FAILURE);
  }

  Image image(argv[1]);
  image.write("A040.ppm", "ppm");

  return EXIT_SUCCESS;
}

jo sorry, seh ich ein!

[quote=langermatze]
Ich denke da sollte die nächsten Tage ein fertig gebackenes Makefile erscheinen…[/quote]

Was mich daran ein bisschen stört ist, dass man bereits nächsten Donnerstag abgeben muss, deswegen erwarte ich halt schon dass alles vorhanden ist um die Aufgabe machen zu können.

Ich hab die gleichen LD-Meldungen …


“glPixelZoom” wird wohl was mit GL zu tun haben → -lGL

Bei den anderen kann ich die Ursache nur vermuten:
Wenn C++ Code aus versch. Quellen zusammengelinkt wird, dann kommt es darauf an, dass der Compiler Code ausspuckt, der dem gleichen ABI (Application Binary Interface) gehorcht; im ABI ist z.B. festgehalten, wie das /function mangling/ vonstattengeht, Calling Convention etc.

Der Standard g++ ist Version 4.1.2, probiert mal den g+±3.3 aus, bei mir hats geklappt.


Hat jemand ne Idee warum keine dieser Möglichkeiten was anderes als 0 zurückliefert?

		Color c(this->getColor(x,y));
//		c=this->getColor(x,y); 
//		c=this->operator()(x,y); 
//		c=(*this)[y][x]; 

Wieso verwendest du this-> und rufst getColor nicht direkt auf?


naja is beim copy und pasten so entstanden


Mach halt nen Breakpoint auf die erste Zeile und schau was passiert.


Wenn sich das auf eine Angabe bezieht, dann können dir da wohl nur CGler helfen - wenn nicht, dann wohl nahezu niemand, es sei denn, er kennt deinen Code.
Interessant wäre z.B. die Deklaration von ? getColor(? x, ? y), die Definition von Color (Oder ist das ein Standarddatentyp?) und evtl. der Quellcode der Klasse auf die sich das this bezieht

Nicht böse gemeint…
Claudius


Vielleicht liegt es daran, dass die Farbkomponenten zwischen 0 und 1 sind. Wenn du das nach int castest, kommt bei allem <1 eine 0 raus. Gib’s dir doch mal mit „cout << c.r << c.g << c.b“ aus.
Also bei mir funktioniert das getColor(x,y) wunderbar und gibt auch von 0 verschiedene Werte zurück.


die Farben werden innerhalb der Image-Klasse wirklich auf das Intervarr [0,1] runtergebrochen.
Du musst das beim Rausschreiben also wieder “hochskalieren” (sprich *255).
Was mir nicht so ganz in den Kopf geht ist der “maximale Farbwert” aus der ppm-spec.
Schon allein die Unterscheidung <255 und >255… Wie lassen sich denn bitte Farbwerte >255 darstellen?
Die spec sagt ja dann, dass die Farbwerte (falls >255) halt mit 2Byte-Werten gespeichert werden müssen (logisch).
Aber wann soll das denn auftreten? Und wie würde man das dann ggf. aus der Image-Klasse sehn? Da hab ich ja alles in [0,1] liegen…


Das mit dem maximalen Farbwert ist eine Sache, die du selbst entscheidest.

Mit dieser Angabe legst du fest, wie groß der höchste zu erwartende Wert für einen der Farbkanäle (r/g/b) ist. Mit 255 hast du schonmal 16 Mio. Farben zur Verfügung (255^3).

Netter Nebeneffekt ist natürlich, dass du dich dann im die Byteorder nicht kümmern musst, weil du nur ein Byte pro Kanal brauchst :wink:

Btw. ist das Referenzfile auch mit einem Byte pro Farbkanal codiert.