PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Klassen und Font Initialisierung


Einfachkrank
2003-02-14, 16:25:43
Hi,

folgendes Prob: Ich verwende schon seit langem eine Funktion aus OpenGL Game Programming, die ich ein wenig modifiziert habe. Jetzt wo ich eine kleine, primitive Engine schreiben möchte, habe ich sie einfach in eine Klasse gepackt(unter public). Wenn ich sie jetzt allerdings sie verwende um einen Font zu laden, startet mein Programm erst gar nicht richtig, sondern kommt mir gleich mit ner Fehlermeldung. Die Funktion sieht so aus:

void M3DTools::CreateBitmapFont(char *fontName, int fontSize, unsigned int *Font, GLOBAL *glob)
{
HFONT hFont;

*Font = glGenLists(96);

if(stricmp(fontName, "symbol") == 0)
hFont = CreateFont(fontSize, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, SYMBOL_CHARSET,
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
FF_DONTCARE | DEFAULT_PITCH, fontName);
else
hFont = CreateFont(fontSize, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, fontName);

if (!hFont) return;

SelectObject(glob->hdc, hFont);
wglUseFontBitmaps(glob->hdc, 32, 96, *Font);
} // unsigned int M3DTools::CreateBitmapFont()Hat da jemand en Vorschlag für mich?

MFG Einfachkrank

Abe Ghiran
2003-02-14, 20:38:50
Ich hab auch mal im OpenGlGP nachgeguckt, sieht eigentlich alles ok aus.
Vielleicht solltest beim fehlschlagen von CreateFont mehr machen, als die Methode zu beenden. Kann ja sein, das du beim Aufruf deiner Methode nen Buchstabendreher im Fontnamen hast und dann CreateFont schiefgeht.
Und bevor du diese Methode hattest, hast du da auch schon Schrift in OpenGL gemacht? Mit anderen Worten, kannst du sicher ausschließen, das der Fehler nicht beim Rendern passiert?
Und zu guter letzte: Zeiger. Sieht zwar auch alles ok aus, du dereferenzierst ja "Font" und "glob" beim Aufruf immer richtig aber deklariert man Zeiger nicht eigentlich so:

void M3DTools::CreateBitmapFont(char* fontName, int fontSize, unsigned int* Font, GLOBAL* glob)

also das "*" hinter dem Typbezeichner? Oder spielt das gar keine Rolle?

Mehr fällt mir dazu jetzt nicht ein, sorry :(.

Grüße, Jan

Demirug
2003-02-14, 20:49:26
Einfachkrank, was für eine Fehlermeldung und schon mal den Code mit dem Debuger durchgestept?

Xmas
2003-02-14, 20:50:18
Originally posted by Abe Ghiran
also das "*" hinter dem Typbezeichner? Oder spielt das gar keine Rolle?
Nein, das spielt keine Rolle. Ob vor oder hinter dem Stern ein Leerzeichen ist ist völlig egal. Das gilt in C/C++ überall solange keine Mehrdeutigkeiten entstehen.

Abe Ghiran
2003-02-14, 23:51:02
Originally posted by Xmas

Nein, das spielt keine Rolle. Ob vor oder hinter dem Stern ein Leerzeichen ist ist völlig egal. Das gilt in C/C++ überall solange keine Mehrdeutigkeiten entstehen.

Ah, wieder was gelernt.
Man wird so alt wie eine Kuh und lernt noch immer was dazu ;).

Meinst du mit Mehrdeutigkeiten Zeiger auf Funktionen, die dann wieder einen Zeiger zurückgeben? Ich glaube sowas vermeide ich als c++ newbie erst mal.

Grüße, Jan

Xmas
2003-02-15, 03:02:39
Originally posted by Abe Ghiran
Meinst du mit Mehrdeutigkeiten Zeiger auf Funktionen, die dann wieder einen Zeiger zurückgeben? Ich glaube sowas vermeide ich als c++ newbie erst mal.
Da gibt es eigentlich keine Mehrdeutigkeit. Das einzige was mir jetzt gerade einfällt wäre die Interpretation von >> als Shift-Operator bei geschachtelten Template-Deklarationen wie z.B. vector<vector<int>>, aber selbst das kann der Compiler aus dem Kontext erkennen.

Einfachkrank
2003-02-15, 15:32:07
Hi,

also an meine Anwendung liegts sicher nicht, weil wenn ich dieselbe Funktion, unabhängig einer Klasse nutze, dann funktioniert´s. Ich bekomme gar keine Fehlermeldung - nur das kleine Fenster mit den Knöpfen "Schließen - Debug - Details" - und bei Details bekomme ich die Register angezeigt, aber kann mit den Inhalten nichts anfangen(also keine Werte die mir bekannt vor kommen, oder so). Und wenn ich debug anklicke, komme ich an irgend eine Zeile im Code, der schon in Assembler ungewandelt ist...

Aber wie kann ich im Visual C++ den Code Zeile für Zeile durchgehen?

MFG Einfachkrank

zeckensack
2003-02-15, 16:06:06
Originally posted by Einfachkrank
Hi,

also an meine Anwendung liegts sicher nicht, weil wenn ich dieselbe Funktion, unabhängig einer Klasse nutze, dann funktioniert´s. Ich bekomme gar keine Fehlermeldung - nur das kleine Fenster mit den Knöpfen "Schließen - Debug - Details" - und bei Details bekomme ich die Register angezeigt, aber kann mit den Inhalten nichts anfangen(also keine Werte die mir bekannt vor kommen, oder so). Und wenn ich debug anklicke, komme ich an irgend eine Zeile im Code, der schon in Assembler ungewandelt ist...

Aber wie kann ich im Visual C++ den Code Zeile für Zeile durchgehen?

MFG Einfachkrank Du machst einen Debug-Build (Menü Build -> Set Active Configuration; dann den Build starten [F7]), und wenn der fertig ist, drückst du F11 :)

Einfachkrank
2003-02-15, 18:14:52
@zeckensack
bei mir passiert nichts, hast du vielleicht die Taste F11 bei dir mit irgendwas zusätzlichem belegt?

Einfachkrank
2003-02-16, 13:59:07
Oder kann mir jemand anderes noch mal genauer sagen, wie ich den Code Zeile für Zeil durchsteppen kann ? :)

Xmas
2003-02-16, 14:18:48
Eigentlich sollte F11 reichen, dann sollte die Programmausführung bei der ersten Zeile in main/WinMain stehenbleiben. Danach kann man mit F10 zeilenweise Ausführen oder mit F11 in die aufgerufene Funktion springen.

Alternativ kannst du auch dort wo du den Code überprüfen willst einen Haltepunkt setzen und mit F5 das Programm bis zu diesem ausführen.

Einfachkrank
2003-02-16, 15:59:06
Hi,

gut, ich werde es versuchen. Jetzt hab ich noch ein kleines Problem:
Eine Struktur die ungefähr so aussieht:
struct blabla
{
float irgendwas;
int nochirgendwas;
// und jetzt möchte ich hier eine Identifizierungswort speichern
char Ident[20];
// oder char *Ident;
};
Dazu brauche ich eine Funktion deren Prototyp so aussieht:
void SetIdent(char *ident);
Wie sollte ich das jetzt am Besten machen? In der Struktur einen festen String speichern oder nur einen Pointer? Und wie muss die Funktion aussehen, dass ich entweder einen String oder einfach sofort Text in Hochkommas übergeben kann?
Wäre dankbar für Hilfe

MFG Einfachkrank