<div class="gmail_extra">Steven o Salvador me podeis dar mas información de como utilizar los punteros a función, o donde puedo encontrar esa informacion, y tambien de typedef (aunque esto se mas o menos lo que es, es para dar un nombre que se entienda mejor a las cosas, por ejemplo: typedef int playa; playa pl; ??)</div>
<div class="gmail_extra"><br></div><div class="gmail_extra">Un saludo y gracias^^</div><div class="gmail_extra"><br></div><div class="gmail_extra">P.D: Y de la informacion de punteros a función que pueda responderme a esta pregunta por favor: los punteros a funcion se puede utilizar a cualquier tipo de funcion o solo a void? <br>
<br><div class="gmail_quote">El 26 de abril de 2012 16:32, Marcos Collado Martín <span dir="ltr"><<a href="mailto:marquitos.mcm@gmail.com" target="_blank">marquitos.mcm@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<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ó:<div>
<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola Marcos,<div><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><div><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></div></div><br></div>
</blockquote></div><br></div>