如何从函数返回值

时间:2011-01-01 04:30:22

标签: c++ function return-value

我使用了一个函数来计算我在地图中初始化的某些指令的信息,比如

void get_objectcode(char*&token1,const int &y)
{
map<string,int> operations;
    operations["ADD"] = 18;
    operations["AND"] = 40;
    operations["COMP"] = 28;
    operations["DIV"] = 24;
    operations["J"] = 0X3c;
    operations["JEQ"] =30;
    operations["JGT"] =34;
    operations["JLT"] =38;
    operations["JSUB"] =48;
    operations["LDA"] =00;
    operations["LDCH"] =50;
    operations["LDL"] =55;
    operations["LDX"] =04;
    operations["MUL"] =20;
    operations["OR"] =44;
    operations["RD"] =0xd8;
    operations["RSUB"] =0x4c;
    operations["STA"] =0x0c;
    operations["STCH"] =54;
    operations["STL"] =14;
    operations["STSW"] =0xe8;
    operations["STX"] =10;
    operations["SUB"] =0x1c;
    operations["TD"] =0xe0;
    operations["TIX"] =0x2c;
    operations["WD"] =0xdc;

         if  ((operations.find("ADD")->first==token1)||(operations.find("AND")->first==token1)||(operations.find("COMP")->first==token1)
            ||(operations.find("DIV")->first==token1)||(operations.find("J")->first==token1)||(operations.find("JEQ")->first==token1)
            ||(operations.find("JGT")->first==token1)||(operations.find("JLT")->first==token1)||(operations.find("JSUB")->first==token1)
            ||(operations.find("LDA")->first==token1)||(operations.find("LDCH")->first==token1)||(operations.find("LDL")->first==token1)
            ||(operations.find("LDX")->first==token1)||(operations.find("MUL")->first==token1)||(operations.find("OR")->first==token1)
            ||(operations.find("RD")->first==token1)||(operations.find("RSUB")->first==token1)||(operations.find("STA")->first==token1)||(operations.find("STCH")->first==token1)||(operations.find("STCH")->first==token1)||(operations.find("STL")->first==token1)
            ||(operations.find("STSW")->first==token1)||(operations.find("STX")->first==token1)||(operations.find("SUB")->first==token1)
            ||(operations.find("TD")->first==token1)||(operations.find("TIX")->first==token1)||(operations.find("WD")->first==token1))

            {
                int y=operations.find(token1)->second;
                //cout<<hex<<y<<endl;
            }

        return ;
}

如果我在函数中输入y给我一个答案就好了,这就是我需要的 但是有一个问题是从函数中返回值以便我可以在函数外部使用它,它给出了一个完全不同的答案,问题是什么

4 个答案:

答案 0 :(得分:2)

函数中的第二个参数是常量引用。尝试更换 -

void get_objectcode(char*&token1,const int &y) 

void get_objectcode(char*&token1,int &y) 

并在if条件中,删除y的新声明并将其替换为 -

y=operations.find(token1)->second;

希望这有帮助!

答案 1 :(得分:1)

这可能更接近你想要的东西:

void get_objectcode(const char *token, int &y)
{
    typedef std::map<std::string,int> OpMap;
    OpMap operations;
    operations["ADD" ] = 18;
    operations["AND" ] = 40;
    operations["COMP"] = 28;
    operations["DIV" ] = 24;
    // etc.
    operations["SUB" ] = 0x1c;
    operations["TD"  ] = 0xe0;
    operations["TIX" ] = 0x2c;
    operations["WD"  ] = 0xdc;

    OpMap::iterator result = operations.find(token);

    // note: assigns 0 to y if token is not found
    y = (result == operations.end()) ? 0 : result->second;

    //std::cout << std::hex << y << std::endl;
}

答案 2 :(得分:0)

看一下boost assign map_list_of here。它可用于分配地图。然后使用地图中的find方法(引用为here

答案 3 :(得分:0)

您的地图仅存在于该功能中。因此,元素仅存在于该函数中。如果在您调用函数的位置,您正在使用y初始化引用,那么这将是对将不复存在的元素的引用。

每次调用函数时都不应该真正创建映射,至少最好只从函数中返回值:

std::map<std::string,int> operations;
operations["ADD"]  = 18;
operations["AND"]  = 40;
operations["COMP"] = 28;
operations["DIV"]  = 24;
operations["J"]    = 0X3c;
operations["JEQ"]  = 30;
operations["JGT"]  = 34;
operations["JLT"]  = 38;
operations["JSUB"] = 48;
operations["LDA"]  = 00;
operations["LDCH"] = 50;
operations["LDL"]  = 55;
operations["LDX"]  = 04;
operations["MUL"]  = 20;
operations["OR"]   = 44;
operations["RD"]   = 0xd8;
operations["RSUB"] = 0x4c;
operations["STA"]  = 0x0c;
operations["STCH"] = 54;
operations["STL"]  = 14;
operations["STSW"] = 0xe8;
operations["STX"]  = 10;
operations["SUB"]  = 0x1c;
operations["TD"]   = 0xe0;
operations["TIX"]  = 0x2c;
operations["WD"]   = 0xdc;

int get_objectcode(const std::string& key)
{
    std::map<std::string, int>::iterator it = operations.find(key);
    if (it == operations.end())
        return -1;
    else
        return it->second;
}