【问题标题】:Passing array of strings as function argument将字符串数组作为函数参数传递
【发布时间】:2020-05-01 21:10:17
【问题描述】:

我有一个函数cost,它使用浮点数数组和字符串数组进行多次计算:

const int numofparticles = 20;
const int numofdims = 46;
const int numforn = 222;
const int forn_sem_repet = 92;
const int ct = 102;

using namespace std; 
 float cost(float x[numofdims], float M[numofdims][numforn], char prod[numofdims][ct], char forn_list[numforn][ct], float qtde[numofdims][1], float min_prices[forn_sem_repet][1], char min_forn[forn_sem_repet][ct]){
    float v = 0;
// does stuff
// ...
    return v


在main函数中,变量是从文件中加载的:

int main(){
    std::ifstream in("M.txt");
    std::string line;

    float M[numofdims][numforn];
    int i = 0, k = 0;

    while (std::getline(in, line))
    {
        float value;
        int k = 0;
        std::stringstream ss(line);

        while (ss >> value)
        {
            M[i][k] = value;
            ++k;
        }
        ++i;
    }

    i=0;

    char* prod[numofdims];
    char linee[102];

    FILE *file;
    file = fopen("prod.txt", "r");

    while(fgets(linee, sizeof linee, file)!=NULL) {

        prod[i]=strdup(linee); 
        i++;
    }


    unsigned int number_of_lines = 0;
    FILE *infile = fopen("forn_list.txt", "r");
    int ch;

    while (EOF != (ch=getc(infile)))
        if ('\n' == ch)
            ++number_of_lines;


    int j=0;
    int num=0;
    char* forn_list[number_of_lines];
    char line_forn[102];

    FILE *file_forn;
    file_forn = fopen("forn_list.txt", "r");

    while(fgets(line_forn, sizeof line_forn, file_forn)!=NULL) {
        forn_list[j]=strdup(line_forn); 

        j++;

    }



    std::ifstream inn("qtde.txt");
    std::string line3;

    float qtde[numofdims][1];
    int ii = 0, kk = 0;

    while (std::getline(inn, line3))
    {
        float value;
        int kk = 0;
        std::stringstream ss(line3);

        while (ss >> value)
        {
            qtde[ii][kk] = value;
            ++kk;
        }
        ++ii;
    }
    for(i=0;i<46;i++){
        for(j=0;j<1;j++){
        }

    }

    std::ifstream in_min_prices("min_prices.txt");
    std::string line_min_prices;

    float min_prices[forn_sem_repet][1];
    int iii = 0, kkk = 0;

    while (std::getline(in_min_prices, line_min_prices))
    {
        float value_min_prices;
        int kkk = 0;
        std::stringstream ss(line_min_prices);

        while (ss >> value_min_prices)
        {
            min_prices[iii][kkk] = value_min_prices;
            ++kkk;
        }
        ++iii;
    }

    j=0;
    char *min_forn[forn_sem_repet];
    char line_min_forn[102];

    FILE *file_min_forn;
    file_min_forn = fopen("min_forn.txt", "r");

    while(fgets(line_min_forn, sizeof line_min_forn, file_min_forn)!=NULL) {

        min_forn[j]=strdup(line_min_forn); 

        j++;
    }

     float x[46] = {  1.45733801,   5.4023114 ,   9.84244649,  15.63424831,
        18.54989641,  25.31747823,  31.02406554,  33.49572919,
        42.62398295,  48.89093797,  54.92222913,  64.81761377,
        67.91368849,  75.25842566,  80.76891534,  84.16383935,
        86.98898142,  92.46614131,  95.171554  ,  98.5018263 ,
       100.66458007, 106.27617827, 113.53476385, 120.35501434,
       124.50124045, 126.93877296, 133.38186583, 139.5347655 ,
       149.73161149, 155.68895627, 158.55511946, 165.81101556,
       172.92551422, 176.92861446, 181.29821916, 182.56432251,
       185.22709498, 187.98060952, 191.70461679, 193.87301843,
       198.86751373, 203.25597481, 210.26505926, 216.52723747,
       219.20956646, 220.61524748};

       float v = cost( x, M, prod,forn_list, qtde, min_prices, min_forn);

}

然后,在主函数中,加载完所有变量后,调用函数cost:

float v = cost( x, M, prod,forn_list, qtde, min_prices, min_forn);

然后我得到以下错误:

错误:无法将“char**”转换为“char (*)[102]”作为参数...

并且给出错误的参数都是 char 的。这些变量当然是字符串数组。我试图通过指针来解决这个问题:

float cost(float x[numofdims], float M[numofdims][numforn], char *prod[numofdims], char *forn_list[numforn], float qtde[numofdims][1], float min_prices[forn_sem_repet][1], char *min_forn[forn_sem_repet])

然后我明白了

分段错误(核心转储)

我想知道为什么会发生这种情况以及如何解决。

【问题讨论】:

  • 我认为你需要分享你的 prod 和 forn_list 函数。我看到你尝试了这篇文章中提到的方法:*.com/questions/30411706/… 但它可能不是关于调用函数可能是声明的 cos
  • 请告诉我们您如何调用cost 以及如何初始化传递给它的数组。但我想最好的答案是使用 std::vectorstd::array 而不是指针或 c 样式数组。
  • 谢谢。我用函数 main 编辑了我的问题。变量是从 txt 文件加载的,由于我只是在测试函数成本,所以我使用基本相同的代码来加载所有变量。我已经检查了这些变量,它们都是我所期望的。
  • 我认为问题在于数组的尺寸不匹配。该错误表明您无法在列 = 102 的矩阵中转换字符串数组。尝试使用字符串。
  • "char * fgets (char * str, int num, FILE * stream)" 这是“fgets”的格式。您的“linee”数组与此格式不匹配。您应该根据这种格式更改您的声明。

标签: c++ arrays string function


【解决方案1】:

char prod[numofdims][ct] - 是具有强大小的类型:prod 中的所有字符串都是 102 个字符大小(实际字符串可以小于零字符,但您为每个字符串分配 102 个字符)。而且这种类型不能转换为 char**(这种类型是指向 char 数组的指针数组)——它们是不同的类型。

最好使用字符串向量。或者您可以制作一个 102 * n 大小的字符数组并“手动”填充。

【讨论】: