2017-06-18 47 views
1

良好的一天类型的操作数,C#运算符“+”不能被应用到“双[]”和“ULONG”

如C#新手我面临与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:

  • 错误1个操作 ' - ' 不能应用于类型为 'ULONG' 操作数和 'INT'
  • 错误2的最佳重载对于方法匹配 'System.Math.Max(十进制,十进制)'
  • 错误3参数1:不能从 '对象' 转换为 '小数'

查找就像C#在减去两种不同的数据类型时遇到了问题。我应该将int ipord转换成ulong吗?

和方法polint具有有点相似类型的误差:

  • 错误4运算符“+”不能被应用于类型的操作数“双[]”和“ULONG”
  • 错误5运算符“ +'不能应用于类型'double []'和'ulong'的操作数

任何想法?预先感谢您的帮助。

我有同样的事情在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; 
} 

顺便说一句副作用小的问题,在polint方法在C#中使用的参数是这样的:

public void polint(double[] xa, double[] ya, int n, double x, ref double y, ref double dy) 

,因为我想Y,DY作为void方法的输出。

对不起,对于长篇文章,再次感谢。

+4

您是通过将数到它的基指针像它试图索引的阵列有可能在C.你不能在C#中做到这一点# –

+0

C#不是C - 仅仅因为他们有一个类似的名字并不意味着他们的任何行为都保证是相同的。你需要理解C#,并按照语言编写的方式重新编写代码,而不是试图强制一些C代码编译它。 – UnholySheep

回答

1

我想这应该这样做:

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, ind); 
     jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord/2, 1), n - ipord); 
     polint(xa[jnd - 1], ya[jnd - 1], ipord + 1, x, ref y, ref dy); 
    } 
    return y; 
} 
0

你有几个错误的;第一,必须将初始值赋值给一个变量,无论是new ulong()或直接值如ulong a = 0;

接下来,在使用使用的线路Math.Max(...)您使用intulong之间的负操作,这抛出另一个错误;当使用两种不同的数字类型时,大多数时候想要将范围较小的范围投射到具有较大范围的范围,因为较小范围的范围小得多,较大的变量可以最当然包含较小的一个。在举例之前,同一行还有另一个错误;有多个Math.Min s,一个用于decimal,另一个用于float。问题是,一个ulong可以隐式铸造到其中任意一个,这意味着你可以做float r = b //where b is a ulongdecimal r = b //where b is still a ulong所以,你必须明确地转换为指定要十进制,或Math.Min这里浮动版本是一个例子:

jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord/2, 1), (decimal)(n - ipord));

祝您有美好的一天!

+0

谢谢。所以我必须在每种方法中将每个变量的初始值赋予每种方法?就像我在问我的电话里面的方法一样。 –

+0

是的,你必须每次都施放它。毕竟,算术运算只是一个类的方法 –

+0

哦,我不明白你的意思到现在为止,是的,你必须为每个变量分配一个初始值。 –

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(双[],双[],INT,双,双REF,参考双)'

错误2参数1:不能从转换“双”到“双[]”

错误3参数2:不能从“双”转换为“双[]”

+0

哇,我忘记了polint得到了两个双数组。这就是为什么你会收到错误。你应该创建你想要的新数组,然后在新的double []数组上调用polint –

相关问题