[C con Clase] una consulta de Struc

Steven Davidson srd4121 en njit.edu
Mar Jun 24 18:27:44 CEST 2008


Hola Luis,

Luis Saavedra Linares wrote:
> 
> una consulta amigos.
>  
> quiero hacer una funcion que me devuelva un array de struc, para lugo 
> listarlo en un StringGrid,
>  

[CORTE]

> lugo lo quiero llamar así.
>  
>                         rDV rdv_detalle_venta[10];
>                         int items=0;
>                         rdv_detalle_venta[] = 
> registro_detalle_venta(id_venta, &items, hubo_error);
> para luego recorrerlo, y listarlo.
>  
> espero este haciendo lo correcto pero no me corre, por favor si me 
> pueden ayudar.

Esto no es semánticamente correcto. Una función no puede retornar un 
array directamente. Tienes 3 opciones:

1. Aceptar un puntero relacionado con un array estático o dinámico que 
servirá para guardar la información. Luego, si quieres, puedes retornar 
el mismo puntero. Por ejemplo,

rDV *func( rDV *ret )
{
   ...
   return ret;
}

int main()
{
   rDV lista_dv[10];
   func( lista_dv );
   ...
}

2. Crear memoria dinámicamente en la función y retornar un puntero a tal 
array dinámico. Por ejemplo,

rDV *func()
{
   rDV *ret = new rDV[n];
   ...
   return ret;
}

int main()
{
   rDV *pLista_dv = func();
   ...
   delete[] pLista_dv;
   return 0;
}

Como puedes ver, necesitamos liberar la memoria dinámica, pero lo 
hacemos fuera de la función. Esto no es una buena solución, porque no es 
evidente que 'func()' creará memoria dinámicamente. Por lo tanto, 
tampoco es evidente que tengamos que liberar memoria. por estas razones, 
no es una buena práctica.

3. Creamos otra estructura que sólo contenga el array. Por ejemplo,

struct Array_DV  { rDV array_DV[10]; };

Array_DV func()
{
   Array_DV ret;
   ...
   return ret;
}

int main()
{
   Array_DV lista_dv = func();
   ...
}

El contenido de una estructura es copiado a otra estructura. En este 
caso, indirectamente copiamos los arrays.


Sugiero usar el método #1. Claramente vemos lo que hace falta y lo que 
retornará.

Espero que esto te ayude.

Steven





Más información sobre la lista de distribución Cconclase