web-dev-qa-db-ja.com

コンパイラエラー:無効なランク指定子:2次元配列の初期化で '、'、または ']'が必要です

C#で実行されるクラスの割り当てがあります。完全なC#初心者なので、最初にJavaでプロジェクトを実行し、現在C#に変換しようとしています。次の関数があり、次のコンパイラエラーが発生します。

エラー:無効なランク指定子:予期される '、'、または ']'次の行:

int[][] grid=new int[g.cols][g.rows];

VisualStudioはg.rowsのgに下線を引いています

public int[][] getConvergenceCounts(MandelbrotGrid g){
  int[][] grid=new int[g.cols][g.rows];

  for(int x=0;x<g.cols;x++){
     for(int y=0;y<g.rows;y++){
        double tx=x*(double)3/400-1.5;
        double ty=y*(double)3/400-1.5;
        grid[x][y]=getConvergenceCount(new Complex(ty,tx));
     }
  }

  return grid;
}

ここで何が間違っているのかわかりません。C#で多次元配列を読んでも役に立たなかったようです。

26
Vaheh

C#コンパイラは、 ギザギザの配列 を宣言しようとしていると判断し、誤って宣言しています。ギザギザの配列は、配列の配列であり、メイン配列に含まれる各配列は異なる数の要素を持つことができます。ギザギザの配列は次のように宣言されます。

int[][] jaggedArray = new int[numElements][];

これにより、整数の「numElements」配列を保持できる配列が作成されます。

多次元配列 を宣言したい例:

int[,] grid = new int[g.cols, g.rows];
38
Donut
public int[][] getConvergenceCounts(MandelbrotGrid g){
    int[][] grid=new int[g.cols][];

    for(int x=0;x<g.cols;x++){
     int[x] = new int[g.rows]
     for(int y=0;y<g.rows;y++){
        double tx=x*(double)3/400-1.5;
        double ty=y*(double)3/400-1.5;
        grid[x][y]=getConvergenceCount(new Complex(ty,tx));
     }
  }

  return grid;
}
2
Frank

ギザギザの配列を使用したい場合は、@ Frankによる解決策が必要な方法です。ギザギザの配列を開始するときに両方の次元を宣言することはできません。C#では、行の次元が等しくないと想定しているためです。 @Doughnutのソリューションでは、行列型のソリューション(これはそうです)がある場合は多次元配列法が適していますが、C#は1次元配列用に最適化されており、時間コストを節約するためにギザギザの配列オプションを使用することもできます。このため、多次元配列で多くの操作を実行する場合は、行を入力するときにギザギザの配列を初期化し、行の長さを個別に指定する必要があります。

public int[][] getConvergenceCounts(MandelbrotGrid g)
{
    int[][] grid=new int[g.cols][];

    for(int x=0;x<g.cols;x++){
        grid[i] = new int[g.rows];
        for(int y=0;y<g.rows;y++){
           double tx=x*(double)3/400-1.5;
           double ty=y*(double)3/400-1.5;
           grid[x][y]=getConvergenceCount(new Complex(ty,tx));
         }
    }
    return grid;
}
0
Samantha Mellin