Autor Tema: Atascado con arrays y operaciones  (Leído 2844 veces)

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

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Atascado con arrays y operaciones
« en: 09 de Junio de 2006, 11:44:17 »
Hola.

Me he quedado atascado en una parte del código que estoy realizando, y ya me está hasta doliendo la cabeza de tanto pensar de como hacer lo siguiente...

Recojo valores mediante serin y los los introduzco en un array. Hasta aquí todo bien.

El problema es que necesito dividir un valor, que en realidad son 4 elementos del array. Pongo un ejemplo

dato var byte[4] -- Defino el Array de dato y núemro de elementos.

serin xxxxxx -- Los datos recibidos se almacenan en dicho array.

Ejemplo de datos almacenados.
dato[0]="5"
dato[1]="7"
dato[2]="9"
dato[3]="3"

Ok. Ahora necesito que se convierta en "5793" para poder dividirlo entre 1,56  y que lo muestre en el LCD :(

Ya sé que PBP no tiene mucho soporte para strings. No puedo convertir el array en un string ?. Creo que no, despues de horas buscando info.. o no he dado con ello o es que tengo la cabeza a punto de estallar.

En C creo que si se puede, pero no me defiendo nada bien con el y prefiero seguir con PBP.

Alguna pista de como lo puedo hacer ?.

Gracias.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Atascado con arrays y operaciones
« Respuesta #1 en: 09 de Junio de 2006, 12:08:33 »
Hola:

Solo necesitas una multiplicacion y suma, nada mas:

dato[0]=5
dato[1]=7
dato[2]=9
dato[3]=3


tienes que ir multiplicando por 1000 para los miles, 100 paara las centenas, 10 para las decenas, y la unidad queda tal cual esta, luego sumas los valores y tienes el numero, ejemplo:

5 * 1000 = 5000
7* 100    =  700
9*10       =   90
3*1         =     3

=

5793

Eso es todo, ya lo tienes...

Suerte...!!!  :-/

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #2 en: 09 de Junio de 2006, 12:39:14 »
Hola:

Solo necesitas una multiplicacion y suma, nada mas:

dato[0]=5
dato[1]=7
dato[2]=9
dato[3]=3


tienes que ir multiplicando por 1000 para los miles, 100 paara las centenas, 10 para las decenas, y la unidad queda tal cual esta, luego sumas los valores y tienes el numero, ejemplo:

5 * 1000 = 5000
7* 100    =  700
9*10       =   90
3*1         =     3

=

5793

Eso es todo, ya lo tienes...

Suerte...!!!  :-/

Muuuuchas gracias LordLafebre.

Te refieres a esto verdad ? :

dato var byte[4]
suma var byte

dato[0]=5
dato[1]=7
dato[2]=9
dato[3]=3

dato[0]=dato[0]*1000
dato[1]=dato[1]*100
dato[2]=dato[2]*10

suma=dato[0]+dato[1]+dato[2]+dato[3]

En cuanto llegue a casa lo pruebo, que ahora estoy en el curro.


Un saludo y grax

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Atascado con arrays y operaciones
« Respuesta #3 en: 09 de Junio de 2006, 15:02:05 »
Hola:

A eso me refiero, pero ten en cuenta que las variables tienen que ser de tipo WORD, lo demas esta bien.

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #4 en: 11 de Junio de 2006, 16:47:50 »
Hola:

A eso me refiero, pero ten en cuenta que las variables tienen que ser de tipo WORD, lo demas esta bien.

Nada, que no doy con ello. Lo siguiente no me funciona. Y con otras combinaciones tampoco. Y seguro que es sencillisimo de solucionar.

b0 var byte[60]
l6 var word
km var word


' l6 es un numero cualquiera de 1 a 59

km=(b0[l6+1]*100)+ (b0[l6+2]*10) + (b0[l6+3])
lcdout $fe,1,dec km*185/100," Km/h"


'El array b0 lo recojo de la siguiente manera :

serin2 portc.3,16572,4000,error,[wait("EMPIEZA,"), str b0\60\"*"]

Me imagino que sera porque b0 es BYTE y km es WORD.... pero como puedo pasar de BYTE a WORD?. He probado con
dato2=DEC b0[l6+1] , pero nada. Eso no se puede hacer :lol: O recojer con SERIN2 como DEC1, pero es que aparte de números, tambien hay letras.

Un saludo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Atascado con arrays y operaciones
« Respuesta #5 en: 11 de Junio de 2006, 17:54:14 »
Hola. Bueno...nunca he tocado el PBP, pero un detalle:
Dijiste que:
' l6 es un numero cualquiera de 1 a 59(en realidad no seria del 0 al 59?)
Segundo, te estas respondiendo tu mismo: si l6 va ser un valor x/ 0<=x<=59 entonces pa que declaras l6 como word cuando puede ser de tipo byte? Esto hara un mejor ahorro de registros RAM, y evita posibles fallos.
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #6 en: 11 de Junio de 2006, 19:18:16 »
Hola. Bueno...nunca he tocado el PBP, pero un detalle:
Dijiste que:
' l6 es un numero cualquiera de 1 a 59(en realidad no seria del 0 al 59?)
Segundo, te estas respondiendo tu mismo: si l6 va ser un valor x/ 0<=x<=59 entonces pa que declaras l6 como word cuando puede ser de tipo byte? Esto hara un mejor ahorro de registros RAM, y evita posibles fallos.
Saludos.

Si. l6 es de 0 a 59.
A la variable l6, despues del serin le hago un conteo sumatorio así :
 
uno:
  if b0[l1]<>"," then
   l1=l1+1
   goto empieza
   endif
   l2=l1+1

En l1 almaceno la cantidad de caracteres recibidos hasta la coma ",". Los datos entrantes son de longitud variable delimitados por comas.
Por lo que .... b0[l1+1] es el primer caracter de lo recibido despues de la primera coma. "hola,como,estas" (seria la c) y así sucesivamente.

Creo que el problema no está en l1, ni l2, ni l... Aunque no he probado a declarar l1 como BYTE.

No entiendo mucho cuando he de usar un WORD o BYTE. Es mejor un byte para por ejemplo j=j+1 ? . BYTE cuando trato con FOR con datos seriales y suma de variable ?.

Un saludo
« Última modificación: 11 de Junio de 2006, 19:48:26 por derinium »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Atascado con arrays y operaciones
« Respuesta #7 en: 11 de Junio de 2006, 20:11:01 »
Hola.
Aca LordLafebre explica la diferencia entre BYTE y WORD concisamente:
http://www.todopic.com.ar/foros/index.php?topic=3613.msg70464#msg70464

Es muy largo el codigo? Podes postearlo asi lo vemos como funciona? Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #8 en: 12 de Junio de 2006, 04:12:37 »
OK. Ahora entiendo mejor la diferencia. Solo es cosa de longitud. Pero no encontraba la "lógica adecuada" del uso aunque parezca simple. Símplemente es por la "cantidad". Y, claro, el ser BYTE se reserva menos memoria que con WORD. Me confundía al pensar que una operación con byte era diferente que con word  8)... y veo que no es así. Aunque el uso de WORD, a veces, no es por la longitud, es por los datos contenidos.

Por lo del código.. pues ocupa los 7K al completo. La parte que falla es :

b0 var byte[60]
l1 var byte
l2 var byte
l3 var byte
km var word

muestra:

gosub comienzo

km=(b0[l2+1]*100)+ (b0[l2+2]*10) + (b0[l2+3])
lcdout $fe,1,dec km*185/100," Km/h"

goto muestra

comienzo:
serin2 portc.3,16572,4000,error,[wait("EMPIEZA,"), str b0\60]

l1=0:l2=0:l3=0

uno:
  if b0[l1]<>"," then
   l1=l1+1
   goto uno
   endif
   l2=l1+1
dos:
  if b0[l2]<>"," then
   l2=l2+1
   goto dos
   endif
   l3=l2+1

tres:
  if b0[l3]<>"," then
   l3=l3+1
   goto tres
   endif
 
   return

Un saludo.
« Última modificación: 12 de Junio de 2006, 04:29:58 por derinium »

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #9 en: 13 de Junio de 2006, 11:03:12 »
Bien, pues ya he encontrado la solución, y mira que es de la mar de sencilla y lo que ha costado !.

km=((b0[l2+1]-48)*100)+ ((b0[l2+2]-48)*10) + (b0[l2+3]-48)

el -48 es sencillo de entender, el 48 es en ascii el número "0", por lo que haciendo la resta obtenemos el número en decimal.

Un saludo.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Atascado con arrays y operaciones
« Respuesta #10 en: 13 de Junio de 2006, 19:56:21 »
No trabajo en basic y no se si se podria hacer pero en "C" ponemos en lugar del 48 la siguiente expresion:

km=((b0[l2+1]-'0')*100)+ ((b0[l2+2]-'0')*10) + (b0[l2+3]-'0'), puedes probar haber si funciona para que quede el código un poco mas claro.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Atascado con arrays y operaciones
« Respuesta #11 en: 14 de Junio de 2006, 04:22:01 »
No trabajo en basic y no se si se podria hacer pero en "C" ponemos en lugar del 48 la siguiente expresion:

km=((b0[l2+1]-'0')*100)+ ((b0[l2+2]-'0')*10) + (b0[l2+3]-'0'), puedes probar haber si funciona para que quede el código un poco mas claro.

Un saludo


Creo que eso no funcionaría y ahora no lo puedo probar. Las comillas ok en C, en PHP, JAVASCRIPT, etc, y lo sé. Pero en PBP, no. Tampoco sé si funcionaría con comillas simples  :shock:, siempre he usado las dobles. PBP está muuuuy limitado a las funciones que tienen otros lenguajes.

De todas formas, el código con el -48, funciona perfectamente.

Un saludo.