Подтвердить что ты не робот

Ошибка компилятора: недопустимый спецификатор ранга: ожидаемый ',' или ']' для инициализации двумерного массива

У меня есть назначение для класса, который должен быть выполнен на С#. Являясь полнофункциональным новичком С#, я сначала выполнил проект в Java, и теперь я пытаюсь преобразовать его в С#. У меня есть следующая функция, которая приводит к следующей ошибке компилятора.

Ошибка: Недопустимый спецификатор ранга: ожидаемый ',' или ']' в следующей строке:

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

Visual studio подчеркивает g в g.rows

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

Я не знаю, что я делаю неправильно здесь, и чтение на многомерных массивах в С#, похоже, не помогло.

4b9b3361

Ответ 1

Компилятор С# считает, что вы пытаетесь объявить неровный массив, и делаете это неправильно. Явлённый массив представляет массив массивов массивов, где каждый массив, содержащийся в основном массиве, может иметь различное количество элементов. Замятый массив объявляется следующим образом:

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

Что бы создать массив, который мог бы содержать массивы "numElements" целых чисел внутри него.

Вы хотите объявить многомерный массив, например:

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

Ответ 2

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

Ответ 3

Если вы хотите использовать зубчатый массив, решение @Frank - это метод, который вам нужно сделать. Вы не можете объявить оба измерения, когда запускаете зубчатый массив, потому что предположение С# состоит в том, что ваши строки будут иметь неравные размеры. В решении @Doughnut метод многомерного массива является хорошим решением, если у вас есть решение с матричным типом (что это такое), однако С# оптимизирован для одномерных массивов, и вы все равно можете использовать опцию зубчатого массива, чтобы сэкономить временные затраты., По этой причине, если вы будете выполнять много операций с вашим многомерным массивом, вы должны инициализировать неровный массив THEN при вводе строк, указав длину строки индивидуально.

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