[C con Clase] Error en compilacion: Referencia a ... sin definir

Davidson, Steven srd4121 en njit.edu
Mar Mayo 20 19:38:25 CEST 2014


Hola Facundo,

2014-05-20 2:29 GMT-04:00 Facundo Curti <facu.curti en gmail.com>:

> Hola lista. Como estan?
> Les comento que estoy tratando de diseñar una libreria para calcular un
> CRC32 de una cadena. Como no necesito crear objetos, defino todas las
> funciones y variables como static.
>

No estoy muy seguro de por qué quieres crear una "clase estática. Podrías
usar espacios con nombre y definiciones globales, aunque no sugiero usar
variables globales.

En fin, José te ha solucionado el tema de los errores; o sea, escribe,

unsigned int CRC32::poly = 0;
unsigned char CRC32::flagTab = 0;
int CRC32::table[256] = {0};

De todas maneras, he visto algunas partes del código que quiero matizar:

- La función 'memset()' no es necesaria porque existe la función estándar
que suele ser más optimizada, porque posiblemente esté implementada en
ensamblador. Es posible que no quieras basarte en las bibliotecas
estándares.

- En 'reflect()', escribes:

unsigned char length = sizeof(bits)*8;

No estoy seguro de si debes multiplicar por 8 los bits; no recuerdo todos
los detalles del algoritmo de CRC. Puedo entender si el parámetro contiene
un número de bytes e intentas convertir a bits multiplicando por 8.

De todas maneras, sugiero usar  el operador << para multiplicar en binario;
esto es,

unsigned char length = sizeof(bits) << 3;

Ten cuidado que el resultado no se salga del intervarlo de [0,255].

- En 'crc32()', escribes:

unsigned long int len = sizeof(*cadena);

Esto no tiene mucho sentido, porque sabemos que el resultado de la
expresión siempre será 1, porque 'unsigned char' siempre es 1 byte. Es
posible que querías averiguar la cantidad de bytes de la cadena; esto es,

sizeof cadena

pero 'cadena' no se refiere a la cadena, sino que es un puntero. Esto
significa que sabemos el resultado según la plataforma y compilador: 4
bytes u 8 bytes.

Si quieres saber la cantidad de caracteres en una cadena, entonces tienes
que recorrer la cadena contando cada carácter hasta llegar al carácter
nulo, que indica su final. Sugiero usar la función estándar, 'strlen()'.


Espero que esto te sea de ayuda.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140520/fbba4639/attachment.html>


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