Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Punteros Strings (https://www.clubdelphi.com/foros/showthread.php?t=40892)

jlrbotella 01-03-2007 13:42:18

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;

dec 01-03-2007 13:45:57

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;

jlrbotella 01-03-2007 13:56:59

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

dec 01-03-2007 13:59:36

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.

Delphius 01-03-2007 15:46:47

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,

Lepe 01-03-2007 16:37:09

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

Albano 01-03-2007 17:22:30

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.

Mick 01-03-2007 17:46:39

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


La franja horaria es GMT +2. Ahora son las 21:13:06.

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