分享
三行代码  ›  专栏  ›  技术社区  ›  donut

strcmp inside if在函数内部不工作

  •  0
  • donut  · 技术社区  · 6 月前

    我正在编写一个函数,它接收几个数组作为参数,如下所示:

    const int numofparticles = 20;
    const int numofdims = 46;
    const int numforn = 222;
    const int forn_sem_repet = 92;
    
    float cost(float x[numofdims], float M[numofdims][numforn], char prod[numofdims][102], char forn_list[numforn][102], float qtde[numofdims][1], float min_prices[forn_sem_repet], char min_forn[forn_sem_repet][102]){
        float v = 0;
        vector<string> forn;
        vector<float> total;
        int i;
        int j;
        for(i=0;i<numofdims;i++){
            if(x[i] != -1){
                forn.push_back(forn_list[(int)x[i]]);
                total.push_back(qtde[i][1] * M[i][(int)x[i]]);
                for(j=i+1;j<numofdims;j++){
                    if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){
                        total.back() += qtde[j][1] * M[j][(int)x[j]];
                        x[j] = -1;
                    }
                }
            }
            else{
                continue;
            }
        }
        for(i=0;i<numofdims;i++){
            v += qtde[i][1] * M[i][(int)x[i]];
        }
        int lin;
        for(i=0;i<forn.size();i++){
            for(int ii=0;ii<forn_sem_repet;ii++){
                if(strcmp(forn[i],min_forn[lin]) == 0){
                    lin = ii;
                    break;
                }
            }
            if(total[i] < min_prices[lin]){
                v += 1000;
            }
        }
    
        return v;
     }
    
    

    strcmp() .

    error: cannot convert ‘__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> > >::value_type {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘2’ to ‘int strcmp(const char*, const char*)’
                     if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){
    

    error: cannot convert ‘__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> > >::value_type {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’
                 if(strcmp(forn[i],min_forn[lin]) == 0){
    

    然而,在 main

    for(i=0;i<numforn;i++){
                for(j=0;j<forn_sem_repet;j++){
                    if(strcmp(forn_list[i],min_forn[j]) == 0){
                        printf("%s\n%s  %d  %d", forn_list[i],min_forn[j],i,j);
                        printf("\n\n");
                        break;
                    }
    
                }
            }
    

    完全符合预期。

    在函数中可以做些什么来解决这个问题 cost ?

    1 回复  |  直到 6 月前
        1
  •  2
  •   xdavidliu    6 月前

    在函数中,您已经声明 vector<string> forn; ,这与线路不兼容 if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){ strcmp 只能采用C样式 char* 字符串作为参数,而不是 std::string

    要使代码工作,请替换 forn.back() 与…一致 forn.back().c_str()