TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cryn 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!!!!
-
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
-
Hola, yo para convertir de int a un array de int, lo haria de la siguiente forma:
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í:
/**
* 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.
-
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.