<div class="gmail_extra">Si,  muchas gracias por la ayuda :) Aun me quedam ucho por aprender de C/C++<br><br><div class="gmail_quote">El 26 de abril de 2012 03:57, Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola Marcos,<div class="im"><br>
<br>
On 4/25/2012 5:45 PM, Marcos Collado Martín wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ok gracias, pero lo que quiero es que esa función la puedan utilizar<br>
varias estructuras diferentes, no solo (en tu caso) stDatos. Por<br>
ejemplo, algo que hizo Salvador antes:<br>
<a href="http://paste2.org/p/1995171" target="_blank">http://paste2.org/p/1995171</a><br>
<br>
</blockquote>
<br></div>
El problema es que lo que hizo Salvador y lo que quieres hacer tú son cosas diferentes. La solución de Salvador se basa en leer cantidades de bytes de un fichero y escribir los bytes en otra parte del mismo fichero.<br>
<br>
En tu ejemplo, quieres leer la información y luego usarla como si fuese una estructura en particular. Sin embargo, esto va en contra de lo que quieres, porque dices que te interesa que la información leída se use con cualquier estructura en general.<br>

<br>
Sugiero que la función acepte un puntero a función la cual acepte un puntero genérico para hacer lo que quieras con tal información, sea el tipo que sea. Por ejemplo,<br>
<br>
typedef void (*PF)( void * );<br>
<br>
void Intercambia( FILE *fichero, long iz, long de, long bytesPorRegistro, PF pfunc )<br>
{<br>
  void *reg1, *reg2;<br>
<br>
  reg1 = malloc(bytesPorRegistro);<br>
  reg2 = malloc(bytesPorRegistro);<br>
  ...<br>
  pfunc( reg1 );<br>
}<br>
<br>
Un ejemplo de una función y estructura sería,<br>
<br>
struct stAlgo<br>
{<br>
  char szCad[64];<br>
  int num;<br>
};<br>
<br>
void asignar( void *pDatos )<br>
{<br>
  stAlgo *pReg = (stAlgo *)pDatos;<br>
<br>
  strcpy( pReg->szCad, "hola mundo" );<br>
  pReg->num = 10;<br>
}<br>
<br>
Y ahora podemos invocar 'Intercambia()' así,<br>
<br>
Intercambia( fichero, a, b, sizeof(stAlgo), asignar );<br>
<br>
De esta manera, 'Intercambia()' realizará su tarea además de alguna tarea específica, 'asignar()' en este ejemplo, que tratará la información como un tipo particular.<br>
<br>
<br>
En C++, podemos usar plantillas para resolver este mismo problema. Por ejemplo,<br>
<br>
template< typename T ><br>
void Intercambia( FILE *fichero, long iz, long de )<br>
{<br>
  T reg;<br>
<br>
  fseek( fi, iz*sizeof(T), SEEK_SET );<br>
  fread( &reg, sizeof(T), 1, fi );<br>
  ...<br>
  reg.memfunc();<br>
  reg.memdato = 0;<br>
}<br>
<br>
La usaríamos así,<br>
<br>
Intercambia< stAlgo >( fichero, a, b );<br>
<br>
<br>
Claro que no todos los tipos T tendrán el mismo nombre de la función miembro, 'memfunc()', ni tampoco el nombre del dato miembro, 'memdato'.<br>
<br>
La solución para este problema es pasar un puntero a miembro para que pueda acceder a un miembro cualquiera; por ejemplo,<br>
<br>
template< typename T ><br>
void Intercambia( FILE *fichero, long iz, long de, void T::*pfunc() )<br>
{<br>
  T reg;<br>
<br>
  fseek( fi, iz*sizeof(T), SEEK_SET );<br>
  fread( &reg, sizeof(T), 1, fi );<br>
  ...<br>
  reg.*pfunc();<br>
}<br>
<br>
Y la usaríamos así,<br>
<br>
Intercambia( fichero, a, b, &stAlgo::m_asignar );<br>
<br>
<br>
Hay otras soluciones parecidas, pero este tema se complicaría un poco más y el correo-e sería más extenso.<br>
<br>
<br>
Espero que esto aclare un poco más el tema.<div class="HOEnZb"><div class="h5"><br>
<br>
Steven<br>
<br>
<br>
______________________________<u></u>_________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/<u></u>mailman/listinfo/cconclase_<u></u>listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/<u></u>index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br></div>