简体   繁体   English

未在此范围内声明

[英]Not declared in this scope

I'm in the process of implementing a MIPS instruction set simulator. 我正在实现MIPS指令集模拟器。 But when I try compiling my code, I keep getting "out of scope" errors and it's getting to be very frustrating. 但是,当我尝试编译我的代码时,我会不断遇到“超出范围”的错误,这将变得非常令人沮丧。 I've tried all kinds of variations, but nothing seems to be helping. 我尝试了各种变体,但似乎无济于事。
Here's my MIPSsim.cpp file 这是我的MIPSsim.cpp文件

#include <iostream>
#include <fstream>
#include <string>
#include <cassert>

using namespace std;
const int BITS = 32;

string inst_decode(string line);
void execute(string line, string instruction, int &registers[]);
void print(int cycle, int inst_address, int regs[]/*, int data[]*/);
int convert_5(string binary);
int convert_32(string binary);
void add(string line, int &registers[]);
void sub(string line, int &registers[]);
void mult(string line, int &registers[]);


string inst_decode(string line){
    string instruction; 
    if(line.compare(0,1,"0") == 0){
        if (line.compare(1,5,"00010") == 0){
            cout << "JUMP" << endl;
            instruction = "JUMP";
        }else if (line.compare(1,5,"00100") == 0){
        cout << "BEQ" << endl;
        instruction = "BEQ";
    }else if (line.compare(1,5,"00001") == 0){
        cout << "BLTZ" << endl;
        instruction = "BLTZ";
    }else if (line.compare(1,5,"00111") == 0){
        cout << "BGTZ" << endl;
        instruction = "BGTZ";
    }else if (line.compare(1,5,"01011") == 0){
        cout << "SW" << endl;
        instruction = "SW";
    }else if (line.compare(1,5,"00011") == 0){
        cout << "LW" << endl;
        instruction = "LW";
    }else if (line.compare(1,5,"00010") == 0){
        cout << "SRL" << endl;
        instruction = "SRL";
    }else if ((line.compare(1,5,"11100") == 0)&&(line.compare(26,6,"000010") == 0)){
        cout << "MUL" << endl;
        instruction = "MUL";
    }else if (line.compare(1,5,"00000") == 0){
        if (line.compare(26,6,"100000") == 0){
            cout << "ADD" << endl;
            instruction = "ADD";
        }else if (line.compare(26,6,"100010") == 0){
            cout << "SUB" << endl;
            instruction = "SUB";
        }else if (line.compare(26,6,"100100") == 0){
            cout << "AND" << endl;
            instruction = "AND";
        }else if (line.compare(26,6,"100101") == 0){
            cout << "OR" << endl;
            instruction = "OR";
        }else if (line.compare(26,6,"101010") == 0){
            cout << "SLT" << endl;
            instruction = "SLT";
        }else if (line.compare(26,6,"000000") == 0){
            cout << "SLL" << endl;
            instruction = "SLL";
        }else if (line.compare(6,26,"00000000000000000000000000") == 0){
            cout << "NOP" << endl;
            instruction = "NOP";
        }
    }
    }else{
        if (line.compare(26,6,"100100") == 0){
            cout << "ADDI" << endl;
            instruction = "ADDI";
        }else if (line.compare(26,6,"100010") == 0){
            cout << "ANDI" << endl;
            instruction = "ANDI";
        }
    }
    return instruction;
}

void execute(string line, string instruction, int& registers[]){
    if(instruction == "ADD"){
        add(line, registers);
    }else if(instruction == "ADDI"){
        addi(line, registers);
    }else if(instruction == "SUB"){
        sub(line, registers);
    }else if(instruction == "MUL"){
        mult(line, registers);
    }
}

void print(int cycle, int inst_address, int regs[]/*, int data[][]*/){
    cout << "---------------------------\n";
    cout << "Cycle: " << cycle << "\t" << inst_address << "\t" << "\n";
    cout << "\nRegisters\n";
    cout << "R00:\t";
    for(int i=0; i<=15; i++){
        cout << regs[i] << "\t";
    }
    cout << "\nR16:\t";
    for(int i=16; i<32; i++){
            cout << regs[i] << "\t";
    }
    cout << "\n\nData\n";
        //cout << "\n148:\t";
        //for(int i=0; i<8; i++){
        //  cout << data[i] << "\t";
        //}
        //cout << "\n180:\t";
        //for(int i=9; i<17; i++){
            //  cout << data[i] << "\t";
        //}
        //cout << "\n212:\t";
        //for(int i=18; i<26; i++){
        //  cout << data[i] << "\t";
    //}
    cout << "\n";
}


int main(){
    int registers[32] = {0};
        //  int data[2][32];
    string inst;
    //int cycle = 1;
    //int PC = 64;
    string binary_inst[64];

    ifstream inFile;
    inFile.open("sample.txt");
    if (!inFile) {
        cout << "Unable to open file sample.txt" << endl;
        return 0;
    }
    string x;
    while(!inFile.eof()){
        for(int i=0; i<64; i++){
            inFile >> x;
            binary_inst[i] = x;
            inst = inst_decode(binary_inst[i]);
            execute(binary_inst[i], inst, registers);
            //print(cycle, PC, registers);
        }
    } 
    //  print(cycle, PC, registers);

    return 0;
}



int convert_5(string binary) {
    long power = 32;
    long sum = 0;
    assert(binary.size() == 5);

    for ( int i=0; i<BITS; ++i) {
        if ( i==0 && binary[i]!='0') {
            sum = -32;
        }
        else {
            sum += (binary[i]-'0')*power;
        }
        power /= 2;
    }
    return sum;
}

int convert_32(string binary) {
    long power = 4294967296;
    long sum = 0;
    assert(binary.size() == 32);

    for ( int i=0; i<BITS; ++i) {
        if ( i==0 && binary[i]!='0') {
            sum = -4294967296;
        }
        else {
            sum += (binary[i]-'0')*power;
        }
        power /= 2;
    }
    return sum;
}



void add(string line, int& registers[]){
    int dest = convert_5(line.substr(17,5));
    cout << "Dest: " << dest << endl;

    int target = convert_5(line.substr(12,5));
    cout << "Target: " << target << endl;

    int source = convert_5(line.substr(7,5));
    cout << "Source: " << source << endl;

    registers[dest] = registers[source] + registers[target];
    cout << "Addition: " << registers[dest] << endl;
}

void sub(string line, int& registers[]){
    int dest = convert_5(line.substr(17,5));
    cout << "Dest: " << dest << endl;

    int target = convert_5(line.substr(12,5));
    cout << "Target: " << target << endl;

    int source = convert_5(line.substr(7,5));
    cout << "Source: " << source << endl;

    registers[dest] = registers[source] - registers[target];
    cout << "Subtraction: " << registers[dest] << endl;
}

void mult(string line, int& registers[]){
    int dest = convert_5(line.substr(17,5));
    cout << "Dest: " << dest << endl;

    int target = convert_5(line.substr(12,5));
    cout << "Target: " << target << endl;

    int source = convert_5(line.substr(7,5));
    cout << "Source: " << source << endl;

    registers[dest] = registers[source] * registers[target];
    cout << "Multiplication: " << registers[dest] << endl;
}

Here are the error messages I keep getting: 这是我不断收到的错误消息:

lin114-08:10% make all
g++ -Wall -o MIPSsim MIPSsim.cpp
MIPSsim.cpp:10: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:14: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:15: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:16: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:85: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void execute(...)’:
MIPSsim.cpp:86: error: ‘instruction’ was not declared in this scope
MIPSsim.cpp:87: error: ‘line’ was not declared in this scope
MIPSsim.cpp:87: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:89: error: ‘line’ was not declared in this scope
MIPSsim.cpp:89: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:89: error: ‘addi’ was not declared in this scope
MIPSsim.cpp:91: error: ‘line’ was not declared in this scope
MIPSsim.cpp:91: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:93: error: ‘line’ was not declared in this scope
MIPSsim.cpp:93: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: In function ‘int main()’:
MIPSsim.cpp:146: warning: cannot pass objects of non-POD type ‘struct std::string’     through ‘...’; call will abort at runtime
MIPSsim.cpp:146: warning: cannot pass objects of non-POD type ‘struct std::string’     through ‘...’; call will abort at runtime
MIPSsim.cpp: At global scope:
MIPSsim.cpp:193: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void add(...)’:
MIPSsim.cpp:194: error: ‘line’ was not declared in this scope
MIPSsim.cpp:203: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: At global scope:
MIPSsim.cpp:207: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void sub(...)’:
MIPSsim.cpp:208: error: ‘line’ was not declared in this scope
MIPSsim.cpp:217: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: At global scope:
MIPSsim.cpp:221: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void mult(...)’:
MIPSsim.cpp:222: error: ‘line’ was not declared in this scope
MIPSsim.cpp:231: error: ‘registers’ was not declared in this scope
make: *** [MIPSsim] Error 1

Any help would be greatly appreciated 任何帮助将不胜感激

Always fix the first error the compiler gives you: int &registers[] won't work - use int * registers or int registers[] . 始终解决编译器给您的第一个错误: int &registers[]无法使用-使用int * registersint registers[]

If you really want a reference to an array, you need to specify the size: 如果您确实要引用数组,则需要指定大小:

void execute(string line, string instruction, int (&registers) [10]);

All of these approaches will let you modify the actual array you pass to the function - there's no copying. 所有这些方法都可以让您修改传递给该函数的实际数组-无需复制。

Side note: 边注:

In MIPSsim.cpp line 146 you're trying to pass a std::string to a vararg function (eg sprintf or printf ) - That won't work. MIPSsim.cpp第146行中,您试图将std::string传递给vararg函数(例如sprintfprintf )-这将无法工作。 Pass string.c_str() instead. 而是传递string.c_str()

我不能说是否还有其他问题,但是我认为您的executeaddsubmult函数只能将registers作为数组,而不是引用数组。

void add(string line, int registers[]);

You can't pass an array as an argument in C++. 您不能在C ++中将数组作为参数传递。 What you'd have to do is declare the parameters: 您要做的就是声明参数:

int (&registers)[32];

But registers aren't the only machine state which is likely to be changed by executing some code. 但是寄存器并不是唯一可能通过执行某些代码而改变的机器状态。 A much better solution would be to define a struct with all of the machine state (except maybe the memory): 更好的解决方案是用所有机器状态(也许除了内存)定义一个结构:

struct HWState
{
    int registers[32];
    unsigned cc;
    ??? pc;
    //  ...
};

Then pass that by reference, and you shouldn't have any problem. 然后通过引用传递它,您应该不会有任何问题。 (In practice, C style arrays should only be used for static variables, with static initialization, and as members, when the count is constant and not too big.) (在实践中,当计数恒定且不太大时,C样式数组仅应用于具有静态初始化的静态变量以及作为成员使用。)

When you have a lot of functions that all take the same argument, that's usually a sign that they should be member functions. 当您有很多函数都采用相同的参数时,通常表明它们应该是成员函数。 Here, you have add , sub and mult which all operate on your set of registers. 在这里,您具有addsubmult ,它们都对您的寄存器集进行操作。 And of course, most future instructions will too. 当然,以后的大多数说明也是如此。

Therefore, define a class CPU with data members for each register (ie int r[32];float f[32]; , and a method CPU::add(std::string line) . Within add, you can just refer to r[4] if you need the first function argument register etc. 因此,为每个寄存器定义一个具有数据成员的class CPU (即int r[32];float f[32];以及方法CPU::add(std::string line) 。在add中,您可以引用r[4]如果需要第一个函数自变量寄存器等

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM