Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Traducir llamado a funcion (https://www.clubdelphi.com/foros/showthread.php?t=66007)

juanelo 27-01-2010 17:05:37

Traducir llamado a funcion
 
Que tal,
Antes que nada les agradezco el tiempo que se toman por leer este post, mi duda es como traducir una funcion o mejor dicho, su declaracion que está hecha en Delphi, a su correspondiente en C++ builder.
Código Delphi [-]
procedure ApplyUpdates(DataSets: array of TCustomDADataSet); overload; virtual
Esta es la funcion en Delphi, como quedaria su correspondiente declaracion en C++ y ya entrados en gastos si saben como llamar a la funcion en programacion, pues seria formidable.
Muchas gracias.

Ñuño Martínez 27-01-2010 18:12:26

Al tratarse de un método (de lo contrario no tendría "overload; virtual" :rolleyes:), no estoy seguro de que se pueda, ya que no hay una forma fácil de llamar a un método de un objeto Delphi desde C++, y aun menos a uno virtual ya que posiblemente habría que trastear con la tabla de métodos virtuales y eso ya son palabras mayores.

Aun así, es posible que sí se pueda, porque creo recordar que hay paquetes Delphi que pueden instalarse en Builder (Los de JfActiveSoft, si no recuerdo mal, aunque no estoy seguro de si estaban escritos en Pascal o en C++).

Si me dijeras acceder a un procedimiento o función (no método) de un archivo DLL escrito en Pascal, la cosa cambiaría ya que sólo habría que declarar la función C++ como "externa de pascal" y el compilador se encargaría del enlazado.

juanelo 27-01-2010 18:18:50

Ñuño muchas gracias por tu respuesta, pero lo que estoy tratando de hacer es "traducir" una clase de Delphi a C++ builder, la cual tiene la declaracion que mencione antes.
Al decir o preguntar como llamar a esta funcion, seria desde el mismo Delphi, es decir, llamar a la funcion en Delphi desde Delphi para tener una idea de como hacerlo en C++, claro una vez que yo sepa como se "declara" dicha funcion en C++.
Gracias

coso 27-01-2010 18:48:45

Hola,
no estoy seguro...a ver si seria algo asi el prototipo

Código:


virtual overload void ApplyUpdates(TCustomDataSet *)

saludos.

roman 27-01-2010 19:26:12

Cita:

Empezado por coso (Mensaje 352018)
Hola,
no estoy seguro...a ver si seria algo asi el prototipo

Código:


virtual overload void ApplyUpdates(TCustomDataSet *)

saludos.

¿No faltarían unos corchetes y el nombre del parámetro?

Código:


virtual overload void ApplyUpdates(TCustomDataSet[] DataSets)

// Saludos

juanelo 27-01-2010 20:23:29

Muchas gracias para todos los que respondieron, pongo la solucion:

Código Delphi [-]
virtual void __fastcall ApplyUpdates(const TCustomDADataSet* const * DataSets, const int DataSets_Size)
en C++.

Saludos

escafandra 28-01-2010 00:17:22

Cita:

Empezado por juanelo (Mensaje 352042)
Muchas gracias para todos los que respondieron, pongo la solucion:

Código Delphi [-]virtual void __fastcall ApplyUpdates(const TCustomDADataSet* const * DataSets, const int DataSets_Size)

No estoy muy seguro de que sea eso lo que quieres. Al declarar:
Código:

const TCustomDADataSet* const * DataSets
Estas declarando un puntero constante que apunta a otro puntero también constante, es cedir una array de punteros constantes. Eso quiere decir que el compilador no te va a dejar modificar los elementos de ese array. Si eso es lo que pretendes, entonces OK, en otro caso quizás sea mejor simplificarlo así:
Código:

TCustomDADataSet **DataSets
Como detalle poco importante no es necesario declarar una función como virtual si se está heredando de una clase madre en la que ya se declaró virtual, pues implicitamente la función heredada también será virtual aunque no se declare explicitamente.

Saludos.

juanelo 28-01-2010 00:20:24

Cita:

Empezado por escafandra (Mensaje 352063)
Estas declarando un puntero constante que apunta a otro puntero también constante, es cedir una array de punteros constantes. Eso quiere decir que el compilador no te va a dejar modificar los elementos de ese array. Si eso es lo que pretendes, entonces OK.
Saludos.

Si claro, en realidad no se modifican los elementos del array (y ni debe de poderse).
Gracias.

coso 28-01-2010 20:43:48

Hola,
para roman

Cita:

¿No faltarían unos corchetes y el nombre del parámetro?
no, el nombre del parametro en el prototipo no es necesario, al menos antes no lo era, y los corchetes tampoco pues un array indeterminado es un puntero. Al tener que indicar las clases como punteros en c, le faltaria otro asterico: creo ahora que lo correcto seria (TCustomDatasets **), si se quiere modificar, como indica escafandra...y si no la inicial de un unico referenciador (TCustomDaDataSet *)...en fin, supongo que si te funciona esta bien. Un saludo.

escafandra 28-01-2010 21:11:11

En realidad, en la definición de una función, un puntero puede ser representado por los corchetes que dice roman, es decir int* n, es lo mismo que int n[]. Como dice coso un array es lo mismo que un puntero (ese puntero apunta a su primer elemento).

const int* n; // es un puntero a un entero constante
int *const n; // es un puntero constante a un entero

La definición dada por juanelo debe funcionar correctamente.:)

Saludos.


La franja horaria es GMT +2. Ahora son las 02:50:51.

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