Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-12-2011
Marthian Marthian is offline
Registrado
NULL
 
Registrado: dic 2011
Posts: 2
Poder: 0
Marthian Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 13-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 13-12-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Quien iba a decir que ese techito significaba todo eso, muy interesante.
Algo mas que he aprendido sin querer queriendo.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #4  
Antiguo 13-12-2011
Marthian Marthian is offline
Registrado
NULL
 
Registrado: dic 2011
Posts: 2
Poder: 0
Marthian Va por buen camino
Red face 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...
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
Responder Con Cita
  #5  
Antiguo 13-12-2011
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 251
Poder: 22
Osorio Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 14-12-2011
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
Cita:
Empezado por Marthian Ver Mensaje
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!

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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 14-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Marthian Ver Mensaje
que beneficios nos trae como programador...
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
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 14-12-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por Marthian Ver Mensaje
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...
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
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
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #9  
Antiguo 14-12-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #10  
Antiguo 14-12-2011
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Marthian Ver Mensaje
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...
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
__________________
El malabarista.
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
pregunta tal vez tonta android_beat Varios 2 29-08-2005 17:27:26
pregunta tonta Jordy Conexión con bases de datos 10 10-06-2005 20:37:04
Pregunta Tonta Mario1980 Varios 1 30-10-2004 16:36:14
Pregunta tonta Delphos Varios 10 20-01-2004 12:44:44
Pregunta tonta... CFPA86 Varios 3 04-12-2003 19:46:43


La franja horaria es GMT +2. Ahora son las 20:03:23.


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