[C con Clase] una consulta de Struc

Steven Davidson srd4121 en njit.edu
Jue Jun 26 01:56:59 CEST 2008


Hola Luis,

Luis Saavedra Linares wrote:
> Hola Steven
> gracias por la ayuda, me ayudo a entender, te comentare que tanto 
> intentar intentar creo que le atine, y hice la opción 1 que me 
> recomendaste, pero aclarar un observación
> OPcion1
> ya que enviar una referencia cuando llamas a la función

Antes de continuar, debo advertirte que técnicamente punteros no son 
referencias, sino que en C usamos punteros para emular el paso por 
referencia.

> rDV *func( rDV *ret )
> {
>   ...
>   return ret;
> }
> 
> en este caso no es necesario retornar rDV, ya que como ingresa por 
> referencia por ser un arreglo, los cambios que se hagan se mantendrán 
> luego que que termine la función.
> eso hago y me funciona.
>  

Efectivamente, no es necesario retornar el mismo puntero. Sin embargo, 
es una práctica popular hacer esto. La razón es que podemos "encadenar" 
o "ligar" tareas y otras manipulaciones en una misma expresión. Por ejemplo,

rDV *f( rDV *ret );
rDV *g( rDV *ret );
rDV *h( rDV *ret );
rDV *sumar( rDV *ret );

Podemos hacer lo siguiente:

int main()
{
   rDV lista[100];

   while( *f( sumar( g(rDV) ) ) < 0 )
   {
     ...
   }
   ...
}

> una consulta extra.
> me gusto más la 2 Opción, ya que puede crear un arreglo con el tamaño
> que uno quiere por ahí necesito mas o menos dimensión, bueno la

Ciertamente, puedes crear la memoria dinámicamente, pero no lo sugiero, 
porque no es fácil ver que tal memoria fue adjudicada dinámicamente. Por 
consiguiente, es posible que se nos olvide liberar esa memoria. Por esta 
razón, no es aconsejable al menos que la función imputada implique tal 
creación de memoria. Por ejemplo,

int *duplicarLista( int *pLista, int nElem );

Aquí, podríamos ver que 'duplicarLista()' retornará otro puntero que 
seguramente apunta a un bloque de memoria con el mismo contenido que 
'pLista'. Esto es posible a que la función internamente adjudicase la 
memoria dinámicamente.

Sin embargo, en esta otra función, las cosas no son tan aparentes:

int *sumar( int *a, int *b, int nElem );

¿Está retornando 'a' el cual es un valor entrante y saliente u otro 
array con el resultado de la suma de 'a' y 'b'? No está del todo claro.

> ayuda que quiero es saber como se hace esos archivos cuando uno
> reserva una cantidad de memoria para su aplicación, he visto que le
> ponen buffer =## y otras cosas, si me puedes ayudar con una idea
> simple de eso, es que ya no no se usa, lo vi en un sistema de ventas
> en consola, muy bueno y rápido por cierto.

Sinceramente, no estoy seguro de lo que nos preguntas. Si recuerdas el 
código o la lógica que viste, háznosla saber. Si quieres reservar una 
cantidad de bytes en un fichero que acabas de crear, entonces escribe 
una cantidad de ceros o unos (o el valor que quieras) en el fichero 
antes de empezar a manipularlo. Por ejemplo,

char reserva[1024] = {0};
FILE *fichero;
...
fwrite( reserva, 1, sizeof reserva, fichero );

No estoy del todo seguro de por qué querrías hacer esto, pero se puede.


Espero que esto te sirva.

Steven






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