下面的代码是用MATLAB编写的,并且在MATLAB中正确运行,我一直试图将其转换为C ++,但我一直收到错误。我试图以函数的形式编写这个程序,所以我可以在 int main函数
中调用它function flow = fcoeff_ridwansa( Re, RelRough )
if (Re < 4000)
FCL = (64./Re);
flow = FCL;
else
for i = 1:length(Re)
for j = 1:length(RelRough)
FCT_guess = 1;
tolerance = 1;
while tolerance > 1e-14
FCT_cal = 1/(-2*log10((RelRough(j)/3.7) + (2.51/(Re(i)*sqrt(FCT_guess)))))^2;
tolerance = abs(FCT_cal-FCT_guess);
FCT_guess = FCT_cal;
flow(i,j) = FCT_cal;
end
end
end
end
end
这是我在C ++中的尝试
double f(double Re[], double RelRough[]){
double fcoeff;
const double lengthRelRough = sizeof(RelRough) / sizeof(RelRough[0]);
const double lengthRe = sizeof(Re) / sizeof(Re[0]);
if (*Re < 4000.0) {
fcoeff = 64 / *Re;
}
else {
for (int i = 0; i < lengthRe; ++i) {
for (int j = 0; j < lengthRelRough; ++j) {
double fct_guess = 1;
double tolerance = 1;
while (tolerance > 1e-14) {
double h = (-2 * log10((RelRough[j] / 3.7) + (2.51 / (Re[i] * sqrt(fct_guess)))));
double fct_cal = 1 / pow(h, 2);
tolerance = abs(fct_cal - fct_guess);
fct_guess = fct_cal;
fcoeff = fct_cal;
}
}
}
}
return fcoeff;
}
int main()
{
double f(double Re[], double RelRough[]);
double r[] = { 600.0 }, n[] = { 0.002 };
std::cout << f(r, n) << "\n";
return 0;
}
答案 0 :(得分:2)
const double lengthRelRough = sizeof(RelRough) / sizeof(RelRough[0]);
const double lengthRe = sizeof(Re) / sizeof(Re[0]);
这些语句都不会像你期望的那样工作,因为RelRough和Re是指针而不是数组。
无法将数组传递给C ++中的函数。
如果您使用向量而不是数组,则可能会发现这更容易。
答案 1 :(得分:0)
MatLab和C ++代码语法完全不同,将Matlab代码插入到.cpp文件中肯定无法编译。例如,这是用C ++编写函数的方法:
/*
<type> <function name> (<type> <argument1 name>, <argument2 name>)
{
<body>
return <return value>;
}
In example: */
int sum(int first_number, int second_number)
{
int result = first_number + second_number;
return result;
}
您的示例中存在更多语法错误,例如C ++中的for循环不同。
但是,如果您没有时间/意愿学习C ++,您可能需要查看此tutorial这是一个正式的MatLab教程,用于自动将MatLab代码转换为C代码(与C ++兼容/关闭)一般)。
答案 2 :(得分:0)
如果性能至关重要,使用std::vectors
可能会很慢。
最快(但不安全)的方法是使用指向数组的指针:
f(double * Re, long sizeRe, double * RelRough, long sizeRelRough)
然后像数组一样访问元素:Re[i]
另外,您可以阅读生成c ++代码的codegen
帮助,至少是复制过去。