SDL2 TTF Fehler



  • Hallo,
    ich versuch schon seit Tagen nen einfachen Text in einem Fenster anzuzeigen, aber das Programm stürzt immer bei "SDL_Surface* surfaceMessage = TTF_RenderText_Solid(Sans, text.c_str(), White);" ab, ich hab keine Ahnung woran das liegen könnte?!
    Hier mal der ganze Code:

    TTF_Font* Sans = TTF_OpenFont("Sans.ttf", 24); 
    	std::string text = "text";
    
    	SDL_Color White = { 255, 255, 255 };  
    	SDL_Surface* surfaceMessage = TTF_RenderText_Solid(Sans, text.c_str(), White); 
    	SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); 
    SDL_Rect Message_rect; 
    	Message_rect.x = 0;  
    	Message_rect.y = 0; 
    	Message_rect.w = 100; 
    	Message_rect.h = 100; 
    
    	SDL_RenderCopy(renderer, Message, NULL, &Message_rect);
    	return Message;
    

    Kann es sein, dass das auch daran liegt, dass ich TTF nicht richtig installiert hab?
    Ich hoffe jmd kennt das Problem, vielen Dank schonmal!

    PS: Es gibt keine Fehlermeldung, einfach nur "-----.exe funktioniert nicht mehr"



  • Hast du es bereits mit dem Debugger laufen lassen?



  • Ja, bei dem TTF_RenderText_Solid wird eine Ausnahme ausgelöst:

    Ausnahme ausgelöst bei 0x71002A85 (SDL2_ttf.dll) in Game.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.



  • BOSS2000 schrieb:

    TTF_Font* Sans = TTF_OpenFont("Sans.ttf", 24); 
    	std::string text = "text";
    
    	SDL_Color White = { 255, 255, 255 };  
    	SDL_Surface* surfaceMessage = TTF_RenderText_Solid(Sans, text.c_str(), White); 
    	SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); 
    SDL_Rect Message_rect; 
    	Message_rect.x = 0;  
    	Message_rect.y = 0; 
    	Message_rect.w = 100; 
    	Message_rect.h = 100; 
    
    						  
    						
    	SDL_RenderCopy(renderer, Message, NULL, &Message_rect);
    	return Message;
    

    Die meisten Funktionen in C, die einen Zeiger auf ein neues Objekt zurückgeben signalisieren Fehler mit einem NULL zeiger als Rückgabewert. Prüf also die Zeiger. In Deinem Fall wäre es wohl am interessantesten zu wissen ob TTF_OpenFont() fehlschägt.

    Und schau, ob Du Ressourcen wieder freigeben musst, die die Bibliothek für Dich erstellt - die Ergebnisse von TTF_RenderText_Solid und SDL_CreateTextureFromSurface .



  • Sry, dass ich erst so spät antworte...
    Also dass Problem liegt wirklich beim Font, das is wohl NULL. Heißt das, dass "Sans.ttf" nicht erkannt wird, oder wie?



  • Klingt für mich als hättest du vergessen zu initialisieren. (TTF_Init())



  • Ne, das hab ich gemacht...
    Aber falsch wie ich gerade merke... Die Initialisierung funktioniert nicht richtig, TTF_Init() wirft NULL zurück, ich vermute mal, dann hab ich irgendwas falsch eingerichtet. Das werde ich mir nochmal anschaun, vielleicht weiß ja trotzdem jemand, was das Problem sein könnte 😉

    Edit:
    Mein Code sieht so aus:

    int TTF = TTF_Init();
    	if (TTF == NULL) {
    		std::cerr << "SDL TTF ERROR! MSG:" << SDL_GetError() << std::endl;
    		exit(-1);
    	}
    

    Jetzt hab ich gerade gesehen, dass TTF_Init() 0 zurückgibt, wenn es erfolgreich war, also müsste ich ja

    if(TTF == NULL)
    

    durch

    if(TTF == -1)
    

    ersetzen, oder hab ich das falsch verstanden? In dem Fall wäre die Initialisierung allerdings doch erfolgreich...



  • Wenn du aber bisher auf NULL geprüft hast und bisher keine Fehlermeldung kam, dann kann TTF_Init nicht 0 zurückgegeben haben!
    Wenn du die Abfrage jetzt auf "== -1" (oder besser "!= 0") umgeschrieben hast und jetzt weiterhin keine Fehlermeldung ausgegeben wird, dann solltest du ja im Code weiterkommen - evtl. ist ja noch ein anderer Fehler bei TTF_OpenFont (z.B. daß der Font nicht im Suchpfad gefunden wird).



  • Bei ==0 kam eben schon eine Fehlermeldung, bei ==-1 nicht, also hat funktioniert beim Initialisieren alles 🙂
    Darüber, dass dieser Font nicht gefunden wird hab ich auch schon nachgedacht, aber ich hab im Internet wirklich überhaupt nichts gefunden, wo die Fonts aufgelistet werden, geschweige denn wo ich überprüfen kann, ob es diesen Font gibt 😕



  • Verläuft die initialisierung fehlerfrei, gibt er 0 zurück.
    Tritt ein Fehler auf -1.
    Steht auch in der Doku. 😉

    https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf_8.html



  • guitarlo schrieb:

    Verläuft die initialisierung fehlerfrei, gibt er 0 zurück.
    Tritt ein Fehler auf -1.
    Steht auch in der Doku. 😉

    https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf_8.html

    Ja sag ich doch, die Initialisierung funktioniert...

    Kann mir vielleicht noch jemand helfen? Der Fehler liegt ganz offensichtlich bei TTF_OpenFont(), aber ich mal alles so wie es überall im Internet steht, angenommen der Font wird nicht gefunde, was durchau möglich wäre, wie und wo kann ich nachschaun welche Fonts bei mir verfügbar sind, bzw. wie kann ich Fonts hinzufügen?



  • Laß dir mal mit TTF_GetError() den Fehler nach TTF_OpenFont ausgeben.

    Und s.a. SDL_ttf - Font directory/Where do fonts go?

    Hast du denn mal geschaut, ob überhaupt "Sans.ttf" auf deinem System (Working Directory, Windows/Fonts) ist?

    Ansonsten lade dir einfach mal einen Font herunter, s. SDL_ttf 2.0: Getting Started.



  • ´Ja, funktioniert endlich 😃 Er hat wohl tatsächlich die Fonts nicht gefunden, hab die jetzt in den Projektordner kopiert und den Pfad angegeben. Da muss ich mir aber noch was einfallen lassen, weil der Pfad wird ja später nichtmehr richtig sein...

    Aber auf jeden Fall vielen vielen Dank an alle die geholfen haben 😃 Ohne euch würde ich wahrscheinlich immernoch bei TTF_RenderText_Solid() rumhängen xD

    Also Danke und noch ein schönes Wochenende
    BOSS2000


Anmelden zum Antworten