Проблема с присвоением значения массиву в java

#java #arrays

#java #массивы

Вопрос:

Я не знаю, но по какой-то причине массив отказывается меняться, и я понятия не имею, почему. смотрите дополнительные комментарии ниже

 public static void contour (int[ ][ ][]image, int rows, int cols, int maxIntensity, int[ ][ ][]newImage) throws Exception
{
    PrintWriter contour = new PrintWriter("contour.ppm"); 
    int r = 0;
    int c = 0;
    int a = 0;
    int sumk = 0;

    while (r < rows amp;amp; c < cols)
    {
        while (a < 3)
        {
            image[0][r][a] = newImage[0][r][a];
            image[cols-1][r][a] = newImage[cols-1][r][a];
            image[c][0][a] = newImage[c][0][a];
            image[c][rows-1][a] = newImage[c][rows-1][a];
            a  ;
        }
        r  ;
        c  ;
    }   
    System.out.println (image[32][0][2]);
    System.out.println (newImage[32][0][2]);
}
  

Этот код немного вырван из контекста, но вы должны быть в состоянии увидеть, какие значения я хочу сделать одинаковыми в обоих массивах. Инструкции print предназначены для целей тестирования, и по какой-то причине я получаю два разных значения. Обоим этим массивам присвоены значения, но массив изображений не изменится (и даже когда я создаю новый массив этим методом, та же проблема сохраняется).

Вы можете видеть, что я определяю эти массивы в методе main, и они следующие:

 int image [][][] = readimage (fname, descriptor);
int newImage [][][] = new int [rows][cols][3];
  

Таким образом, массив изображений является возвращаемым массивом из другого метода.

Я упускаю из виду что-то чрезвычайно очевидное или что? Я боролся с этим довольно долгое время, поэтому все подсказки и пояснения очень ценятся!!

Комментарии:

1. Пожалуйста, исправьте идентификатор вашего кода.

2. По какой-либо причине вы не используете for циклы для этого? Вы подтвердили, что ваши циклы действительно влияют на элемент в [32][0][2] ?

3. Каким должно быть новое изображение? Результат? Если да, то не неправильно ли написаны ваши операторы присваивания? например, должно быть newImage[0][r][a] = image[0][r][a]; ??

4. спасибо за быстрый ответ! я все правильно понял, потому что я хочу изменить массив с именем image, я знаю, что имена немного запутаны, но причина названия newImage связана с другим методом: если цикл for также не работает, и он должен работать с этим элементом, я выбрал случайную выборку в параметрах, чтобы продемонстрировать ошибку

Ответ №1:

Предполагая, что вы просматриваете столбцы и строки так, как вы намереваетесь… Вы никогда не сбрасываете a переменную на 0 , поэтому ваш код работает только один раз.

 int r = 0;
int c = 0;
int a = 0;
int sumk = 0;

while (r < rows amp;amp; c < cols)
{
    while (a < 3)
    {
        image[0][r][a] = newImage[0][r][a];
        image[cols-1][r][a] = newImage[cols-1][r][a];
        image[c][0][a] = newImage[c][0][a];
        image[c][rows-1][a] = newImage[c][rows-1][a];
        a  ;
    }
    r  ;
    c  ;
    a=0; //<----ADD THIS
}  
  

Комментарии:

1. хаха, я знал, что это должно было быть что-то глупое, я даже делал что-то подобное ранее, спасибо!

2. Хороший улов. И хороший пример того, почему цикл for-next обычно более надежен, чем цикл while.

Ответ №2:

Если либо параметр rows, либо параметр cols меньше 33, то местоположение, напечатанное в вашем тесте, не будет скопировано из newimage в image. while (r < rows amp;amp; c < cols) Тест приводит к завершению цикла, когда первое из r или c достигает своего максимального значения.

Комментарии:

1. да, верно, но в этом случае строки и столбцы одинаковы при 50, это вообще не работает ни для какого значения, что довольно раздражает :/