2011-08-29 8 views
7

¿es posible pasar nil como una constante no declarada al parámetro sin tipo de alguna función? Tengo funciones como estas y me gustaría pasar alguna constante al parámetro Data para satisfacer al compilador. Internamente estoy decidiendo por el parámetro Tamaño. Sé que puedo usar el puntero en lugar del parámetro sin tipo, pero es mucho más cómodo para mi caso.¿Cómo pasar la constante "nil" al parámetro sin tipo?

Ahora me estoy poniendo E2250 There is no overloaded version of 'RS232_SendCommand' that can be called with these arguments

function RS232_SendCommand(const Command: Integer): Boolean; overload; 
begin 
    // is it possible to pass here an undeclared constant like nil in this example? 
    Result := RS232_SendCommand(Command, nil, 0); 
end; 

function RS232_SendCommand(const Command: Integer; const Data; const Size: Integer): Boolean; overload; 
begin 
    ... 
end; 

Esto funciona, pero me alegraría si pudiera salir de la declaración de variables.

function RS232_SendCommand(const Command: Integer): Boolean; overload; 
var 
    Nothing: Pointer; 
begin 
    Result := RS232_SendCommand(Command, Nothing, 0); 
end; 

solución es usar algo como esto.

function RS232_SendCommand(const Command: Integer): Boolean; overload; 
begin 
    // as the best way looks for me from the accepted answer to use this 
    Result := RS232_SendCommand(Command, nil^, 0); 

    // or it also possible to pass an empty string constant to the untyped parameter 
    // without declaring any variable 
    Result := RS232_SendCommand(Command, '', 0); 
end; 

Estoy haciendo esto porque algunos de mis comandos tienen datos enviados después de la transmisión del comando.

Gracias por la ayuda

Respuesta

12

Fácil:

RS232_SendCommand(Command, nil^, 0); 

Solo debe asegurarse de no acceder al parámetro Datos desde el interior RS232_SendCommand, pero presumiblemente para eso es el parámetro de tamaño 0.

En mi opinión, esta es la mejor solución porque indica muy explícitamente que está pasando algo que no se puede acceder.

+0

Guau, eso es aún más inteligente. Aceptaré esto como la respuesta al menos porque se mencionó que es imposible. Gracias – TLama

+0

Sí, eso es elegante. – Kaos

+1

¡No estoy seguro de que 'nil ^' pueda clasificarse como elegante! ;-) Solo tienes que recordar que esto no desreferencia el puntero nulo. –

2

No, no se puede. no es que yo sabía de

parámetros sin tipo

Se pueden omitir las especificaciones de tipo cuando se declara var, const, y fuera parámetros. (Parámetros de valor se deben escribir.) Para ejemplo:

TakeAnything procedimiento (const C);

declara un procedimiento llamado TakeAnything que acepta un parámetro de cualquier tipo. Cuando llama a tal una rutina, no puede pasarle un número o una constante numérica sin tipo.

Desde: Parameters (Delphi)

Por lo tanto, tal vez agregar otra versión sobrecargada sin la const arg que se puede llamar cuando Tamaño = 0.

+4

Gracias. Esto me ayudó mucho.A partir de la frase "no se puede pasar un número o una constante numérica sin tipo" encontré un camino, una constante de cadena vacía: 'Resultado: = RS232_SendCommand (Comando, '', 0);' – TLama

+0

Ah, bueno. :) – Kaos

Cuestiones relacionadas