<div dir="ltr">Hola Facundo,<div class="gmail_extra"><br><div class="gmail_quote">2014-05-20 15:24 GMT-04:00 Facundo Curti <span dir="ltr"><<a href="mailto:facu.curti@gmail.com" target="_blank">facu.curti@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Por que lo que necesito hacer, es una función que reciba una cadena, y<br>

devuelva como resultado su CRC. No necesito definir ningún objeto.<br>
Quiero poder trabajar con la función CRC sin necesidad de definir<br>
objetos.<br>
<div class=""><br></div></blockquote><div><br></div><div>Podrías usar eso mismo: una función global. No hace falta crear una "clase estática". En tu caso, sólo quieres que exista la función 'crc32()'. Para esto, mantén esta función de enlazamiento externo y las demás entidades de enlazamiento estático. Por ejemplo,</div>
<div><br></div><div>// crc32.h</div><div><br></div><div><div>unsigned int crc32( const char *cadena, const unsigned int iCRC=0xFFFFFFFF );<br></div></div><div><br></div><div><br></div><div>// crc32.cpp</div><div><br></div>
<div>#include "crc32.h"</div><div><br></div><div><div>static unsigned int poly;</div><div>static unsigned char flagTab;</div><div>static int table[256];</div><div><br></div><div>static void iniTab();</div><div>static unsigned int reflect( unsigned int bits );</div>
<div>static void memset( void *ptr, const int word, const int len );<br></div></div><div><br></div><div><div>unsigned int crc32( const char *cadena, const unsigned int iCRC )<br></div></div><div>{<br>  ...</div><div>}</div>
<div><br></div><div><br></div><div>Puedes pensar que 'crc32()' es una función global pública, mientras que las demás entidades globales: funciones y variables son privadas, desde el punto de vista de "crc32.cpp".</div>
<div><br></div><div>Podemos extender esto un poco más y agregar un espacio con nombre. Por ejemplo,</div><div><br></div><div><div>// crc32.h</div><div><br></div><div>namespace CRC32<br>{</div><div><br></div><div>unsigned int crc32( const char *cadena, const unsigned int iCRC=0xFFFFFFFF );<br>
</div><div><br></div><div>}</div><div><br></div><div><br></div><div>// crc32.cpp</div><div><br></div><div>#include "crc32.h"</div><div><br></div><div>namespace CRC32<br>{<br></div><div><br></div><div><div>static unsigned int poly;</div>
<div>static unsigned char flagTab;</div><div>static int table[256];</div><div><br></div><div>inline static void iniTab();</div><div>inline static unsigned int reflect( unsigned int bits );</div><div>inline static void memset( void *ptr, const int word, const int len );<br>
</div></div><div><br></div><div>inline unsigned int crc32( const char *cadena, const unsigned int iCRC )<br></div><div>{<br>  ...</div><div>}</div></div><div><br></div><div>}</div><div><br></div><div>No tienes que cambiar nada en el resto del programa: en 'main()'; esto es,<br>
</div><div><br></div><div>int main()<br>{<br>  CRC32::crc32( "hola" );</div><div>  ...</div><div>}</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="">
> En fin, José te ha solucionado el tema de los errores; o sea, escribe,<br>
><br>
> unsigned int CRC32::poly = 0;<br>
> unsigned char CRC32::flagTab = 0;<br>
> int CRC32::table[256] = {0};<br>
<br>
</div>No estoy seguro de donde hacerlo. Si lo hago en el header, me indica:<br>
<br>
crc32.h:17:28: error: ISO C++ prohíbe la inicialización en la clase<br>
del miembro static ‘CRC32::poly’ que no es constante<br>
<br>
Al momento de compilar el crc32.cpp. Y ya lo hago en el crc32.cpp,<br>
donde a poly le defino 0x04C11DB7, y a table lo inicializo en 0 con<br>
memset.<br>
<div class=""><br></div></blockquote><div><br></div><div>Las definiciones o implementaciones se deberían hacer en el código fuente; o sea, en "crc32.cpp". Esto es,</div><div><br></div><div>// crc32.cpp</div><div>
<br></div><div><div>#include"crc32.h"</div><div>#include<stdio.h></div><div><br></div><div>unsigned int CRC32::poly = 0;</div><div>unsigned char CRC32::flagTab = 0;</div><div>int CRC32::table[256] = {0};</div>
<div>...<br></div></div><div><br></div><div><br></div><div>Recuerda que los ficheros de cabecera se suelen incluir en varios ficheros. Si definieras las variables en el fichero de cabecera, entonces las estarías redefiniendo en cada fichero fuente. Sin embargo, esto quebranta la regla de una sola definición, en C++. Por lo tanto, tiene sentido definir las variables en un solo código fuente, y simplemente incluir la declaración en otros códigos fuente, mediante el fichero de cabecera.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""> Lo que quiero, es utilizar la menor cantidad de librerias posibles. Y<br>
</div>
como memset está dentro de string.h, he creado un memset propio para<br>
no tener que incluir la libreria.<br>
<div class=""><br></div></blockquote><div><br></div><div>Entiendo. Otra posibilidad es comunicar al enlazador que sólo quieres enlazar una función en una biblioteca. Esto ya es cuestión de las opciones del enlazador.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="">Lo que quiero, es obtener la longitud en bits de la cadena (De nuevo,<br>
</div>
sin recurrir a string.h). La idea era que el sizeof me diera la<br>
longitud de la cadena en bytes, y multiplico por 8 para obtener la<br>
cantidad de bits.<br>
<br>
De todas formas es solo una prueba que estaba haciendo para ver si<br>
resultaba o no. Ahora que lo dices, creo que tienes razón, y me<br>
devolveria el tamaño del char en lugar de la cadena. Creo que<br>
recurriré a escribir mi propio strlen.<br>
<div class=""><br></div></blockquote><div><br></div><div>La otra posibilidad es que pases ese dato como parámetro. A veces es más sencillo calcular ese valor o incluso darlo directamente desde la función invocadora.</div>
<div><br></div><div><br></div><div>Hasta pronto,</div><div><br></div><div>Steven</div><div><br></div></div></div></div>