Questo topic e' stato chiuso dal moderatore.
09/05/13 18:09
lavitz
Innanzitutto salve a tutti sono nuovo, prima di postare ho cercato nel forum, ho trovati casi simili al mio ma non proprio uguali, che ahimé non hanno saputo aiutarmi molto, ho un problema specifico nella mia funzione che non riesco a risolvere.. Spero possiate aiutarmi il prima possibile! Quindi un grazie in anticipo!
Premetto che uso il MARS e non spim.
la funzione che sto cercando di creare deve, preso in input l'indirizzo di una stringa di testo terminata da zero presente in memoria, rendere maiuscola l'iniziale di ogni parola.
Spiego meglio con l'esempio: inserisco la stringa "marCo noN Sa pRoGRAMMare in MIps!"
la funzione dovra ritornare "Marco Non Sa Programmare In Mips!"
Il codice da me ideato é:
EDIT: ho risolto il problema di prima, Ora UN PROBLEMA DI CUI non trovo l'errore..
Mi stampa tutto in minuscolo, non converte da minuscolo a maiuscolo.. sapete perche?
Spero di essermi spiegato abbastanza e mi auguro che il codice sia facilmente comprensibile, i 4 registri usati sono:
T0 = dove carico il carattere della stringa di input
T1 = indice i del primo ciclo for
T2 = indice j del secondo ciclo for
T3 = carattere di spazio " "
T4 = registro FLAG usato come boolean
Premetto che uso il MARS e non spim.
la funzione che sto cercando di creare deve, preso in input l'indirizzo di una stringa di testo terminata da zero presente in memoria, rendere maiuscola l'iniziale di ogni parola.
Spiego meglio con l'esempio: inserisco la stringa "marCo noN Sa pRoGRAMMare in MIps!"
la funzione dovra ritornare "Marco Non Sa Programmare In Mips!"
Il codice da me ideato é:
FUNZ1: la $t3, space loop: lb $t0, 0($a0) beqz $t0, end #fine della stringa raggiunta! seq $t4, $t0, $t3 #se il Char caricato é uno spazio, t4=1 altrimenti t4=0, lo uso come un booleano beq $t4, 1, next #se ho uno spazio passo al char successivo li $t2, 97 # inizializzo l'indice j del secondo for li $t1, 60 # inizializzo l'indice i del primo for for1: bne $t0, $t1, add1 #se diversi passo a incrementare la i del for j ctrlUpper for2: bne $t0,$t2, add2 #se diversi incremento la j del secondo for j ctrlLower ctrlUpper: beq $t4, 1, next #se il char segue uno spazio lo lascio invariato e passo al prossimo UPNow: addi $t0, $t0, 32 #trasformo il char da maiuscolo a minuscolo li $t4, 0 #azzero il booleano j next ctrlLower: bne $t4, 1, next # lascio invariato il char minuscolo subi $t0, $t0, 32 #trasformo il char da minuscolo a MAIUSCOLO j next add1: #gestione primo ciclo bgt $t1, 90, for2 #se i > 90 non ho maiuscole e passoa controllare con il 2 for addi $t1, $t1, 1 # i++ j for1 add2: #gestione secondo ciclo for bgt $t2, 122, next #se j > 122 non ho una lettera, lo lascio invariato e passo avanti addi $t2, $t2, 1 #j++ j for2 next: sb $t0, 0($a0) #sostituisco con il carattere precedentemente in quella posizione addi $a0, $a0, 1 # NEXT CHAR beq $t4, 1, UPNow #modifico direttamente il carattere successivo in maiuscolo j loop end: jr $ra #torno alla funzione principale
EDIT: ho risolto il problema di prima, Ora UN PROBLEMA DI CUI non trovo l'errore..
Mi stampa tutto in minuscolo, non converte da minuscolo a maiuscolo.. sapete perche?
Spero di essermi spiegato abbastanza e mi auguro che il codice sia facilmente comprensibile, i 4 registri usati sono:
T0 = dove carico il carattere della stringa di input
T1 = indice i del primo ciclo for
T2 = indice j del secondo ciclo for
T3 = carattere di spazio " "
T4 = registro FLAG usato come boolean
Ultima modifica effettuata da lavitz 09/05/13 21:28
aaa