Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.559
Poder: 27
dec Va camino a la famadec Va camino a la fama
Historias sobre punteros

Tengo algunas dudas sobre como esta planteado el uso de los punteros en Delphi, ya que quiero pasar unas funciones de C a Delphi, y tengo algunos problemas.

1) ¿Es correcto apuntar un pchar a un string de esta forma?

Código Delphi [-]
var
  ppuntero : pchar;
  scadena : string;
  {...}
  ppuntero := @scadena;

No, no...

Vamos a ver, un String en Object Pascal es un tipo conceptualmente similar al tipo OleString, aunque no equivalente, un String sabe siempre el número de caracteres que tiene y siempre termina en un nulo (#0), por lo que el compilador puede hacer una conversión directa si usas un simple cast:

Código Delphi [-]
ppuntero := PChar(scadena);

Sin embargo el identificador de la cadena en sí no es más que un puntero a un descriptor de cadena, el que guarda la dirección donde está realmente almacenada la cadena, el número de caracteres que contiene y un contador de uso (cuando este contador llega a 0 Delphi libera la memoria asignada a la cadena), si usas la expresión @scadena estás obteniendo la dirección de ese puntero, o sea un puntero a otro puntero que no es relevante. Si sería correcto tomar la dirección de la cadena como la dirección de su primer elemento:

Código Delphi [-]
ppuntero := @scadena;

strpcopy(ppuntero,'Mi puntero'); // ¿Se ha modificado la variable scadena?

No, estás machacando el descriptor de la cadena que no es lo mismo.

Suponiendo que has calculado ppuntero como @scadena[1] si que la estarías modificando, pero eso tiene mucho peligro por lo que te he explicado anteriormente. Delphi se encarga de asignar memoria automáticamente para que que quepan todos los caracteres en la cadena, llevar el contador, etc.. Si te saltas todo eso, y escribes directamente en la memoria que pertenece a la cadena, Delphi no actualizará el descriptor, e incluso peor aún, si intentas hacer crecer de tamaño, Delphi no se entererá y no reservará espacio automáticamente para que quepan los caracteres nuevos, y escribirás en memoria que no te pertenece

2) ¿Cómo se sabe el valor no la dirección de un puntero P2, que apunta a P1 y el P1 apunta a un array?

¿Es correcto así @@P2 ?

Para el valor de un puntero se usa el operador de dereferencia ^.

Si p es un puntero a un entero, P^ será un entero. Un caso especial son todos los objetos, un objeto es siempre un puntero, pero Delphi usa un modelo de dereferencia automático que hace innecesario dereferenciar el objeto, así, en vez de poner: Form^.Left, se pone simplemente Form.Left.

En tu caso sería: ((P2^)^)[ i ] (los paréntesis son innecesarios, los he puesto por claridad).

3) ¿Como se reemplaza de C a Delphi esto ' void *Mifuncion() ');

Código Delphi [-]
function Mifuncion: Pointer;

4) ¿Cómo convierto esto: 'struct *Registro(int reg)';

A eso no le veo sentido, ¿tal vez has querido poner: 'struct Mitipo*Registro(int reg)'?

Si así es, pues:

Código Delphi [-]
type

PMitipo = ^MiTipo;

function Registro( Reg: Integer): PMiTipo;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 14:00:09.


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