Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   pasar un puntero a una funcion (https://www.clubdelphi.com/foros/showthread.php?t=43784)

baby 20-05-2007 12:50:54

pasar un puntero a una funcion
 
ola a todos los compañeros del foro
esty aprendiendo a programar en delphi y a verdad no se como se pasa un puntero a una funcion.
por otra parte si kiero asignar un puntero k apunta a un char al campo edit seria posible ¿?cual es el cambio que habra que hacer
saludos
gracias de antemano

droguerman 20-05-2007 16:46:09

declaras un tipo puntero a registro (por ejemplo) así:

Código Delphi [-]
  TREc = record
    nombre : string;
  end;

  PRec = ^TRec;

tu función sería algo parecido a:
Código Delphi [-]
procedure pasarRecord(punt: PRec);
begin
  showMessage(punt^.nombre);
end;


y la llamas de la siguiente forma usando @:
Código Delphi [-]
var
  o : TRec;
begin
  o.nombre := 'hola';
  pasarRecord(@o);
end;

Mick 21-05-2007 13:10:22

Cita:

Empezado por baby
por otra parte si kiero asignar un puntero k apunta a un char al campo edit seria posible ¿?cual es el cambio que habra que hacer
saludos
gracias de antemano

No puedes pasar un puntero al string del edit porque el string es una propiedad e internamente podria ni existir el texto como tal (por ejemplo, ser calculado, o ser una funcion que devuelve ese string), lo que puedes es pasar el objeto edit directamente a la funcion, ya que las referencias a objetos en delphi son punteros "camuflados".

En la mayoria de los casos no necesitas trabajar con punteros, puedes usar referencias que viene a ser lo mismo pero sin necesidad de usar la sintaxis de los punteros por ejemplo:

Código:

procedure  prueba(var n:integer);
begin
  n:= 35;
end;

El uso de "var" en la definicion del parametro hace que se pase por referencia y al modificar "n" dentro de la funcion estamos modificando la variable original que se haya pasado como parametro.

En cuanto a punteros a strings, cadenas de caracteres, usando un typecast a PChar consigues un puntero al string (siempre que el string no sea una propiedad de un objeto).

Código:

var
 s:string;

  //  Ejemplo con punteros aunque seria preferible en lugar de usar un pchar usar una referencia,
  //  de la siguiente forma: procedure rellena(var ptr:string, caracter:char) ;

  procedure rellena(ptr:PChar, caracter:char) ;
  begin
      while ptr^<>#0 do begin 
          ptr^:= caracter;
          Inc(ptr);
      end{while};
  end;

begin
    s:= 'Hola mundo';
    rellena( PChar(s)  , 'x' );
    ShowMessage(s);  // Mostrara xxxxxxxxxxx
end;



Aun asi hay que tener muucho cuidado con el uso de punteros a strings, ya que los strings pueden cambiar dinamicamente de lugar, ademas delphi para ahorrar memoria usa el metodo de copy on write, para las cadenas de caracteres, lo que hace muy peligroso su uso, por ejemplo:

Código:


var
  a,b:string;
  ptr:PChar;
begin
  a:= 'hola';

// Esto te daria un acces violation bestial no se puede modificar
// 'hola' porque esta guardada la zona de inicializacion 
// de constantes del programa y no es escribible

  ptr:= PChar(a);
  ptr^:= '*';   

// En cambio lo siguiente funciona perfectamente, al usar la sintaxis normal
// de delphi, el compilador se da cuenta de que queremos modificar
// el string, y antes de asignar el caracter hace una copia del string
// a una zona de memoria que si es escribible.

 a[1]:= '*'; 

// Y una vez hecho lo anterior ya funciona la sintaxis de punteros
// porque el string ya esta en una zona de memoria escribible

  ptr:= PChar(a);
  ptr^:= '+';   

//  Pero cuidado con lo siguiente, atencion con la asignacion del puntero
// estaremos modificando LOS DOS STRINGS, tanto "a" como "b". Ya
// que al asignarlos apuntan a la misma zona de memoria y al usar
// punteros el compilador no se da cuenta de que debe hacer una copia
// de a, antes de modificarlo.

  b:= a;
  ptr:= PChar(a);
  ptr^:= 'X';

// En cambio lo siguiente funciona corrrectamente y la asignacion del puntero
// solo modifica la variable "a", esto es debido a que la linea
// a[1]:= 'q', ha obligado al compilador a realizar una copia del contenido
// de "a" para que se encuentre en distinta zona de mmmoria que "b"
// y se pueda modificar sin afectar al valor de "b"

  b:= a;
  a[1]:= 'q';
  ptr:= PChar(a);
  ptr^:= 'X';

end;

Asi que es preferible en la mayoria de los casos usar referencias, y solo usar punteros cuando no haya mas remedio.


Saludos


La franja horaria es GMT +2. Ahora son las 07:28:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi