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

Facundo Curti facu.curti en gmail.com
Mar Mayo 20 21:24:25 CEST 2014


Gracias por su ayuda Jose y Davidson.

El día 20 de mayo de 2014, 14:38, Davidson, Steven <srd4121 en njit.edu> escribió:
> 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.
Por que lo que necesito hacer, es una función que reciba una cadena, y
devuelva como resultado su CRC. No necesito definir ningún objeto.
Quiero poder trabajar con la función CRC sin necesidad de definir
objetos.

> 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};

No estoy seguro de donde hacerlo. Si lo hago en el header, me indica:

crc32.h:17:28: error: ISO C++ prohíbe la inicialización en la clase
del miembro static ‘CRC32::poly’ que no es constante

Al momento de compilar el crc32.cpp. Y ya lo hago en el crc32.cpp,
donde a poly le defino 0x04C11DB7, y a table lo inicializo en 0 con
memset.


> 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.

Lo que quiero, es utilizar la menor cantidad de librerias posibles. Y
como memset está dentro de string.h, he creado un memset propio para
no tener que incluir la libreria.

> - 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.

Lo que quiero, es obtener la longitud en bits de la cadena (De nuevo,
sin recurrir a string.h). La idea era que el sizeof me diera la
longitud de la cadena en bytes, y multiplico por 8 para obtener la
cantidad de bits.

De todas formas es solo una prueba que estaba haciendo para ver si
resultaba o no. Ahora que lo dices, creo que tienes razón, y me
devolveria el tamaño del char en lugar de la cadena. Creo que
recurriré a escribir mi propio strlen.


> De todas maneras, sugiero usar  el operador << para multiplicar en binario;
> esto es,
>
> unsigned char length = sizeof(bits) << 3;
buena idea! :)


> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




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