|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - m0skit0
Páginas: 1 ... 38 39 [40] 41 42 ... 100
976
« en: Martes 9 de Junio de 2009, 10:58 »
se podría poner, en vez de cuatro, nfils, que sería el número de filas, y ncolums, que sería número de columnas no?? Bueno, eso es evidente, pero teniendo en cuenta que la matriz es cuadrada: #define TAM_MATRIZ 4 int matriz[TAM_MATRIZ][TAM_MATRIZ]; int i,j; int suma[4] = {0,0,0,0}; /* Inicializaciones */ [...] for (i=0;i<TAM_MATRIZ;i++) for(j=0;j<TAM_MATRIZ;j++) if(i<TAM_MATRIZ/2) if(j<TAM_MATRIZ/2) suma[0] += matriz[i][j]; else suma[1] += matriz[i][j]; else if(j<TAM_MATRIZ/2) suma[2] += matriz[i][j]; else suma[3] += matriz[i][j];
Y seguro, seguro que se puede optimizar, lo que pasa es que no tengo tiempo (ni ganas  ) de comerme la cabeza con ello.
977
« en: Martes 9 de Junio de 2009, 10:20 »
Eso sería sólo para cuando la matriz es de 4x4 no?? Es lo que preguntaste  De todas formas, si la matriz resultante siempre es de 2x2, el código te vale. Otra cosa distinta es que la matriz resultante sea la mitad de la de entrada...
978
« en: Martes 9 de Junio de 2009, 09:37 »
Ok, estamos de acuerdo Una manera que se me ocurre ahora por la mañana  sería: int matriz[4][4]; int i,j; int suma[4] = {0,0,0,0}; /* Inicializaciones */ [...] for (i=0;i<4;i++) for(j=0;j<4;j++) if(i<2) if(j<2) suma[0] += matriz[i][j]; else suma[1] += matriz[i][j]; else if(j<2) suma[2] += matriz[i][j]; else suma[3] += matriz[i][j];
Esto es una porquería de algoritmo  , seguramente se pueda optimizar, pero lo pongo igualmente a lo mejor alguien tiene una idea mejor viéndolo; ahora mismo no caigo en nada. Quedaría hacer la media e insertar los resultados en una matriz 2x2 como pretendes, pero eso ya son detalles nada más, ¿no? Un saludo
979
« en: Lunes 8 de Junio de 2009, 19:29 »
¿necesariamente hay que iniciar en 0 en C hay alguna explicacion para ello?. Sí, es así. Será mejor que te acostumbres Efectivamente. alumnos[j] es un carácter, no una cadena de caracteres, ya que lo has declarado como char alumnos[5]. Si lo que quieres es un vector de cadenas, debes declararlo como char* alumnos[5].
980
« en: Lunes 8 de Junio de 2009, 15:53 »
Ok, no te había entendido. Suponiendo la matriz de entrada como int matriz[4][4], sería cuestión de calcular la media de matriz[0-1][0-1], matriz[0-1][2-3], matriz[2-3][0-1] y matriz[2-3][2-3]. ¿Es eso?
981
« en: Lunes 8 de Junio de 2009, 13:09 »
Bueno, pero si los agrupas de 4 en 4 te va a quedar una matriz de 1x4 y no 2x2. Sería cuestión de agruparlos de otra forma.
982
« en: Lunes 8 de Junio de 2009, 12:31 »
Pásala de .ppm y .pgm a .bmp y luego a .ico
984
« en: Lunes 8 de Junio de 2009, 11:08 »
¿Qué tiene que ver esto con VB6? Y si es para hoy por la tarde, pues ya podrías haber empezado antes...
985
« en: Domingo 7 de Junio de 2009, 06:11 »
Para que Print se ejecute 7 veces debes ponerlo dentro del for. Pero te va a imprimir 7 veces lo mismo porque h no cambia dentro del bucle.
Igualmente ese código es muy raro... Basta con poner For i = 0 To 7 y quitarse Dim X(7) As Double de encima.
986
« en: Sábado 6 de Junio de 2009, 14:41 »
El tamaño, evidentemente, por tanto en 4 bytes podemos tener números más grandes que en un byte, ¿no? A la hora de operar no tienes ninguna diferencia.
987
« en: Sábado 6 de Junio de 2009, 13:10 »
Que quieres decir con perdida de rango? ¿Qué diferencia hay entre un número de un byte y uno de una palabra? Osea antes de meterlo a encode, directamente no lo meto y listo, no? No puedes evitar que se meta, puesto que tú no controlas lo que hace la llamada al sistema. Lo único que te queda es quitarlo después de que la llamada al sistema lo hay metido en el buffer.
988
« en: Viernes 5 de Junio de 2009, 17:35 »
Pues el 2 lo he acabado usando porque con el 4 no me dejaba. Normal, no existe el registro $a4 Asi que supongo que en encode1, tengo los caracteres, y en encode2, las veces que se repite. ¿Supones? No necesitas suponer nada, tienes el contenido de la memoria a la vista, hombre... Ahora he creado un nuevo "vector" encode, tendria que almacenar un numero, una letra, y asi, hasta que no sea final de caracter, no es asi? Sí, pero tu problema ahora va a ser el alineamiento. Es decir, si guardas un byte y una palabra, la palabra no va a estar alineada en una dirección múltiplo de 4 bytes y te va a dar error de alineamiento. Esto lo puedes solucionar de 2 formas: o bien convirtiendo los bytes en palabras (con el consiguiente gasto de memoria) o bien conviertes los números en bytes (con la consiguiente pérdida de rango). Por cierto recuerdo que el enter me lo contaba, como lo puedo eliminar de encode 1 y de encode2? Mejor elimínalo al principio, justo tras guardar la cadena en Encode. Ya que es el penúltimo carácter, debería ser algo sencillo.
989
« en: Viernes 5 de Junio de 2009, 14:21 »
Primero, te has olvidado de sw guarda 4 bytes y no 1, por tanto hay que avanzar el puntero 4 bytes y no 1 #avanzo el puntero addiu $a3,$a3,1 addiu $a4,$a4,4
solamente tengo que cambiar el 4 por un 1 Eso te imprime 1 número, no un vector de números. Tendrías que hacer un bucle de impresión. La cuestión es cuándo parar independientemente de los errores en los or, la idea es esa, verdad? El error de los or es porque te has olvidado el $. Y la idea es algo así, aunque personalmente no lo haría de esa manera. Pero creo que así funcionaría. Ya me cuentas. PD: ¿qué paso con $a2? xD
990
« en: Viernes 5 de Junio de 2009, 13:28 »
Sigues cometiendo varios errores, incluído el del syscall Empecemos por la función: #avanzo el puntero addiu $t3,$zero,1 addiu $t4,$zero,1
¿Avanzas el puntero? Yo sólo veo que asignas t3 = 1 y t4 = 1. Eso no es avanzar el puntero. Además, el avance de los punteros tendrías devolver los punteros actualizados al programa principal, para no sobreescribir siempre el mismo valor. Y evidentemente actualizarlos en el programa principal. ori $v0,$zero,4 la $a0,encode2 syscall
La función 4 de syscall imprime una cadena de caracteres, no un array de números
991
« en: Viernes 5 de Junio de 2009, 12:50 »
add $a0,$zero,$s1 #El carácter en $a0 jal almacenar # Llamamos a la función almacenar() add $a1,$zero,$v0 # Ponemos el número de caracteres en $a1
En a0 el carácter, en a1 el número de caracteres. A ver si leemos Vale lo de a0 lo entiendo, es ciero que se pasaban por esos registros, aunque el caracter este también en s1. Sí, pero te tienes que atener a los parámetros de la función. Si usas la función en otro programa por ejemplo, $s1 no tiene por qué tener ese carácter. Piensa en la función como un programa aparte
992
« en: Viernes 5 de Junio de 2009, 12:26 »
sb $t1,0($s3) #meto el caracter en la primera direccion de s3 sw $s1,0($s3)
¿Esto qué es, tíooooooo? Primero, los argumentos de la función se pasan en a0 y a1, no sé qué haces almacenando t1 y s1  Además, estás usando s3 como puntero de desetino en ambos, ¿entonces para qué cargas s4? entonces seria mejor que usara los registros tX en la funcion almacenar en vez de los sX, no? Sí, eso exactamente. Ahora intento imprimirlo para ver si lo he hecho bien: Para ver si lo has hecho bien, depura paso a paso.
993
« en: Viernes 5 de Junio de 2009, 11:50 »
La diferencia entre sb y sw es muy simple: ambos guardan un registro en la memoria, pero sb guarda tan sólo el byte bajo mientras que sw guarda el registro entero (una palabra, 4 bytes). Así que evidentemente tenemos que usar sb para los caracteres (un carácter = un byte) y sw para los números (sólo para tener una rango más grande, se podría usar sb perfectamente). Tu problema radica en que tienes mal la sintaxis de sb (o sw, lb, lw, es la misma): sb registro, desplazamiento(registro_puntero)
Y siempre es así, aunque el desplazamiento sea cero, hay que poner un cero. Además, acuérdate de que las funciones no deberían modificar el valor de los registros sX, o si lo hacen deben restaurar el valor que tenían previamente. Ánimo, que ya casi lo tienes
994
« en: Viernes 5 de Junio de 2009, 10:49 »
seria tan facil como hacer: Me parece que ese código no te va a funcionar porque es erróneo, y mucho. Pruébalo y verás lo que te dice el simulador. Te falta por aprender ensamblador MIPS básico... y te aconsejo que te pongas las pilas, porque no siempre vas a tener el foro delante, no sé si me explico me dices que la llamarias detras de procesar, pero no se si te refieres a llamarla inmediatamente detrás de procesar o de todo el proceso, osea procesar_noiguales, yo es que solo concibo llamarla despues de procesar_noiguales. Puedes hacerlo como te dé la gana, siempre que funcione, aunque al final voy a terminar haciéndolo todo yo  Yo lo que digo es hacer otra función que se llame tras procesar(), por ejemplo llamada almacenar(): # # Codificar # start: la $s0, Entrance sig_carac: lbu $s1, 0($s0) beq $s1, $zero, fin # Si es el carácter de final de cadena, ya terminamos add $a0,$zero,$s1 # Pasando el primer parámetro a la función procesar() jal procesar # Llamamos a la función procesar() addiu $a1,$s0,1 # Pasando el segundo parámetro a la función procesar() add $a0,$zero,$s1 #El carácter en $a0 jal almacenar # Llamamos a la función almacenar() add $a1,$zero,$v0 # Ponemos el número de caracteres en $a1 beq $zero,$zero,sig_carac # Siguiente carácter diferente or $s0, $zero, $v1 # Actualizamos el puntero con el valor devuelto # # Exit # fin: ori $v0,$zero,10 # Terminamos con exit syscall
Fíjate que he cambiado $t0 por $s1, así mantenemos el carácter en un registro y se lo podemos pasar a almacenar(), ya que procesar() modifica $t0. Por convenio, en MIPS los registros sX deben mantener el valor a la vuelta de la función, mientras que los tX no tienen por qué. Sólo quedaría por hacer la función almacenar(), claro. Pero si quieres meterlo todo en la misma función, tú mismo. A mí simplemente me parecen dos funciones diferentes, y así incluso podrías usar procesar() o almacenar() para otro ejercicio u proyecto. Bueno, ya me dices, un saludo  y mírate las instrucciones de MIPS bien
995
« en: Jueves 4 de Junio de 2009, 20:50 »
Bueno, he averiguado lo que pasa. Esto pasa porque no haces caso a lo que digo  No tienes activado el "delayed branching". Esto deberías dejarlo siempre puesto porque en la realidad los procesadores MIPS funcionan así. Venga, a currar
996
« en: Jueves 4 de Junio de 2009, 19:10 »
Yo no sé qué pasa, si no copias bien el código, o cómo... Mira, he puesto que imprima el resultado, te vuelvo a postear el código y una captura del programa corriendo en el MARS. Si te sigue dando ese error en el PCSPIM coméntaselo a tu profe/jefe/loquesea. .data Entrance: .space 80 encode1: .space 40 encode2: .space 40 decode: .space 80 msg1: .asciiz "Please insert the String: " msg2: .asciiz " " msg3: .asciiz "n String encode like: " msg4: .asciiz "n String decode like: " .text .globl main # # Main # main: ori $v0,$zero,4 la $a0,msg1 syscall #Almacenar el String en la matriz # Número de syscall ori $v0,$zero,8 # $a0 = buffer para guardar la cadena la $a0,Entrance # $a1 = tamaño a leer ori $a1,$zero,80 syscall #Imprimir la matriz # Número de syscall ori $v0,$zero,4 # $a0 = buffer a imprimir la $a0,Entrance syscall # # Codificar # start: la $s0, Entrance sig_carac: lbu $t0, 0($s0) beq $t0, $zero, fin # Si es el carácter de final de cadena, ya terminamos add $a0,$zero,$t0 # Pasando el primer parámetro a la función procesar() jal procesar # Llamamos a la función procesar() addiu $a1,$s0,1 # Pasando el segundo parámetro a la función procesar() addiu $a0,$v0,1 addiu $v0,$zero,1 syscall beq $zero,$zero,sig_carac # Siguiente carácter diferente or $s0, $zero, $v1 # Actualizamos el puntero con el valor devuelto # # Exit # fin: ori $v0,$zero,10 # Terminamos con exit syscall # # Procesar (habría que poner un nombre más explicativo :) # # Recibe un carácter y el puntero a una cadena # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena # Devuelve en $v0 el número de caracteres iguales # y en $v1 el puntero al primer carácter diferente encontrado procesar: add $v0, $zero, $zero # Inicializamos valores de retorno add $v1, $zero, $a1 add $t1, $zero, $zero # Contador de caracteres iguales consecutivos procesar_iguales: lbu $t0, 0($a1) # Cargamos el siguiente carácter a comparar bne $a0, $t0, procesar_noiguales # Si no son iguales, terminamos addiu $a1, $a1, 1 # Apuntamos al siguiente carácter beq $zero, $zero, procesar_iguales addiu $t1, $t1, 1 # Si son iguales, aumentamos el contador en uno procesar_noiguales: add $v0, $v0, $t1 # Ponemos los valores de retorno add $v1, $v1, $t1 # Volvemos de la función jr $ra nop
Y la captura: [attachment=0:2y3tse4c]captura1.jpg[/attachment:2y3tse4c] El uno que sale al final es por el ENTER, sólo es cuestión de suprimirlo o sustituír la comparación con ASCII cero por ASCII 10. Ya me comentas, un saludo PD: no puedo usar el PCSPIM en el curro porque necesita de instalación y no tengo permisos para ello
997
« en: Jueves 4 de Junio de 2009, 18:35 »
Pues tío, yo lo he ejecutado en MARS y no me salta nada de eso, de hecho funciona como debería. Y el error que me pones es del manejador de excepciones del PCSPIM Vuelvo a poner el código por si he cambiado algo .data Entrance: .space 80 encode1: .space 40 encode2: .space 40 decode: .space 80 msg1: .asciiz "Please insert the String: " msg2: .asciiz " " msg3: .asciiz "n String encode like: " msg4: .asciiz "n String decode like: " .text .globl main # # Main # main: ori $v0,$zero,4 la $a0,msg1 syscall #Almacenar el String en la matriz # Número de syscall ori $v0,$zero,8 # $a0 = buffer para guardar la cadena la $a0,Entrance # $a1 = tamaño a leer ori $a1,$zero,80 syscall #Imprimir la matriz # Número de syscall ori $v0,$zero,4 # $a0 = buffer a imprimir la $a0,Entrance syscall # # Codificar # start: la $s0, Entrance sig_carac: lbu $t0, 0($s0) beq $t0, $zero, fin # Si es el carácter de final de cadena, ya terminamos add $a0,$zero,$t0 # Pasando el primer parámetro a la función procesar() jal procesar # Si no, llamamos a la función procesar() addiu $a1,$s0,1 # Pasando el segundo parámetro a la función procesar() beq $zero,$zero,sig_carac # Siguiente carácter diferente or $s0, $zero, $v1 # Actualizamos el puntero con el valor devuelto # # Exit # fin: ori $v0,$zero,10 # Terminamos con exit syscall # # Procesar (habría que poner un nombre más explicativo :) # # Recibe un carácter y el puntero a una cadena # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena # Devuelve en $v0 el número de caracteres iguales # y en $v1 el puntero al primer carácter diferente encontrado procesar: add $v0, $zero, $zero # Inicializamos valores de retorno add $v1, $zero, $a1 add $t1, $zero, $zero # Contador de caracteres iguales consecutivos procesar_iguales: lbu $t0, 0($a1) # Cargamos el siguiente carácter a comparar bne $a0, $t0, procesar_noiguales # Si no son iguales, terminamos addiu $a1, $a1, 1 # Apuntamos al siguiente carácter beq $zero, $zero, procesar_iguales addiu $t1, $t1, 1 # Si son iguales, aumentamos el contador en uno procesar_noiguales: add $v0, $v0, $t1 # Ponemos los valores de retorno add $v1, $v1, $t1 # Volvemos de la función jr $ra nop
Y si quieres prueba el MARS, que personalmente prefiero al PCSPIM, porque tiene una interfaz más intuitiva y más legible, se puede volcar la memoria, etc... : http://courses.missouristate.edu/KenVol ... wnload.htmEso sí, es un JAR (fistro! xD) y necesitarás una máquina virtual Java para que tire.
998
« en: Jueves 4 de Junio de 2009, 18:15 »
Supongo que habrá que usar or en vez de ori, no? ya que ori es para un valor inmediato y estamos usando registros, no es asi? Cierto ¿Lo has ejecutado paso a paso? Mira a ver cuándo te da ese error. A ver si lo pruebo esta tarde...
999
« en: Jueves 4 de Junio de 2009, 12:55 »
Error mío otra vez... Si es que... Hay que usar lb y no lw puesto que trabajamos con bytes (caracteres). Perdona. Además hay más cambios, se ve que estaba empanao... .data Entrance: .space 80 encode1: .space 40 encode2: .space 40 decode: .space 80 msg1: .asciiz "Please insert the String: " msg2: .asciiz " " msg3: .asciiz "n String encode like: " msg4: .asciiz "n String decode like: " .text .globl main # # Main # main: ori $v0,$zero,4 la $a0,msg1 syscall #Almacenar el String en la matriz # Número de syscall ori $v0,$zero,8 # $a0 = buffer para guardar la cadena la $a0,Entrance # $a1 = tamaño a leer ori $a1,$zero,80 syscall #Imprimir la matriz # Número de syscall ori $v0,$zero,4 # $a0 = buffer a imprimir la $a0,Entrance syscall # # Codificar # start: la $s0, Entrance sig_carac: lbu $t0, 0($s0) beq $t0, $zero, fin # Si es el carácter de final de cadena, ya terminamos add $a0,$zero,$t0 # Pasando el primer parámetro a la función procesar() jal procesar # Si no, llamamos a la función procesar() addiu $a1,$s0,1 # Pasando el segundo parámetro a la función procesar() beq $zero,$zero,sig_carac # Siguiente carácter diferente ori $s0, $zero, $v1 # Actualizamos el puntero con el valor devuelto # # Exit # fin: ori $v0,$zero,10 # Terminamos con exit syscall # # Procesar (habría que poner un nombre más explicativo :) # # Recibe un carácter y el puntero a una cadena # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena # Devuelve en $v0 el número de caracteres iguales # y en $v1 el puntero al primer carácter diferente encontrado procesar: addiu $v0, $zero, $zero # Inicializamos valores de retorno addiu $v1, $zero, $a1 addiu $t1, $zero, $zero # Contador de caracteres iguales consecutivos procesar_iguales: lbu $t0, 0($a1) # Cargamos el siguiente carácter a comparar bne $a0, $t0, procesar_noiguales # Si no son iguales, terminamos addiu $a1, $a1, 1 # Apuntamos al siguiente carácter beq $zero, $zero, procesar_iguales addiu $t1, $t1, 1 # Si son iguales, aumentamos el contador en uno procesar_noiguales: add $v0, $v0, $t1 # Ponemos los valores de retorno add $v1, $v1, $t1 # Volvemos de la función jr $ra nop
1000
« en: Jueves 4 de Junio de 2009, 10:54 »
Me he asegurado de quitar todos los espacios tras las comas, y nada, sigue dando exactamente el mismo error Cierto, mein fault! Es add y no addiu
Páginas: 1 ... 38 39 [40] 41 42 ... 100
|
|
|