Ver Mensaje Individual
  #1  
Antiguo 19-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
sscanf siempre retorna 0 en variable de 64 bits

Amigos tengo esta prueba que compila aunque uso sscanf y no creo que sea lo mejor y ademas sscanf siempre me retorna 0 en la variable de 64 bits.

Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <limits>
#include <stdio.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
   : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------


bool IsOverflow (AnsiString valor)
{
   
bool overflow=false;
   
AnsiString valorLimite std::numeric_limits<unsigned long long>::max();

   if(
valorLimite.Length() == valor.Length()){
      for (
int i=1<=valor.Length(); i++)
      {
         if(
valorLimite[i] > valor[i]){
            break;
         }else if (
valorLimite [i] < valor[i]){
            
overflow=true;
            break;
         }
      }
   }else if(
valorLimite.Length() > valor.Length()){
      
overflowfalse;
   }else{
      
overflow=true;
   }
   return 
overflow;
}
//---------------------------------------------------------------------------

bool dividirHex(AnsiString dividendoAnsiString divisorAnsiString *cocienteAnsiString *resto)
{
   
unsigned __int64 auxDividendoauxDivisorauxCociente=0auxResto=0;
   
bool salir=false;
   
bool retval=false;
   
int largoDividendolargoDivisorlargoPorcionpos;

   
largoDivisor=divisor.Length();

   if (!
IsOverflow (divisor)){
      *
cociente="";
      *
resto="";
      
sscanf(AnsiString("0x" divisor).c_str(), "%I64u", &auxDivisor);

      do {
         
largoDividendo=dividendo.Length ();
         
largoPorcion=largoDivisor;
         if(
largoDividendo >= largoDivisor){
            
sscanf(AnsiString("0x" dividendo.SubString(1,largoPorcion)).c_str(), "%I64u", &auxDividendo);
            if(
auxDivisor auxDividendo){
               if(
largoDividendo largoDivisor){
                  
largoPorcion++;
               }else{
                  break;
               }
            }
            if(
IsOverflow(dividendo.SubString(1,largoPorcion))){
               
salir=true;
               
retval=false;
            }else {
               
sscanf(AnsiString("0x" dividendo.SubString(1,largoPorcion)).c_str(), "%I64u", &auxDividendo);
               
auxResto=auxDividendo auxDivisor;
               
dividendo=dividendo.SubString(largoPorcion,largoDividendo);
               
auxCociente=auxDividendo auxDivisor;
               *
cociente=*cociente AnsiString (auxCociente);
               *
resto=AnsiString(auxResto);
               if (
auxResto 0)
                  
dividendo= *resto dividendo.SubString(largoPorcion,largoDividendo);
               else
                  
dividendodividendo.SubString(largoPorcion,largoDividendo);
               
retval=true;
            }
         }else {
            
salir=true;
            *
resto=dividendo;
            *
cociente=*cociente "0";
            
retval=true;
         }
      }while(!
salir);
   }
   return 
retval;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   
AnsiString Dividendo="FFFFFF",Divisor="FF",Cociente,Resto;
   
dividirHex(DividendoDivisor, &Cociente, &Resto);
}
//--------------------------------------------------------------------------- 
A ver si me podeis ayudar.
Responder Con Cita