На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Передать многомерный массив методу в другой класс , Каким образом передавать многомерный массив в другой класс обходя "замыкание"
    Написал вот такую программу для примера, чтобы тонны кода не отвлекали от основного вопроса:
    Необходимо передать многомерный динамический массив (testImage ) методу saveImage в класс imageIO (его код здесь не приведен).
    В переменную testImage данные заносятся по нажатию пункта меню <Изображение>. По нажатию <Сохранить> переменная передается методу в другой класс.
    С реализацией подобного алгоритма с int не возникает проблем (в отличие от массива).
    Подробнее в комментариях по ходу кода.

    Помогите понять в какую сторону "копать". Много всего перепробовал но не помогло.
    Заранее благодарен за любую посильную помощь.

    ExpandedWrap disabled
      import java.awt.Dimension;
      import java.awt.Font;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import javax.swing.JFrame;
      import javax.swing.JMenu;
      import javax.swing.JMenuBar;
      import javax.swing.JMenuItem;
      import javax.swing.JOptionPane;
       
      public class imageMain {
          public static void main(String[] args) {
              new imageMain();
          }
       
          imageMain(){
          ////////////////////////Оболочка//////////////////////////
              JFrame frame = new JFrame("Программа обработки изображений");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(null) ;
              frame.setVisible(true);
              Font font = new Font("Arial", Font.PLAIN, 12);
          
              JMenu fileMenu = new JMenu("Файл");
              fileMenu.setFont(font);
          
              JMenuItem imgFileItem = new JMenuItem("Изображение");
              imgFileItem.setFont(font);
              fileMenu.add(imgFileItem);
          
              final JMenuItem saveItem = new JMenuItem("Сохранить");
              saveItem.setFont(font);
              fileMenu.add(saveItem);
              saveItem.setEnabled(false);
          
              JMenuBar menuBar = new JMenuBar();
              menuBar.add(fileMenu);
              frame.setJMenuBar(menuBar);
          
              frame.setPreferredSize(new Dimension(650, 450));
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
          ////////////////////////Оболочка//////////////////////////
          
              final int[][][] testImage = {null};//3D массив (в нем то и загвоздка)
              final int MAXROWS = 0;//Переменные int - 3 штуки для примера
              final int MAXCOLS = 0;
              final int Zamykanie[] = {0};
              
              imgFileItem.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent event){
                  final int MAXROWS = 100500;
                  System.out.println("Значение MAXROWS: "+MAXROWS);
                  final int MAXCOLS = 101;
                  System.out.println("Значение MAXCOLS: "+MAXCOLS);
                  saveItem.setEnabled(true);
                  System.out.println("Было: Zamykanie = "+Zamykanie[0]);
                  Zamykanie[0] = 22;
                  System.out.println("Задаем: Zamykanie = "+Zamykanie[0]);
                  testImage[0][0][1] = 7;
              }});
              
              saveItem.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent event){
              //Если выполнять последовательно imgFileItem, а затем saveItem,
              //то, по идее, MAXROWS и MAXCOLS должны существовать,
              //однако, похоже, их "зачистили"
              //Слышал, что это называется "замыкание"
              //"Лечиться" с помощью массива из 1-го элемента:
                  System.out.println("\nА тут уже они не существуют:");
                  System.out.println("MAXROWS = "+MAXROWS);
                  System.out.println("MAXCOLS = "+MAXCOLS);
                  System.out.println("A с этой все норм: Zamykanie = "+Zamykanie[0]);
              // Требуется передать в другой класс: imageIO.saveImage(testImage);
              // Как реализовано выше с Zamykanie (его «читает», но это int а не массив)
              // Где testImage это int[][][] testImage - трехмерный массив
              }});
          }//body
      }//imagemain
      Слышал звон, но не знаешь, где он?

      ExpandedWrap disabled
        final int MAXROWS = 100500;


      Ты ведь в курсе, чем объявление переменной отличается от изменения значения переменной?
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,1328 ]   [ 15 queries used ]   [ Generated: 28.03.24, 22:08 GMT ]