美好的一天,
作为C#newbie,我面临着C#的另一个问题,即在C中根本没有问题。
我有这个调用其他方法的方法,看起来像这样。
public double ipoval(double[] xa,double[] ya, int n, double x, int ipord)
{
ulong ind, jnd;
double y, dy;
if (ipord>=1)
{
hunt(xa,Convert.ToUInt64(n),x, ind);
jnd = Math.Min(Math.Max(ind - ipord / 2, 1), n - ipord);
polint(xa + jnd - 1, ya + jnd - 1, ipord + 1, x, y, dy);
}
return y;
}
现在它向我展示了jnd的错误:
看起来C#在减去两种不同的数据类型方面存在问题。我应该将int ipord转换为ulong吗?
方法polint有类似错误的错误:
有什么想法吗?提前感谢您的帮助。
我在C中有同样的事情并且有效:
NRREAL ipoval(NRREAL xa[], NRREAL ya[], const int n, const NRREAL x, const int ipord)
{
unsigned long ind,jnd;
NRREAL y,dy,*y2;
if (ipord>=1) { /* polynomial interpolation of ipord-th order */
hunt(xa,(unsigned long)n,x,&ind);
jnd=IMIN(IMAX(ind-ipord/2,1),n-ipord);
polint(xa+jnd-1,ya+jnd-1,ipord+1,x,&y,&dy);
}
return y;
}
顺便说一句小问题,在c#中的polint方法中使用如下参数:
public void polint(double[] xa, double[] ya, int n, double x, ref double y, ref double dy)
因为我想要y,dy作为该void方法的输出。
很抱歉很长的帖子,再次感谢。
答案 0 :(得分:1)
我认为应该这样做:
MainWindow
答案 1 :(得分:0)
你有几个错误;首先,您必须为变量分配初始值,无论是new ulong()
还是直接值,例如ulong a = 0;
接下来,在您使用Math.Max(...)
的行中,您在int
和ulong
之间使用减号运算符,这会引发另一个错误;当使用上述两种不同的数值类型时,你大部分时间都想把范围较小的数字类型转换为范围较大的那个,因为较小范围的限制是,更小,更大的变量可以肯定包含较小的一个。在我举一个例子之前,同一行中还有另一个错误;有多个Math.Min
个,一个用于decimal
,另一个用于float
。问题是ulong
可以隐式地转换为其中任何一个,这意味着您可以执行float r = b //where b is a ulong
或decimal r = b //where b is still a ulong
因此,您必须明确强制转换以指定您想要小数,或者Math.Min
的浮动版本以下是一个例子:
jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord / 2, 1), (decimal)(n - ipord));
度过愉快的一天!!!
答案 2 :(得分:0)
非常感谢大家。我确实在你的帮助下改变了它,现在看起来像这样:
public double ipoval(double[] xa, double[] ya, int n, double x, int ipord)
{
ulong ind = 0, jnd = 0;
double y = 0, dy = 0;
if (ipord >= 1)
{
hunt(xa, (ulong)n, x, ref ind);
jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord / 2, 1), (decimal)(n - ipord));
polint(xa[jnd - 1], ya[jnd - 1], ipord + 1, x, ref y, ref dy);
}
return y;
}
但是polint仍然给我错误。
错误1最好的重载方法匹配' program.Methods.polint(double [],double [],int,double,ref double,ref double)'
错误2参数1:无法转换为' double'到['加倍[]'
错误3参数2:无法转换为' double'到['加倍[]'