Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2007
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 185
Poder: 18
jlrbotella Va por buen camino
Punteros Strings

Hola:

Me gustaría realizar una función donde reciba un string y se modifique dentro de la misma función, pero no tengo claro los punteros.

Ej:

Código Delphi [-]
procedure CambiarCadena(ValorOriginal : string);
begin
 ValorOriginal := ValorOriginal + ' cambiado';
end;
 
procedure PulsarCambio;
var
   cadena : string;
begin
   Cadena := 'pepe';
    CambiarCadena(cadena);
   Showmessage(cadena);
  // Deberia devolver " Pepe cambiado ";
end;

Última edición por dec fecha: 01-03-2007 a las 13:46:15.
Responder Con Cita
  #2  
Antiguo 01-03-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No es necesario que uses punteros, puesto que puedes pasar un parámetro como referencia, de modo que puedes modificarlo en la función o procedimiento:

Código Delphi [-]
procedure HazAlgoConCadena(var cadena: string);
begin
  cadena := cadena + ' añadido a cadena';
end;

var
  s: string;
begin
  s := 'Contenido más';
  HazAlgoConCadena(s);

  // Mostrará "Contenido más añadido a cadena"
  ShowMessage(s);
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 01-03-2007
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 185
Poder: 18
jlrbotella Va por buen camino
Hola:

En principio la función que me has pasado, si que lo cambia dentro de la función, pero cuando regresa la variable permance igual. Buscando por internet he visto la solución:


Código Delphi [-]
procedure TForm1.CambiaCadena(Cadena: pstring);
begin
cadena^ := cadena^ + ' algo más';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
cadena : string;
begin
cadena := 'Hola';
cambiacadena(@cadena);
showmessage(cadena);
end;





La duda que tengo, es si un string es un puntero, porque no se comporta como tal.

Saludos,
JL
Responder Con Cita
  #4  
Antiguo 01-03-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
En principio la función que me has pasado, si que lo cambia dentro de la función, pero cuando regresa la variable permance igual.
No; si ejecutas el código que puse más arriba verás que los cambios que se producen en la variable dentro del procedimiento quedan en la misma ya fuera del procedimiento. Respecto lo que comentas (acerca de los punteros y tal) me parece que no soy el más apropiado para ayudarte.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 01-03-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
jlrbotella, viendo tu código he detectado dos errrores:

1. ¿Quieres una función o procedimiento? Porque primeramente mencionas una función, pero en tu código hablas de un procedure.

2. Es lógico lo que planteas hacer. Pero tiene una gravísima falla. Si declaras a tu código como un procedimiento necesariamente debes indicar que el parámetro debe ser suministrado por valor y en tu ¡código no lo haces! Es por ello que el resultado que muestra es incorrecto.
Si lo declaras como función, el valor obtenido será el correcto y ya no es necesario que el parámetro sea pasado por valor.

En sintesis lo que necesitas es:

Código Delphi [-]
procedure CambiarCadena(var ValorOriginal : string);
begin
 ValorOriginal := ValorOriginal + ' cambiado';
end;

O bien:
Código Delphi [-]
function CambiarCadena(ValorOriginal : string): string;
begin
 result := ValorOriginal + ' cambiado';
end;
Escoje la que más te guste. No es necesario que andes operando con punteros.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 01-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ampliando un poco más:

Lo que hace delphi es pasar el parámetro como constante, creando una copia del valor en la pila, se permite que modifiques el valor de la variable, pero los cambios solo se verán dentro de esa rutina, por ejemplo, ejecuta esto y lo comprenderás:

Código Delphi [-]
procedure CambiarCadena(ValorOriginal : string);
begin
 ValorOriginal := ValorOriginal + ' cambiado';
 ShowMessage(' dentro de cambiar cadena: ' + ValorOriginal;
// mostrará: 'dentro de cambiar cadena: pepe cambiado'
end;
 
procedure PulsarCambio;
var
   cadena : string;
begin
   Cadena := 'pepe';
    CambiarCadena(cadena);
   Showmessage('fuera de cambiar cadena: ' +cadena);
  // mostrará:  "fuera de cambiar cadena: pepe";
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 01-03-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
Cita:
Empezado por jlrbotella
Hola:Me gustaría realizar una función donde reciba un string y se modifique dentro de la misma función, pero no tengo claro los punteros.
Si lo que quieres es usar el código que pusiste al inicio, tienes que modificar una de estas dos líneas:
Código Delphi [-]
ValorOriginal := ValorOriginal + ' cambiado';
Código Delphi [-]
Showmessage(cadena);
Por una de estas:
Código Delphi [-]
 Cadena := ValorOriginal + ' cambiado';
Código Delphi [-]
 Showmessage(ValorOriginal);
OJO: Cambia solo una de las dos, si cambias las dos, el resultado será el mismo.
Hablas de funcion y de punteros, pero en tu código no estas utilizando nada de esto y, segun parece, para lo que quieres hacer no los necesitas, con ese procedimiento tienes.
Lo que pasaba es que estabas mostrando el valor de cadena, y en realidad estabas modificando el de ValorOriginal, entonces lo que tienes que hacer es mostrar el valor que modificas.
__________________
"Sé de tal manera y vive una vida tal, que si todos los hombres fueran como tú y vivieran como tú, nuestro mundo sería un paraíso terrenal"
Siempre hazlo con la ayuda de Dios
Responder Con Cita
  #8  
Antiguo 01-03-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Cita:
Empezado por jlrbotella
Hola:

En principio la función que me has pasado, si que lo cambia dentro de la función, pero cuando regresa la variable permance igual. Buscando por internet he visto la solución:

La duda que tengo, es si un string es un puntero, porque no se comporta como tal.
El codigo que te han propuesto usando "var" funciona perfectamente, tienes que haber cometido algun tipo de error cuando lo probabas.

Un string de delphi es algo mucho mas complejo que un puntero, se necesitaria un post largo para explicar su funcionamiento interno.

Hay que tener cuidado si se decide usar un puntero para modificar un string, ya que si no se fuerza previamente que se haga una copia unica de la variable string pueden acabar modificandose un monton de variables strings distintas que contengan el mismo texto y que se encuentren definidas en cualquier otra parte del programa.

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
uso de punteros David OOP 19 14-12-2009 09:48:37
Punteros davitcito Varios 2 25-04-2005 22:46:24
Punteros y Variables Flores OOP 7 23-04-2005 22:09:55
Punteros rafadrover OOP 8 18-09-2003 10:09:47


La franja horaria es GMT +2. Ahora son las 19:09:16.


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
Copyright 1996-2007 Club Delphi