PDA

Ver la Versión Completa : Punteros Strings


jlrbotella
01-03-2007, 13:42:18
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:


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:


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 [-] (http://www.clubdelphi.com/foros/#)
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,


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:

procedure CambiarCadena(var ValorOriginal : string);
begin
ValorOriginal := ValorOriginal + ' cambiado';
end;

O bien:
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:


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
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:
ValorOriginal := ValorOriginal + ' cambiado';
Showmessage(cadena);
Por una de estas:
Cadena := ValorOriginal + ' cambiado';
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
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