Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Ayuda para dejar mas simple este codigo

Hola amigos, he conseguido esta funcion la cual hace una especie de crc muy particular de un texto y quiero dejarlo lo mas simple posible sin tantos castings ya que otras similares lo he conseguido y se que esta se puede pero no lo consigo. Aqui la funcion:
Código PHP:
AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
{
    
signed char caracter;
    
unsigned long valor1valor2valor3valor4;
    
unsigned long contador;
    
unsigned long sizefilelic;
    
unsigned long retval 0;

    if (
cadena) {
        
caracter = *cadena;
        
sizefilelic 0;
        if (
caracter) {
            do {
                if (
caracter == 0x1A)
                    break;
                
caracter = *reinterpret_cast<signed char*>(sizefilelic cadena 1);
                ++
sizefilelic;
            } while (
caracter);
        }
        
contador 0;
        
valor2 0;
        
valor3 sizefilelic;
        
retval valor3;
        if (
valor3) {
            
valor4 valor3 1;
            do {
                
valor1 static_cast<unsigned long>(*reinterpret_cast<unsigned char*>(contador reinterpret_cast<unsigned long>(cadena)));
                
valor2 valor2 valor1 contador;
                ++
contador;
                
valor3 = (*reinterpret_cast<unsigned char*>(valor2 valor4 reinterpret_cast<unsigned long>(cadena) + 1) + valor2 + (valor1 valor2) * retval) * valor2;
                
retval valor3;
            } while (
contador sizefilelic);
        }
    }

    return 
AnsiString().sprintf("%09lu"retval);

Lo que hace es recorrer un buffer y con una serie de operaciones obtiene la posicion de un byte con el que realizar mas operaciones he ir sumando y creando el crc.
He intentado quitarle los castings pero no doy con el modo y creo que lo hago mal y por eso da valores diferentes, porque no respeto correctamente el tema de los parentesis o algo asi.
¿podrian ayudarme a dejarlo lo mas claro posible para alguien como yo que no entiendo mucho de castings y cosas asi?
Por ejemplo esa parte si que se:
Código PHP:
do {
                if (
caracter == 0x1A)
                    break;
                
caracter = *reinterpret_cast<signed char*>(sizefilelic cadena 1);
                ++
sizefilelic;
            } while (
caracter); 
La dejo asi:
Código PHP:
do {
                if (
caracter == 0x1A)
                    break;
                ++
sizefilelic;
                
caracter cadena[sizefilelic];
            } while (
caracter); 
Eso quiero hacer con todo el codigo para que sea lo mas sencillo para yo entenderlo.

Última edición por aguml fecha: 26-10-2016 a las 23:18:17.
Responder Con Cita
  #2  
Antiguo 27-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Lo que me falta por modificar creo que tiene que quedar algo tal que asi:
Código PHP:
do {
    
valor1 cadena[contador];
    
valor2 valor2 valor1 contador;
    ++
contador;
    
valor3 = (cadena[(valor2 valor4) + 1] + valor2 + (valor1 valor2) * retval) * valor2;
    
retval valor3;
} while (
contador sizefilelic); 
Pero creo que hago algo mal.
Responder Con Cita
  #3  
Antiguo 27-10-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Al primer vistazo, lo primero que llamó mi atención es:
Código:
...
  unsigned long sizefilelic;
  unsigned long retval = 0;

  if (cadena) {
    caracter = *cadena;
    sizefilelic = 0;
    if (caracter) {
      do {
        if (caracter == 0x1A)
        break;
        caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
...
El caso es, que sizefilelic no es inicializado, por lo que tiene un valor indeterminado cuando se usa por primera vez.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 27-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Sí se inicializa entre los dos if que hay más arriba.
Responder Con Cita
  #5  
Antiguo 27-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Mi idea es dejarlo así más o menos:
Código PHP:
AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
{
    
unsigned long valor1valor2 0valor3;
    
unsigned long contador 0;
    
unsigned long sizefilelic 0;
    
unsigned long retval 0;

    do {
        if (
cadena[sizefilelic] == 0x1A)
            break;
        ++
sizefilelic;
    } while(
cadena[sizefilelic]);

    
valor3 sizefilelic;
    do {
        
valor1 cadena [contador];
        
valor2 valor2 valor1 contador;
        
retval = (cadena [(valor2 % (sizefilelic 1)) + 1] + valor2 + (valor1 valor2) * valor3) * valor2;
        ++
contador;
    } while (
contador sizefilelic);
    return 
AnsiString().sprintf("%09lu"retval);

Ya que es seguro que en el buffer mio siempre va a haber una cadena ya que se forma a partir de una constante con lo que por lo menos la constante estará así que sobran tantos if. Ahora el caso es si el código que yo he modificado es capaz de realizar la misma tarea o me equivoqué en algo (lo más seguro). Si veis algo erróneo en la conversión del código por favor decidme.

Última edición por aguml fecha: 27-10-2016 a las 07:33:33.
Responder Con Cita
  #6  
Antiguo 27-10-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por aguml Ver Mensaje
Sí se inicializa entre los dos if que hay más arriba.
Se me escapó la tortuga, van mis disculpas

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 27-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Ya lo solucioné.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda a pasar este código a firemonkey. elmago00 FireMonkey 55 08-01-2015 15:25:18
ayuda con este codigo kurono Varios 5 02-04-2014 00:25:11
ayuda con este codigo kurono Varios 4 13-06-2008 01:03:29
necesito ayuda con este codigo kurono Varios 4 06-05-2008 07:02:07
procedimiento almacenado ayuda con este codigo pipecato Varios 5 16-12-2005 12:24:34


La franja horaria es GMT +2. Ahora son las 16:11:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi