Autor Tema: Convertir un int a int array, y duda de rangos  (Leído 11799 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Convertir un int a int array, y duda de rangos
« en: 24 de Diciembre de 2006, 15:29:55 »
Hola saludos companeros, felices fiestas!!!

mi duda es la siguiente, he realizado la siguiente función:

void entero(int16 num,int dig) //dig=cantidad de digitos, num nuemro que sera cargado con el valor del array
{
   num=0;
   cont=1;
   do
   {
      num=num+dato1[dig-1]*cont;   // dato estara cargado con cualquier cantidad de datos int segun diga dig (max 5 digitos)
      cont=cont*10;
      dig--;   // viene bien este comando? para ir recorriendo en los digitos hasta 0, ya qeu con el [dig-1], no es actualiado el valor de dig, verda???
   }while(dig!=0);
}

lo que hace es convertir un int array en int; me explico mejor si tengo int [5]={1,2,4,5,0}, lo que hace será convertirlo en int=12450

lo que no tengo mucha idea es de convertir a la inversa, de int a int array, osea quisiera de 12450 convertirlo a int [5]={1,2,4,5,0}

ahh y unas dudas mas, el rango de int es de 0 a 255 verdad?
y de int16 a 65535??
y si quiero usar un valor de 99999? qeu tipo de dato uso? int32? existe? o como le hago?

muchas gracias por todo.

Feliz Navidad!! y feliz año!!!!
.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Convertir un int a int array, y duda de rangos
« Respuesta #1 en: 24 de Diciembre de 2006, 16:57:19 »
Creo que la función que pretendes hacer necesitaría un puntero hacia el array destino de los datos a ser convertidos.

Me explico mejor...

Por un lado tienes el número y por el otro lado el arreglo a donde irá guardado ese número separado entre las diversas componentes en base 10.  Decenas de mil, unidades de mil, centenas, decenas y unidades.

Ese arreglo no te sugiero lo pases como parámetro (cosa que tampoco has hecho) ya que en C el pasar un arreglo como parámetro implica que se copie todo en el stack y luego sea leído del mismo lo cual no solo ocupa mucha memoria sino que es muy lento.

Entonces, te sugiero que tu función tenga un prototipo de la siguiente forma:

void int_a_array(int16 num, char * matrizdestino);


Luego dentro de tu rutina divides por 10000  y el resultado se lo restas al numero, y así sucesivamente hasta llegar a las unidades. 

Ej: 45323 / 10000 = 4

Rtdo a guardar = 4
NuevoNumero = 45353 - 10000*Rtdo = 5353;

A medida que haces esas operaciones vas incrementando el puntero matrizdestino para ir guardando el resultado.

Por último tal vez uses CCS el cual no uso , pero de seguro tienes algún tipo de dato equivalente al short long o long que te permita una precisión de 24 y 32 bits respectivamente.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Convertir un int a int array, y duda de rangos
« Respuesta #2 en: 24 de Diciembre de 2006, 18:31:07 »
Hola, yo para convertir de int a un array de int, lo haria de la siguiente forma:
Código: [Seleccionar]
void intToArray(int16 numero, char *resultado){
    unsigned char i,j, aux;

    i = 0;
    do{
        resultado[i] = numero % 10;
        numero = numero / 10;
        i++;
    }while(numero != 0);

    //reordenar el array, pues el resultado anterior esta invertido
   j = 0; i--;
   while(j < i){
     aux = resultado[i];
     resultado[i] = resultado[j];
     resultado[j] = aux;
    j++; i--;
  }
El hacerlo de esta forma, es pq sirve para cualquier entero ya que da igual el número de digitos que tenga el entero. Y para pasar de array a entero lo haria así:

Código: [Seleccionar]
/**
  *   si quieres ahorrarte el pasar como parámetro, el numero de digitos del array, podrias usar algun valor que sirva de centinela
  *   para saber cuando has llegado al final de array.
  */
int16 arrayToInt(char *digitos, unsigned char numDig) {
    unsigned char i;
    int16 resultado = 0;

    for(i = 0; i < numDig; i++) {
        resultado = resultado*10 + digitos[i];
    }
    return resultado;
}

Respecto a lo del almacenamiento de los int, en el caso del CCS tienes int8, int16, int32, que permiten almacenar datos de 8, 16 y 32 bits.

Saludos.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Convertir un int a int array, y duda de rangos
« Respuesta #3 en: 31 de Diciembre de 2006, 12:45:00 »
Hola saludos omix, la conversion tuya de intToArray no me ha funcionado, compila si, pero no funciona, he realizado esta:

int aux,total[5],i,dig_r;
void resultado(int32 resultados)
{
   i=0;
   do
   {
      aux=resultados%10;
      resultados/=10;
      total [ i ]=aux;
      i++;
   }while(resultados!=0);
   dig_r=i;   // digitos resultado
}

y veo que tu usaste varios char, porque? yo quisiera todo en int, talvez provoque eso el problema? alguna sugerencia? esta bien mi funcion?

gracias adios.
« Última modificación: 01 de Enero de 2007, 21:24:30 por Cryn »
.