• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

x11 window unter c++

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
moin!

brauche zwecks studium ein x11 window unter c++, sprich ich möchte bestimmte simulationen in c++ über ein x11 window grafisch darstellen. in der vorlesung wurde uns ein c++-programm bereitgestellt, ist aber für linux konzipiert. wenn ich es unter mac (os 10.3.9) laufen lasse (x11 ist installiert und läuft soweit fehlerfrei), gibt er mir folgende fehlermeldung (sonst keine weiteren):

ld: Undefined symbols:
_main
_XCheckTypedEvent
_XClearWindow
_XCloseDisplay
_XCreateGC
_XCreateSimpleWindow
_XDestroyWindow
_XDrawLine
_XDrawPoint
_XFreeGC
_XLookupString
_XMapRaised
_XNextEvent
_XOpenDisplay
_XSelectInput
_XSetBackground
_XSetForeground
_XSetStandardProperties
___gxx_personality_v0

was muss ich ändern, damit es funktioniert?? oder hat jemand einen anderen code??

hier dass uns bereitgestellte programm:

//*****************************************************************************
// Simple graphics interface for X11 Windows, by Haye Hinrichsen
//*****************************************************************************

#ifdef HAYE_WINDOWS
#else
#define HAYE_WINDOWS

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

class XWindow
{
private:
Display *display; // Display handler
Window window; // Window handler
GC gc,gc2; // device context
XEvent event; // event flag
KeySym key;
char PressedKey, KeyIsPressed; // keypress flag
XSizeHints hint;
int screen, sizex, sizey, ypos;
unsigned long foreground, background;

public:
XWindow (void); // Konstruktor
// Farbtabelle RGB:
void Red (void) { XSetForeground(display, gc, 0xFF0000L); }
void Yellow (void) { XSetForeground(display, gc, 0xFFFF00L); }
void Green (void) { XSetForeground(display, gc, 0x00FF00L); }
void Blue (void) { XSetForeground(display, gc, 0x0000FFL); }
void Violet (void) { XSetForeground(display, gc, 0xFF00FFL); }
void Black (void) { XSetForeground(display, gc, 0x000000L); }
void White (void) { XSetForeground(display, gc, 0xFFFFFFL); }

void Open (int x=600, int y=400, char* title = "Simulation");
void Close(void);
void Clear (void) { XClearWindow(display, window); ypos=0; }
void Plot (int x, int y);
void Plot (int x, int y, int c);
void DrawLine (int x1, int y1, int x2, int y2);
void SetColor(double c);
void PlotState (int state[], int size, int xshift=0);
void PlotColorState (int state[], int size, int xshift=0);
void DecreaseYcoord (void) { ypos--; }
bool KeyPressed (void);
char GetCharacter (void) { KeyIsPressed=0; return (PressedKey); }
int GetX (void) { return sizex; }
int GetY (void) { return sizey; }
char WaitForKeypress (void) { while (! KeyPressed()); return GetCharacter(); }
void Wait (void) { while (! KeyPressed()); GetCharacter(); }
};

/////////////////// DEFINITION OF VARIOUS FUNCTIONS //////////////////////////

//-------------------------------Constructor---------------------------------

XWindow::XWindow (void)
{ PressedKey=0, KeyIsPressed=0; ypos=0; }


//-------------------------------Open Window---------------------------------

void XWindow::Open (int x, int y, char* title)
{
sizex = x; sizey = y;
display = XOpenDisplay("");
if(! display)
{
printf("### Error: Failed to open display !###\n");
exit(1);
}
screen = DefaultScreen(display);
background = WhitePixel(display, screen);
foreground = BlackPixel(display, screen);
hint.x = 200;
hint.y = 300;
hint.width = x;
hint.height = y;
hint.flags = PPosition | PSize;
window = XCreateSimpleWindow(display, DefaultRootWindow(display),
hint.x, hint.y, hint.width, hint.height,
5, foreground, background);
XSetStandardProperties(display, window, title, title, None, 0, 0,
&hint);
gc=XCreateGC(display, window, 0, 0);
gc2=XCreateGC(display, window, 0, 0);
XSetBackground(display, gc, background);
XSetForeground(display, gc, foreground);
XSetBackground(display, gc2, foreground);
XSetForeground(display, gc2, background);
XSelectInput(display, window, ButtonPressMask | KeyPressMask | ExposureMask);
XMapRaised(display, window);
XNextEvent(display, &event);
}

//-------------------------------------Plot-----------------------------------

void XWindow::plot (int x, int y)
{XDrawPoint(display, window, gc, x, y);}

void XWindow::plot (int x, int y, int c)
{if (c) XDrawPoint(display, window, gc, x, y);
else XDrawPoint(display, window, gc2, x, y);}

//-------------------------------------Line-----------------------------------

void XWindow::DrawLine (int x1, int y1, int x2, int y2)
{XDrawLine(display, window, gc, x1, y1, x2, y2);}


//-----------------------------------PlotState--------------------------------

void XWindow::plotState (int state[], int size, int xshift)
{
if (ypos>=sizey) { Clear(); ypos=0; };
int x; for (x=0;x<sizex;x++) if (state[x]>0) Plot(xshift+x,ypos); ypos++;
}

void XWindow::plotColorState (int state[], int size, int xshift)
{
if (ypos>=sizey) { Clear(); ypos=0; };
int x; for (x=0;x<sizex;x++) if (state[x]>0)
{ SetColor((double)state[x]/2); Plot(xshift+x,ypos);} ypos++;
}


//-----------------------------------Close Window-----------------------------

void XWindow::Close()
{
XFreeGC(display, gc);
XDestroyWindow(display, window);
XCloseDisplay(display);
}

//----------------------------------- Set Color -----------------------------

void XWindow::SetColor(double c)
{
double c1=c-floor(c);
double c2=c1+1.0/3-floor(c1+1.0/3);
double c3=c2+1.0/3-floor(c2+1.0/3);
int r = 255-(c1<0.5 ? (int)(512*c1) : 511-(int)(512*c1));
int g = 255-(c2<0.5 ? (int)(512*c2) : 511-(int)(512*c2));
int b = 255-(c3<0.5 ? (int)(512*c3) : 511-(int)(512*c3));
XSetForeground(display, gc, r<<16 | g<<8 | b);
}


// void XWindow::SetColor(double c)
// {
// double c1=c-floor(c);
// double c2=c1+1.0/3; c2-=floor(c2);
// double c3=c2+1.0/3; c3-=floor(c3);
// int r = 31-(c1<0.5 ? (int)(64*c1) : 63-(int)(64*c1));
// int g = 31-(c2<0.5 ? (int)(64*c2) : 63-(int)(64*c2));
// int b = 31-(c3<0.5 ? (int)(64*c3) : 63-(int)(64*c3));
// XSetForeground(display, gc, r<<11 | g<<6 | b);
// }

//------------------------------ Software for keypresses----------------------

bool XWindow::KeyPressed (void)
{
if (KeyIsPressed) return 1;
if (! XCheckTypedEvent(display,KeyPress,&event)) return 0;
int i; char text[10];
i=XLookupString((XKeyEvent *) &event, text, 10, &key, 0);
if (i!=1) return 0;
PressedKey=text[0]; KeyIsPressed=1;
return 1;
}

//////////////////////////////////////////////////////////////////////////////

#endif
 

Bölzebub

Querina
Registriert
27.05.05
Beiträge
180
wenn ich es unter mac (os 10.3.9) laufen lasse (x11 ist installiert und läuft soweit fehlerfrei), gibt er mir folgende fehlermeldung (sonst keine weiteren):
Die "_X..."-Fehler kommen auf jeden Fall mal daher, dass du libX11 dazulinken musst. Das Symbol "_main" kann nicht gefunden werden, weil die Klasse keine main-Funktion hat.

Wie versuchst du das Programm "laufen zu lassen"?
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Du musst auch bei der Installation von Xcode das X11 SDK installieren. Hast Du das gemacht?

Alex
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Mit

g++ -L/usr/X11R6/lib -lX11 x11.cpp

geht es bei mir, er meckert natürlich, dass kein main da ist.

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
habe das x11 sdk nachträglich installiert (einfach doppelklick auf dem packet und den installationshinweisen gefolgt). nach dem ich die zeile

g++ -L/usr/X11R6/lib -lX11 x11.cpp

eingetippt habe, bekam ich folgende fehlermeldung:

g++: x11.cpp: No such file or directory

im verzeichnis /usr/X11R6/lib/X11 nachgeschaut, existiert die datei x11.cpp nicht...


mit der _main fehlermeldung kommt hin, das XWindow programm wird als header datei eingebunden, sprich ich muss in jedem fall noch eine main-fkt. schreiben in der ich dann auf XWindow zugreife...
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Du hast den sourcecode hier reingepostet, irgendwie musste ich den ja nennen.

Oder dachtest Du, ich hätte einen g++, der Gedanken lesen kann ;) ?

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
mit andern worten ich muss anstatt x11.cpp die datei dahinschreiben?? (sorry wenn ich so nachfragen muss, hab noch nich so den plan ;)

muss diese datei noch in das verzeichnis /usr/X11R6/lib/X11 kopiert werden??
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
ok, es funktioniert. was müsste ich tun, damit ich die x11-codes bzw die programme mit x11 window über xcode gestartet kriege (übers terminal find ich die ganze sache einwenig umständlich)???
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Wie startest Du die denn über das Terminal? Warum funktioniert es mit Xcode nicht?

Damit ich auch was lerne, schick mir doch mal Dein komplettes Projekt :D

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
naja, im terminal gehe ich in das verzeichnis, wo sich der c++-code befindet und starte es mit
g++ -L/usr/X11R6/lib -lX11 meinprogramm.cpp
dann sollte sich was tun und mit dem befehl ./a.out wird es dann ausgeführt...

mein projekt sieht halt so aus, dass ich die einzelnen programme (sind eigentliche nur kleine, eigenständige simulationen) über xcode schreibe und dann mit "build and go" ausführen lasse. bei den x11 simulationen meldet er mir "unknown link _X..." (halt die fehler von oben)


 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Ja, klar

Das -lX11 musst Du ja auch Xcode sagen. Zieh die Datei /usr/X11R6/lib/X11 in die Gruppe "Link with Frameworks and Libraries" ziehen

Und schick mir mal den Code, X11 programmierung hab ich komischerweise noch gar nicht gemacht. Das interessiert mich.

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
das musst mir nochma genau sagen, was ich bei xcode zu tun habe (sorry, hab aber überhaupt nicht gewusst was ich nun machen sollte ;)

welche datei soll ich wo hinziehen??
wo find ich "link with frameworks and libraries"??

hab dir nen paar c++-codes mit x11 unterstützung als zip mit rangehängt. sind nicht meine, aber ganz ok...
 

Anhänge

  • x11.zip
    9,2 KB · Aufrufe: 68

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Wenn ich Bilder anhängen könnte, hätte ich ein Bild hier. Aber kann die Schritt für Schritt Erklärung bitte wer anders machen?

Alex
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Nachdem ich abs in fabs geändert habe sagt er mir immer noch: "XWindow has no member 'Plot'

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
meinst du das abs in der funktion
double rnd(void){ return abs(rand()*1.0)/RAND_MAX; }

es reicht, wenn du das abs komplett rausnimmst...
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Das mit dem abs bekomme ich hin (abs ist für int, fabs ist für double)

Aber die Plot methode fehlt mir :(

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
bei welchem programm hängts denn genau?? bei mir hauen soweit alle hin...
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
dla.cc, Zeilen 49, 75 und 82

Alex
 

mr.cyberfrog

Jonagold
Registriert
15.11.06
Beiträge
20
wegen der xcode sache hab ich noch ein bisschen rumprobiert:

links in der spalte "Groups and Files" auf mein projektnamen geklickt und dann add -> existing frameworks

dort bin ich in das verzeichnis /usr/X11R6/lib/ gewechselt und hab die library libx11.a eingefügt

soweit so gut ;) wenn ich dann meine x11 simulationen gestartet habe, bekam ich die fehlermeldung "### Error: Failed to open display !###", also eine fehlermeldung aus dem xwindows programm oben (sonst keine weiteren fehler). ich nehme an, xcode kann noch nicht auf den x11 server zugreifen, sprich ich habe bei den "environment variables" (unter excecutables) als name "DISPLAY" und als value "0.0" eingegeben, allerdings ohne erfolg...