输入应具有整数字整数的格式,中间有空格。我已经编写了下面的代码,据我所知它的工作原理。我现在正在处理代码的错误检查部分。
如果输入的格式不正确,我该如何检查呢?
我需要检查的三种错误类型将具有以下输入格式:“WORD 99”,“10WORD 33”和“10 WORD”。
提供更多细节。输入的格式为10 READ 10.第一个整数10是输入的其余部分将存储在的存储器地址。在这种情况下,单词或READ是指令。 convertOpCode函数匹配字中的字母以查找与已知指令的匹配,并将指令代码保存到操作代码寄存器中,即* operationCode。第二个整数是操作使用的地址。 Read会将用户输入存储到第二个整数的地址位置。
现在,convertoOpCode函数抛弃第一个空格并读入下一个字符,直到它读取空格。如果空格之间的字符与已知操作匹配,则保存相应的操作代码并返回,如果未找到已知操作,则抛出错误并退出程序。
同样,我仅限于显示的变量。我有int数组“memory”来存储编译结果和显示的5个int变量。我无法创建任何其他数组或缓冲区。
int compile( int memory[], int *accumulator, int *instructionCounter,
int *instructionRegister, int *operationCode, int *operand ){
while( scanf( "%d", accumulator) == 1 ){
*instructionRegister = convertOpCode( instructionCounter, instructionRegister, operationCode, operand );
if( *instructionRegister == 0 ){
ERRORUC( accumulator );
scanf( "%d", operand );
if( *operationCode != 22 ){
if( *operand > 99 ){
ERROROPERAND( accumulator );
memory[ *accumulator ] = ( ( *operationCode ) * 100 ) + ( *operand );
}
else{
if( *operand > 9999 ){
ERRORSET( accumulator );
}
memory[ *accumulator ] = *operand;
}
}
checkHalt( memory, instructionCounter, accumulator );
print( memory );
return 0;
}
这里要求的是convertOpCode函数的外观。
int convertOpCode( int *reg1, int* reg2, int* opCode, int* reg3 ){
getchar();
*reg1 = (int)getchar();
*reg2 = (int)getchar();
*reg3 = (int)getchar();
*opCode = (int)getchar();
switch( *reg1 ){
case (int)'R':
if( *reg2 == (int)'E' && *reg3 == (int)'A' && *opCode == (int)'D' ){
*reg1 = (int)getchar();
if( *reg1 == (int)' ' ){
*opCode = READ;
return 1;
}else{
return 0;
}
}else{
return 0;
}
case (int)'W'.....
}
答案 0 :(得分:0)
我想我不会滥用其他整数来读取操作码的字符。我完全不清楚这项任务的要求,但我过去曾教过C,如果没有其他办法,我也不会提出这样的要求(你的老板可能会有所不同:-))。
我认为您可以在阅读时解析字符,构建一个案例结构,它是允许单词的树。让我们说(例如,简单)你有指示 ASK MUL SUB
int getopcode()
{
if (getchar()==' ') { // ok, starting with space
switch (getchar()) {
case 'A': // probably A(DD) but make sure ...
if (getchar()=='D' && getchar()=='D') {
return 1; // opcode for ADD
}
break;
case 'M': // probably M(UL) but make sure ...
if (getchar()=='U' && getchar()=='L') {
return 2; // opcode for MUL
}
break;
....
}
}
return 0; // error if we arrive here.
}
如果您的操作以相同的字母开头(ADD和ASK),则需要在“A”开关内堆叠第二个开关,以便根据第二个字母继续操作。
对于主程序,我只是为了更多错误检查而重新编写了一些内容(不确定你的某些宏如ERRORUC,但我相信你会得到图片):
while( scanf( "%d", accumulator) == 1 ){
*instructionRegister = getopcode();
if (*instructionRegister!=0) {
if (scanf(" %d", operand )==1) { // ok, one more decimal operand
switch (*operationCode) { // operand error checking per opcode
case 22:
if( *operand> 99 )
ERROROPERAND(accumulator);
break;
default:
if( *operand > 9999 )
ERRORSET(accumulator);
break;
}
}
else {
// error reading 2nd operand
ERRORUC( accumulator );
}
}
else {
// error in opcode
ERRORUC( accumulator );
}
if ( no error set in accumulator, i.e. no ERRORxx macro called) {
// accumulator, instructionRegister and operand are ok here
// write to memory
}
else
break; // break the loop, end compiling
}
print( memory );
return 0;
需要做一些事情来根据错误打破循环,或者最初不要让它成为循环。