2017-06-18 46 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 –

相關問題