Я делаю MIPS-программу, которая читает и решает головоломки какуро.На данный момент он может прочитать и распечатать головоломку, но у меня возникли некоторые проблемы с добавлением проверки ошибок.Мне нужно сделать много проверок, и по какой-то причине программа не завершается так, как должна.Если входные данные содержат недопустимое значение (допустимые значения: 0, или отдельные подсказки в диапазоне 1-45, или отдельную подсказку «блока», равную 99), тогда ваша программа должна распечатать следующее сообщение об ошибке иПрограмма должна завершиться.Некоторые примеры легального ввода:
9999 blocking across and down clues
0799 across clue of 7, blocking down clue
9942 blocking across clue, down clue of 42
1208 across clue of 12, down clue of 8
Итак, вот что я придумал в C:
acrossClue = num / 100;
downClue = num % 100;
if(num != 0 && (1 > acrossClue || 45 < acrossClue || acrossClue != 99)
|| (1 > downClue || 45 < downClue || downClue != 99)) {
printf("Illegal input value, Cross sums terminating\n");
return 1;
}
Ниже приведен код для main и функции чтения, которые я сделал.Любые предложения по передаче условных обозначений и логики в MIPS?В настоящее время он не работает, потому что, даже если он получает неправильный ввод, он все равно работает (readPuzzle возвращает 1, несмотря на преждевременное завершение), и он испортил головоломку, даже если ввод правильный.Я думал, что если входные данные не являются какими-либо из проверенных значений, они не могут быть действительными, но я предполагаю, что где-то в строке я не проверяю должным образом, и все портит.Кто-нибудь замечает что-то не так с какой-либо проверкой, которую я делаю в readPuzzle?
#
# Name: MAIN PROGRAM
# Description: Main logic for the program.
#
# The program reads these values from standard input:
# 1) an integer representing the size of the puzzle
# 2) integers representing values for each cell for the puzzle
#
# If the dimensions of the board and values of the cells are
# valid, the program then displays the initial puzzle, attempts
# to solve it, and displays the solution if there is one.
.text # this is program code
.align 2 # instructions must be on word boundaries
.globl main # main is a global label
main:
# Allocate stack frame
addi $sp, $sp,-FRAMESIZE_40
sw $ra, 32($sp)
sw $s7, 28($sp)
sw $s6, 24($sp)
sw $s5, 20($sp)
sw $s4, 16($sp)
sw $s3, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
la $t0, size
li $v0, READ_INT
syscall
move $s0, $v0 # save size n
blt $s0, MIN_SIZE, size_error
bgt $s0, MAX_SIZE, size_error
sw $v0, 0($t0)
move $a0, $s0
jal readPuzzle
move $t7, $v0
li $v0, PRINT_INT
move $a0, $t7
syscall
beq $v0, $zero, main_done
la $s1, puzzle
li $v0, PRINT_STRING
la $a0, newline
syscall
li $v0, PRINT_STRING
la $a0, banner_border
syscall
li $v0, PRINT_STRING
la $a0, banner_mid
syscall
li $v0, PRINT_STRING
la $a0, banner_border
syscall
li $v0, PRINT_STRING
la $a0, newline
syscall
li $v0, PRINT_STRING
la $a0, initial
syscall
move $a0, $s0
move $a1, $s1
jal printPuzzle
li $v0, PRINT_STRING
la $a0, final
syscall
move $a0, $s0
move $a1, $s1
jal printPuzzle
j main_done
size_error:
li $v0, PRINT_STRING
la $a0, invalid_size
syscall
j main_done
main_done:
# Restore stack frame
lw $ra, 32($sp)
lw $s7, 28($sp)
lw $s6, 24($sp)
lw $s5, 20($sp)
lw $s4, 16($sp)
lw $s3, 12($sp)
lw $s2, 8($sp)
lw $s1, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, FRAMESIZE_40
jr $ra
# Name: readPuzzle
#
# Description: Reads in the puzzle from a file or stdin.
#
# Arguments: a0 The size n
#
# Returns: 1 if the read was successful, otherwise 0
#
readPuzzle:
addi $sp, $sp, -FRAMESIZE_40
sw $ra, 32($sp)
sw $s7, 28($sp)
sw $s6, 24($sp)
sw $s5, 20($sp)
sw $s4, 16($sp)
sw $s3, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
move $s0, $a0
mul $s1, $s0, $s0 # get n * n
li $s2, 0
la $s3, puzzle
li $s4, 4
li $s5, 0 # row = 0
li $s6, 0 # col = 0
mul $s1, $s1, $s4 # get (n * n) * 4 bytes
li $t1, 100
j read_loop
read_loop:
beq $s2, $s1, read_done
beq $s5, $s1, reset
li $v0, READ_INT
syscall
move $s7, $v0
beq $s7, $zero, continue
div $s7, $t1
mflo $t2 # acrossClue = num / 100
mfhi $t3 # downClue = num % 100
seq $t4, $t2, Block_Value
seq $t5, $t3, Block_Value
seq $t6, $t4, $t5
bne $t6, $zero, continue
li $t6, MIN_CLUE # minimum value = 2
li $t7, MAX_CLUE # maximum value = 45
slt $t4, $t2, $t6 # 1 if acrossClue < 2, otherwise 0
slt $t5, $t7, $t2 # 1 if acrossClue > 45, otherwise 0
bne $t4, $zero, illegal_input
bne $t5, $zero, illegal_input
slt $t4, $t3, $t6 # 1 if downClue < 2, otherwise 0
slt $t5, $t7, $t3 # 1 if downClue > 45, otherwise 0
bne $t4, $zero, illegal_input
bne $t5, $zero, illegal_input
j continue
continue:
move $a0, $s5
move $a1, $s6
move $a2, $s7
jal setElement
addi $s6, $s6, 1
addi $s2, $s2, 4
j read_loop
reset:
addi $s5, $s5, 1
li $s6, 0
illegal_input:
li $v0, PRINT_STRING
la $a0, invalid_input
syscall
li $v0, 0
j read_done
read_done:
li $v0, 1
lw $ra, 32($sp)
lw $s7, 28($sp)
lw $s6, 24($sp)
lw $s5, 20($sp)
lw $s4, 16($sp)
lw $s3, 12($sp)
lw $s2, 8($sp)
lw $s1, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, FRAMESIZE_40
jr $ra
Редактировать: я получил его, чтобы он правильно знал, когда ввод действителен или недействителен, но он все еще не завершается, когдаесть неверное входное значение.