#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, это вообще не работает ни для какого значения, что довольно раздражает :/