【发布时间】: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::vector或std::array而不是指针或 c 样式数组。 -
谢谢。我用函数 main 编辑了我的问题。变量是从 txt 文件加载的,由于我只是在测试函数成本,所以我使用基本相同的代码来加载所有变量。我已经检查了这些变量,它们都是我所期望的。
-
我认为问题在于数组的尺寸不匹配。该错误表明您无法在列 = 102 的矩阵中转换字符串数组。尝试使用字符串。
-
"char * fgets (char * str, int num, FILE * stream)" 这是“fgets”的格式。您的“linee”数组与此格式不匹配。您应该根据这种格式更改您的声明。
标签: c++ arrays string function