2017-06-18 1 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つの演算子 - 最高過負荷の2種類のオペランドに適用することができない「ULONG」と「int型
  • エラー「」 「小数」に「オブジェクト」から変換することはできません

ルック「System.Math.Max(小数、10進数)」

  • エラー3引数1のための方法の一致C#のように2つの異なるデータ型を減算する際に問題があります。そのint ipordをulongに変換すべきですか? 4演算子「+」はタイプのオペランドに適用することができない

    • エラー「ダブル[]」と「ULONG」
    • エラー5オペレーター ':

      そしてメソッドpolintはちょっと同様のタイプの誤差を有しています+ 'は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

    「ダブル[]」から「double」のから変換することはできません:「ダブル[]」

    エラー3引数2の「ダブル」 Cで可能です。C#で行うことはできません。 –

    +0

    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()あるいはもしintulong間マイナス演算子を使用Math.Max(...)あなたが使用を使用するラインにulong a = 0;

    次に、このような直接的な値であるか否かを、変数に初期値を割り当てる必要があります別のエラーを投げます。上記のような2つの異なる数値型を使用する場合は、小さい方の範囲の方が小さい方の範囲の方が大きい必ず小さなものを入れてください。例を挙げる前に、同じ行に別のエラーがあります。 1つはdecimalで、もう1つはfloatで1つはMath.Minです。問題は、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));

    良い一日を!

    +0

    ありがとう。だから私は毎回、すべての方法で、すべての変数にinital値を割り当てる必要がありますか?内部のメソッドのように私は私の問題を呼び出す。 –

    +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; 
        } 
    

    しかし、ポントはまだ私にエラーを与えます。

    エラー1のための最良のオーバーロードされたメソッドが一致 'program.Methods.polint(ダブルダブル[]、ダブル[]、int型、ダブル、ダブルREF、REF)'

    エラー2引数:1へ変換することができませんあなたがインデックスにそれのようにそのベースポインタに番号を追加することによって、配列をしようとしている

    +0

    うわー、ポーリントが2つのダブルアレイを得るのを忘れました。それがエラーを起こす理由です。新しいデータ配列を作成し、新しいdouble []配列でpolintを呼び出す必要があります –

    関連する問題