Ir al contenido


Foto

Funciones con número variable de parámetros en delphi


  • Por favor identifícate para responder
2 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 junio 2010 - 04:20

Probablemente os acordais que el C con su estilo estandar de paso de parámetros cdecl, permite declarar y usar funciones con un número variable de parámetros. En principio en delphi esto nopuede ser... ¿o si?.

Existe una API de windows muy útil para tratar cadenas de caracteres, conversiones y formatos. Me refiero a  wsprintf, Declarada como:


cpp
  1. int __cdecl wsprintf(
  2.   LPTSTR lpOut,
  3.   LPCTSTR lpFmt,
  4.   ...
  5. );


Pero esta función en delphi está declarada así:

delphi
  1. wsprintf(Output, Format: PAssiChar);


Si tratamos de implementar algo como esto, nos da un error en el número de parámetros:


delphi
  1. var
  2.   Text: array [0..100] of char;
  3. begin
  4.   wsprintf(Text,'Esto es %02d', $10);
  5. end;


La solución es redeclarar e importar la API desde wsprintfA, si no queremos Unicode:

delphi
  1. function wsprintf(lpOut, lpFmt: PChar): Integer; cdecl; varargs; external 'User32.dll' name 'wsprintfA';


Ahora podemos usarla tal y como viene en la ayuda MSDN, y códigos como este compilan y funcionan perfectamente:

delphi
  1. var
  2.   Text: array [0..100] of char;
  3. begin
  4.   wsprintf(Text,'Esto es en decimal %02d o hexadecimal %X', $10, 16);
  5.  
  6. end;


Bien es verdad que los String de delphi nos permiten implementar códigos parecidos al anterior pero ¿Y si no interesa usar String? También nos permitirá traducir código de C con facilidad donde encontrareis el amplio uso de funciones de la familia printf, del estándar de C y con paso de número variable de parámetros.

Espero que os sea de utilidad.



Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 15 junio 2010 - 04:22

Caramba!!!, debo ponerme a estudiar el API de Windows :)

Salud OS
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 junio 2010 - 04:29

Caramba!!!, debo ponerme a estudiar el API de Windows :)

Salud OS


En realidad Windows echó mano de esa función del estándar de C por su utilidad en el tratamiento de cadenas y la mantiene como otras tantas funciones nativas de ese lenguaje. Por eso son viejas conocidas de los que usamos el C y menos por los que otros lenguajes resuelven esos temas de otra forma, quizás en un nivel de programación mas alto. Lo que no quita la utilidad que puedan tener, en esos lenguajes, en un momento dado.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.