rutina de clasificación en conjunto para los PIC

K

Kaleborg

Guest
Hola,
Tengo poco de dificultad con mi rutina para la clasificación de la lista.
Código:sortit

bandera BTFSC, 0; esto es parte del problema

cont goto

bandera BsF, 0

movlw 0x30; empieza aquí

movwf FSR

seeifbigmovf INDF, W; valor copia a temp

movwf sTemp1

incf FSR, FILE, copia el siguiente valor

movf INDF, W

SUBWF sTemp1, W; comparar

; Bandera BsF, 0

btfss STATUS, 0; si es mayor o si es cero ...

seeifbig goto

BTFSC STATUS, 2

sortit goto

movf INDF, W

movwf sTemp2; cambiarlo ...

movf sTemp1, W;

movwf INDF

decf FSR, FILE;

movf sTemp2, W

movwf INDF

incf FSR, FILE

; movf FSR, W

; bandera SUBWF, W

bandera FBC, 0; aquí es mi problema

sortit goto

return cont

 
Es la dinámica de la lista o no siempre se sabe cuántos elementos se ordenan -, un contador puede ser añadido.Si es dinámica podría añadir una subrutina para contar cuántos valores han de ser ordenados antes de la clasificación.

 
Gracias por responder.

Hay 16 valores en la lista.Pero, ¿cómo puedo determinar cuántas veces tendrá que repetir clasificación de rutina?Porque si los valores incluidos en la lista son más o menos en orden entonces la rutina tiene que ser repetido sólo 3 veces o 4 veces, pero si la lista es muy complicado, entonces se tardará hasta 50 repite.Regards

 
Use un poco de abanderamiento.

Perdí un poco cada vez que entras en el bucle de clase.Si octetos de cambio, establecer el bit.
Al llegar a la final, el poco todavía se restablecerá cuando se haya terminado.

Brian.

 
Hola betwixt.
Gracias por responder.

Esto no parece estar funcionando para mí.De esta manera bandera, i just cant parecen ser capaces de usarlo en mi código.

¿Quieres ser amable con mirar a mi código y sugerir lo que debería cambiar?
la suya es mi código después del cambio.

Código:sortit btfss flag, 0; cheque por bandera, hay que pasar en el código

ret goto

movlw 0x30; empieza aquí

movwf FSRseeifbig

bandera FBC, 0; restablecer un bit de bandera

movf INDF, W

movwf sTemp1

incf FSR, FILE, copia el siguiente valor

movf INDF, W

SUBWF sTemp1, W; comparar

BTFSC STATUS, 2, 0 si el siguiente valor chek

seeifbig goto, si no comprobar si más grande

btfss STATUS, 0; si es mayor de intercambio

seeifbig goto, si no coninue

swap goto

swap

bandera BSF, 0; indicador establecido

movf INDF, W

movwf sTemp2; cambiarlo ...

movf sTemp1, W;

movwf INDF

decf FSR, FILE;

movf sTemp2, W

movwf INDF

incf FSR, FILE

sortit goto; volver atrás y lista completa de nuevo CHEC

ret

volver

 
No he tenido tiempo para correr a través de un simulador, pero estas son mis ideas iniciales:

1.cambiar la línea "ret goto 'a' regresar '- no hay necesidad de saltar a una instrucción de retorno.A continuación, puede eliminar las dos últimas líneas completamente.

2.No puedo ver cómo se supone que sabe cuando los datos que se termina de clasificación, que se mantendrá un bucle hasta 256 bytes, posiblemente han sido ordenados.Es necesario especificar un valor de terminación en la tabla de datos o decirle que la cantidad de bytes que hay de clasificar.

3.Los cambios estéticos, 'Estado, 2' debe ser "ESTADO, ESTADO Z 'y', 0 'debe ser' STATUS, C '. Asimismo, todas las referencias a' Archivo 'debe ser' f '.

Trate de eso y quiero saber cómo le va.

Brian.

 
Hola betwixt.
Gracias por responder.

Cita:

1.
cambiar la línea "ret goto 'a' regresar '- no hay necesidad de saltar a una instrucción de retorno.
A continuación, puede eliminar las dos últimas líneas completamente.
 
Yo no soy un matemático para que alguien por favor me corrija si me equivoco, creo que el máximo número de iteraciones, suponiendo que la tabla está inicialmente en el orden inverso es "n al cuadrado", donde n es la longitud de la lista se está ordenando.

Así que podría envolver la rutina completa en un bucle que corrió bien ² n veces o la bandera se quedó a cero, lo que ocurriera primero.Tenga en cuenta que tipo de burbuja puede ser muy lento!

O, si usted tiene un valor que usted sabe que nunca tendrá lugar en la lista, podría conectar a la final de la lista y compruebe que cuando se alcanza.

O bien, si la lista es una longitud conocida, se puede comprobar para ver si la FSR se ha llegado a ella mediante la comparación con (0x30 longitud) en cada paso.

Brian.

 
Hola Brian.

Gracias por la respuesta y lo siento para el dolor de estar en la A **.

Voy a probar estas dos sugerencias:

Cita:

O, si usted tiene un valor que usted sabe que nunca tendrá lugar en la lista, podría conectar a la final de la lista y compruebe que cuando se alcanza.O bien, si la lista es una longitud conocida, se puede comprobar para ver si la FSR se ha llegado a ella mediante la comparación con (0x30 longitud) en cada paso.
 

Welcome to EDABoard.com

Sponsor

Back
Top