Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   una pregunta un tanto tonta (https://www.clubdelphi.com/foros/showthread.php?t=76996)

Marthian 12-12-2011 23:41:59

una pregunta un tanto tonta
 
tengo una duda estoy con delphi 7 y estoy examinando un codigo

no logro entender para que se usa el simbolo ^ e buscado en google

en otros lugares y no encuentro para que se usa...

he leido del triangulo de pascal y no estoy seguro sea eso ... muchas gracias por su pronta respuesta

ecfisa 13-12-2011 00:55:02

Hola Marthian y bienvenido a Club Delphi :)

Cuando el símbolo ^ aparece precediendo a un tipo de dato, indica que es un apuntador a ese tipo de dato, por ejemplo:
Código Delphi [-]
type
  TIntPtr = ^Integer;

var
  CharPtr: ^Char;

Cuando aparece despues, desreferencia el puntero, es decir devuelve el valor almacenado en la posición de memoria a la cuál apunta. Un ejemplo sencillo:
Código Delphi [-]
var
  p1,p2: ^Integer;
  i,j: Integer;
begin
  New(p1);
  i:= 5;    // variable tiene el valor 5
  p1:= @i;  // p1 apunta a i    (el operador @ devuelve la dirección de una variable)
  j:= p1^;  // j tiene el valor 5
  p2:= @j;  // p2 apunta a j
  ShowMessage( IntToStr(p1^ + p2^) ); // 10
end;
Delphi trae predefinidos punteros a los tipos mas comunes. Algunos son: PAnsiString, PString, PCurrency, PDouble, PInteger, ... (más información en la ayuda de Delphi).

Un saludo.

Caral 13-12-2011 02:11:14

Hola
Quien iba a decir que ese techito significaba todo eso, muy interesante.
Algo mas que he aprendido sin querer queriendo.:D
Saludos

Marthian 13-12-2011 05:47:43

mmmm interesante pero dudoso
 
okey... muchas gracias por responderme..


pero tengo ahora tal curiosidad su función es apuntar a un puntero de la pila tal cual como se hace en el viejo asm?????

que beneficios nos trae como programador... :confused:
por que si puedo decir pi^= p2 y a ambos le coloco una simplicidad como = 5

para que matarse con los punteros si puedo decir que a = 5 y b = 6????

no comprendo realmente:o

Osorio 13-12-2011 14:19:20

Un poquito de teoria
 
Es para usar la memoria de manera optima.

Cuando se definen variables de tipo puntero, estas no ocupan espacio de memoria hasta que no se le diga explicitamente (NEW). Así mismo cuando ya no necesitamos la variable, la podemos liberar (Dispose).

Por otro lado cuando definimos una variable "normal", esta reserva su espacio de memoria durante todo el tiempo que el programa (o procedimiento) se esté ejecutando.


Código Delphi [-]
var
  p1,p2: ^Integer;
  i,j: Integer;
begin

  New(p1);


end;

Delphius 14-12-2011 04:11:58

Cita:

Empezado por Marthian (Mensaje 420983)
tengo una duda estoy con delphi 7 y estoy examinando un codigo

no logro entender para que se usa el simbolo ^ e buscado en google

en otros lugares y no encuentro para que se usa...

he leido del triangulo de pascal y no estoy seguro sea eso ... muchas gracias por su pronta respuesta

Por lo que comentas me huele a que recién estás haciendo tus primeros pasos en Delphi; que más decir... incluso es tu primer contacto con un lenguaje basado en Pascal.

Si quieres entender el funcionamiento del ^ ve a un libro que trate sobre Estructuras de datos y algoritmos cuyos ejemplos estén hechos en Turbo Pascal.

Cualquiera que haya cursado y practicado alguna cátedra de Estructuras de Datos definiendo arrays, listas, colas, pilas, árboles y grafos con punteros se volvería mono de ver lo que es capaz ese único símbolo. ¡Que prácticas tortuosas aquellas! :eek: :D

Como dato: En Delphi ya no es necesario utilizar ^, a menos que se declare propiamente algún puntero como los que vienen de "fábrica" y menciona ecfisa. Es lo mismo:

Código Delphi [-]
Labe1l^.Caption := 'Hola mundo';

que:

Código Delphi [-]
Label.Caption := 'Hola mundo';

Si en verdad no vas a trabajar con punteros, y ni siquiera con algunos propios que definas, mejor no te rompas la cabeza. Dale gracias a Delphi que se encarga del trabajo sucio y no tienes que tocar punteros aquí y allá... al menos no conscientemente. Pero si en verdad quieres aprender, practica llevando el concepto siguiendo ejemplos y ejercicios de TADs.

Saludos,

ecfisa 14-12-2011 14:19:39

Cita:

Empezado por Marthian (Mensaje 421002)
que beneficios nos trae como programador... :confused:
por que si puedo decir pi^= p2 y a ambos le coloco una simplicidad como = 5

para que matarse con los punteros si puedo decir que a = 5 y b = 6????

no comprendo realmente:o

Hola Marthian.

En este caso específico, obviamente no conlleva ningún beneficio. Pero dado que tenías total desconocimiento de la función del caret en Pascal, me pareció apropiado hacer incapié en la simplicidad del ejemplo.

Saludos.

olbeup 14-12-2011 14:35:08

Cita:

Empezado por Marthian (Mensaje 421002)
okey... muchas gracias por responderme..


pero tengo ahora tal curiosidad su función es apuntar a un puntero de la pila tal cual como se hace en el viejo asm?????

que beneficios nos trae como programador... :confused:
por que si puedo decir pi^= p2 y a ambos le coloco una simplicidad como = 5

para que matarse con los punteros si puedo decir que a = 5 y b = 6????

no comprendo realmente:o

Yo utilizo cientos, miles, millones de punteros, bueno unos cuantos, y la verdad son muy prácticos y rápidos, también hay que tener en cuenta que no son muy recomendables para aquellos que no saben que es un puntero y para que se utilizan.

Si quieres empezar a utilizar punteros, empieza por algo sencillo, coge algún .pas de delphi y buscar ^ veras que hay bastantes y estudia de donde viene y a donde va, cómo se asigna un valor a un puntero, etc...

Un saludo

Casimiro Noteví 14-12-2011 14:43:34

Conocer el funcionamiento de los punteros es esencial para un programador.
Distinto es que el lenguaje que use después lo permita usar, lo haga innecesario o no le haga falta.
Pero manejarlos perfectamente es básico. Un programador que no sabe usar punteros... no es un programador.

mamcx 14-12-2011 16:29:11

Cita:

Empezado por Marthian (Mensaje 421002)
pero tengo ahora tal curiosidad su función es apuntar a un puntero de la pila tal cual como se hace en el viejo asm?????

que beneficios nos trae como programador... :confused:
por que si puedo decir pi^= p2 y a ambos le coloco una simplicidad como = 5

Te lo pongo de esta manera.

Supon que existe este codigo:

Código Delphi [-]
procedure nombre
var
  MiNombre:String
begin
  MiNombre := 'Marthian';
end;

Imagina que la memoria de un computador es exactamente como una hoja de Excel, que al principio esta vacia y es aleatoria (porque en excel pones valores donde te da la gana. Si estan organizados es cosa tuya).

Ahora bien, si pones tu nombre en una celda, veras que realmente esa celda es "A1". "A1" es la dirección del valor de tu nombre.

Sin embargo, tu diras: MOMENTO ESO NO TIENE SENTIDO! porque el nombre esta dentro de una variable (A1)! Aja, pero y DONDE esta esa variable? En *otra* celda!

Como asi?

En Excel (osea, la memoria) tendrias esto:

B1 A1
Nombre Marthian

Asi, que en este caso, el *valor* esta en A2 pero la *variable* (que es como la etiqueta del valor) esta en B1. El *apuntador* es como interrogar esa indireccion, donde en la memoria si pregunto "Nombre"=B1 realmente quiero es "Marthian"=A2. Eso es lo que se quiere el 99% de las veces. Pero que pasa si quiero no el valor pero si la celda donde esta la vble (B2), entonces uso el sombrerito.

El *porque* es una cosa bizarra. Basicamente, es para hacer "trucos". Por ejemplo, para hacer un virus.

Digamos que en B1 esta el código que ejecuta un programa:


B1= RUN NotePad.exe (Lo real)
A1= NotePad.exe (Solo el nombre)

(que conste que eso que escribi no tiene mucho sentido)

Ahora, tu virus pregunta:

Dame B1. Pero el compilador responde: NotePad.exe.

NO! yo quiero hacer un virus!, asi que tu preguntas:

Dime ^B1. El te responde "RUN NotePad.exe". Ahora tu dices:

Cambia ^B1 por "RUN BorrarDisco.exe", que es como quien dice, un trastorno. Ahora has cambiado la realidad interna de lo que la memoria tiene.

Entonces, si preguntan: A1, responde "NotePad.exe", pero realmente ejecuta "RUN BorrarDisco.exe".

---

Los casos de uso en Delphi mas comunes los puedes leer aqui: http://delphi.about.com/od/objectpas...a/pointers.htm

Como un apuntado permite "mover" los valores de una vble(etiqueta) a otra:

http://www.delphibasics.co.uk/RTL.asp?Name=Pointer
Código Delphi [-]
var
  generalPtr : Pointer;  // A pointer to anything
  formPtr    : ^TForm;   // A pointer to a form object

begin
  // The current unit's form is addressable via the self keyword
  generalPtr := Addr(self);

  // We can assign this pointer to the form pointer
  formPtr := generalPtr;

  // And set the form caption to show this
  formPtr.Caption := 'Test program';
end;

Como ves, la forma estaba almacenada en una vble, pero se le cambio la direccion de su etiqueta a otra celda, usando los apuntadores.

P.D Aunque use pointers algunas veces, solo me alcanzo el nirvana hace unos meses tratando de explicar como funcionaba las vables. Si no fuera por excel, estaria frito ;)


La franja horaria es GMT +2. Ahora son las 21:44:59.

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