我有一个函数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])
但是我得到
分段错误(核心已转储)
我想知道为什么会这样以及如何解决。
答案 0 :(得分:0)
char prod [numofdims] [ct]-类型强,大小:prod中的所有字符串均为102个char大小(零个char时,实际字符串可以更少,但您为每个字符串分配102个char)。而且此类型不能转换为char **(此类型是指向char数组的指针的数组)-这些是不同的类型。
最好使用字符串向量。或者,您可以创建大小为102 * n的字符数组并“手动”填充。