PDA

Ver la Versión Completa : const char* de C a String de Delphi


kotai
18-04-2014, 09:35:21
Hola.

Estoy utilizando SDL2 en DelphiXE5 y tengo un problema en todas las funciones de SDL2 que devuelven una cadena, el valor que leo siempre son letras japonesas. Según la documentación de SDL2 todas las cadenas están codificadas en UTF8. De hecho las funciones SDL2 a las que yo les tengo que pasar cadenas los hago con: PChar(UTF8Encode(cadena)) y funciona perfectamente, pero cuando es SDL2 el que me devuelve la cadena no.

Os pongo un caso concreto: función SDL_GetHint
La documentación dice:

Syntax
const char* SDL_GetHint(const char* name)

Function Parameters
name : the hint to query;

Return Value
Returns the string value of a hint or NULL if the hint isn't set.


Y la implementación de la función en Delphi:

function SDL_GetHint( const name: PChar): PChar; cdecl; external SDL_LibName;


A la hora de usarla en mis juegos he probado varias formas, pero siempre me devuelve letras japonesas o interrogantes. Os pongo algunas de las llamadas que he hecho, en las 2 primeras me devuelve letras japonesas y en las otras 3 devuelve: ???t

var
aux : string;
begin
aux := SDL_GetHint(PChar(UTF8Encode(SDL_HINT_RENDER_SCALE_QUALITY)));
aux := PChar(SDL_GetHint(PChar(UTF8Encode(SDL_HINT_RENDER_SCALE_QUALITY))));
aux := UTF8Decode(SDL_GetHint(PChar(UTF8Encode(SDL_HINT_RENDER_SCALE_QUALITY))));
aux := PChar(UTF8Decode(SDL_GetHint(PChar(UTF8Encode(SDL_HINT_RENDER_SCALE_QUALITY)))));
aux := UTF8Decode(PChar(SDL_GetHint(PChar(UTF8Encode(SDL_HINT_RENDER_SCALE_QUALITY)))));
end;


¿ Alguna idea de como recuperar el valor real de la cadena ?
Como digo el pasar cadenas a las funciones de SDL2 con PChar(UTF8Encode(cadena)) funciona perfectamente, está comprobado en todas las funciones SDL2 a las que hay que pasar una cadena. El problema lo tengo cuando es SDL2 el que me devuelve las cadenas.

Gracias.

Casimiro Notevi
18-04-2014, 10:21:24
¿Qué es SDL2?

kotai
18-04-2014, 11:38:08
SDL2 son unas librerías para hacer juegos o programas multimedia multiplataforma: Windows, Linux, mac, ios, Android y unos cuantos sistemas más.

www.libsdl.org

De SDL había unos headers para Delphi/Pascal hechos por JEDI, pero no funcionaban desde los Delphi XE y tampoco para SDL2. Yo estoy acabando de hacer los de SDL2 para delphixe5/6 compatibles con win32, win64, mac y supongo que ios (no he probado por no tener licencia de desarrollador). Lo que me está costando mucho más es para Android porque ha de pasar por un java que aun no se como hacer. Cuando tenga los headers acabados los publicaré para que todo el mundo los pueda usar.

Puedes ver como funcionan en la última versión (1.14F) de mi juego www.miniracingonline.com las versiones anteriores usaban unDelphiX


Saludos :D

kotai
24-04-2014, 22:17:41
¿ Nadie tiene idea de como leer esos strings desde la dirección que devuelve sdl2.dll ?

Gracias

Ñuño Martínez
25-04-2014, 14:36:24
Por lo que dices, el problema parece ser que las cadenas que devuelve SDL no están codificadas correctamente. ¿Seguro que es UTF-8? ¿Cuál es el orden (endianess) de los octetos, Microsoft o Motorola (bigendian/littlendian)? ¿La alineación es correcta?

De todas formas, en Pascal Game Development (http://www.pascalgamedevelopment.com/) hay gente con más experiencia con SDL. Yo soy más de Allegro (http://allegro-pas.sf.net/).