Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 5
1

Двумерный массив как поле класса C#

19.11.2018, 14:55. Показов 4634. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой что не могу получить двумерный массив из объекта класса
Есть библиотека

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
 
namespace Profili
{
    public class Lopatki
    {
        string name;
        double[,] m;
 
          
 
        public Lopatki(string name, double [,]m)
        {
            this.name = name;
            this.m = new double[3, 3];
            this.m = m;
        }
 
        
        public string get_name()
        {
            return name;
 
        }
 
        public double[,] get_tochki()
        {
            return m;
        }
 
        public static Lopatki
           P2314A = new Lopatki("P2314A",t2314);
 
 
    static double[,] t2314 =
        {
            { 1,2,3 },
            { 5,8,9 },
            { 6,3,8 },
        };
   }
 
}
Подключаю библиотеку к другой программе, вызываю методы к объекту P2314A, имя выводится, а массив - нет, пишет ошибку ссылка на объект не указывает на экземпляр объекта.
Не пойму в чем дело.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2018, 14:55
Ответы с готовыми решениями:

Двумерный массив как поле класса
Здравствуйте! Подскажите, пожалуйста. Я хочу использовать вектор(stl) для работы с матрицами,...

Двумерный массив в динамической памяти как поле класса
Здравствуйте! Вот так можно описать двумерный массив в дин.памяти. class nameClass {...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Массив как поле класса
Мне нужно сделать : -Три поля: 1.Массив целых чисел. 2.Сумма элементов массива. 3.Длинна...

10
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.11.2018, 15:04 2
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
Подключаю библиотеку к другой программе, вызываю методы к объекту P2314A, имя выводится, а массив - нет, пишет ошибку ссылка на объект не указывает на экземпляр объекта.
Не пойму в чем дело.
Если Вы о поле t2314 - объявите его public.

Добавлено через 2 минуты
К полям name и m - это тоже относится

Добавлено через 1 минуту
Всё, что Вы хотите видеть за пределами класса объявляйте public (можно ещё internal, но там есть свои нюансы).
0
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 5
19.11.2018, 15:31  [ТС] 3
t2314 это как просто переменная, объявление ее public не помогло,
name и m должны быть private, доступ к ним только через методы get_name и get_tochki
В другой программе я вызываю следующее:
C#
1
2
 richTextBox1.Text += "\n " + Profili.Lopatki.P2314A.get_name();//выводит P2314A
richTextBox1.Text += "\n " + Profili.Lopatki.P2314A.get_tochki();//ошибка ссылка на объект не указывает на экземпляр объекта
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.11.2018, 16:00 4
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
В другой программе я вызываю следующее:
C#
2
richTextBox1.Text += "\n " + Profili.Lopatki.P2314A.get_tochki();//ошибка ссылка на объект не указывает на экземпляр объекта
Так правильно! У Вас же поле m на этот момент ещё не иниализированно!

Добавлено через 3 минуты
Метод Lopatki.P2314A у Вас возвращает каждый раз НОВЫЙ объект класса Lopatki. А в новом объекте поле m ненициализированно.
Вы либо сохраняйте новый объект. И потом работайте уже с созданным. Либо сделайте все поля статическими, что бы они сохраняли свои значения между вызовами статических методов.
0
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 5
19.11.2018, 16:03  [ТС] 5
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так правильно! У Вас же поле m на этот момент ещё не иниализированно!
То есть? Конструктор то ведь сработал, и поле name я могу получить, почему с m не так?
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.11.2018, 16:10 6
Если Вам нужны только статические методы, поля и свойства, то Вам надо сделать что в таком духе.
C#
32
33
34
35
36
37
38
39
40
41
        static Lopatki lopatki;
        public static Lopatki P2314A
        {
            get
            {
                 if (lopatki==null)
                           lopatki = new Lopatki("P2314A",t2314);
                 return lopatki;
             }
          }
Добавлено через 1 минуту
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
Конструктор то ведь сработал, и поле name я могу получить, почему с m не так?
Он сработал, но при новом вызове он заново срабатывает, а в новом уже ничего не установлено.

Добавлено через 3 минуты
Вы объясните чего по алгоритму Вы добиваетесь, а то по коду не понятно.
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
19.11.2018, 16:17 7
Лучший ответ Сообщение было отмечено Prikoll4ik как решение

Решение

Цитата Сообщение от Prikoll4ik Посмотреть сообщение
То есть? Конструктор то ведь сработал, и поле name я могу получить, почему с m не так?
поставьте точку остановки в начале метода, ДО вызова Вашего класса будете приятно удивлены.

Ваш конструктор срабатывает 1 раз, при инициализации статического поля P2314A а инициализируется оно null массивом т.к на момент вызова конструктора данное поле ещё не прошло инициализацию. Учитесь пользоваться отладкой и понимать что происходит.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Он сработал, но при новом вызове он заново срабатывает, а в новом уже ничего не установлено.
вы не правы, его поле классовое статичное, оно 1 раз выполниться и более конструктор не будет вызываться. как и Ваш пример, там проблема в ином.
1
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 5
19.11.2018, 16:17  [ТС] 8
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы объясните чего по алгоритму Вы добиваетесь, а то по коду не понятно.
Мне нужно, чтобы в библиотеке лежали определенные объекты, по типу P2314A, с уже инициализированными полями, у каждого объекта они разные, и я, имея доступ к объектам из другой программы, выцеплял бы их поля, допустим, в локальные переменные и совершал бы какие то операции
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.11.2018, 16:28 9
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
Мне нужно, чтобы в библиотеке лежали определенные объекты, по типу P2314A, с уже инициализированными полями, у каждого объекта они разные, и я, имея доступ к объектам из другой программы, выцеплял бы их поля, допустим, в локальные переменные и совершал бы какие то операции
Тогда не понял смыла Вашего кода ещё больше.
Статическое поле у Вас возвращает всегда один и тот же объект. НО Вы пишите, что Вам нужны РАЗНЫЕ объекты.
Опишите подробнее. ТО что Вы хотите и то, что у Вас в коде - это совершенно разное.

Добавлено через 1 минуту
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
вы не правы, его поле классовое статичное, оно 1 раз выполниться и более конструктор не будет вызываться. как и Ваш пример, там проблема в ином.
Да, Вы правы. Почему-то в голову взбрело, что P2314A - это метод, а не поле.

Добавлено через 5 минут
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
у каждого объекта они разные
Вам надо создавать разные объекты, и уже их хранить и работать с ними.
Для чего Вы сделали статическое поля P2314A и t2314 в чём смысл? Вы же хотите чтобы у разных объектов были разные свойства.
0
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 5
19.11.2018, 16:57  [ТС] 10
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
поставьте точку остановки в начале метода, ДО вызова Вашего класса будете приятно удивлены.
Ваш конструктор срабатывает 1 раз, при инициализации статического поля P2314A а инициализируется оно null массивом т.к на момент вызова конструктора данное поле ещё не прошло инициализацию. Учитесь пользоваться отладкой и понимать что происходит.
Спасибо большое, я тупанул, исправил, работает как надо))

Добавлено через 8 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам надо создавать разные объекты, и уже их хранить и работать с ними.
Для чего Вы сделали статическое поля P2314A и t2314 в чём смысл? Вы же хотите чтобы у разных объектов были разные свойства.
это все еще на уровне тестов, объекты будут добавляться т.е:
C#
1
2
3
4
5
6
public static Lopatki
          P2314A = new Lopatki("P2314A", t2314 ),
          P2617A = new Lopatki("P2617A",  t2617 ),
          P3021A = new Lopatki("P3021A", t3021 ),
          P3525A = new Lopatki("P3525A",  t3525 );
// и так далее
а на счет полей типа t2314, они просто используются для того, чтобы передать что-то в поле m
я же не могу создать объект таким образом:
C#
1
P2314A = new Lopatki("P2314A", {{1,2,3}, {1,2,3}}),
да и к тому же массив я вам привел укороченный, для лучшей наглядности, на самом деле они имеют размерность [24,3] и смотрятся довольно громоздко
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.11.2018, 17:27 11
Цитата Сообщение от Prikoll4ik Посмотреть сообщение
это все еще на уровне тестов, объекты будут добавляться т.е:
C#
1
2
3
4
5
6
public static Lopatki
          P2314A = new Lopatki("P2314A", t2314 ),
          P2617A = new Lopatki("P2617A",  t2617 ),
          P3021A = new Lopatki("P3021A", t3021 ),
          P3525A = new Lopatki("P3525A",  t3525 );
// и так далее
Мине кажется Вам надо что-то подобное
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    public class Lopatki
    {
        readonly string name;
        readonly double[,] m;
 
          
 
        public Lopatki(string name, int SizeMatrix)
        {
            this.name = name;
            this.m = new double[SizeMatrix, SizeMatrix];
        }
 
         public Lopatki(string name, double [,]m)
        {
            this.name = name;
            this.m = m;
        }
        
        public string get_name()
        {
            return name;
 
        }
 
        public double[,] get_tochki()
        {
            return m;
        }
 
//        public static Lopatki
//           P2314A = new Lopatki("P2314A",t2314);
 
 
//    static double[,] t2314 =
//        {
//           { 1,2,3 },
//            { 5,8,9 },
//            { 6,3,8 },
//        };
   }
Создание объекта с заданием имени и размера массива
C#
1
Lopatki P2314A = new Lopatki("P2314A", 3 );
Создание объекта с передачей массива
C#
1
Lopatki P2617A = new Lopatki("P2617A",  new double[,] () {{ 1,2,3 }, { 5,8,9 }, { 6,3,8 } });
Добавлено через 3 минуты
Создание списка объектов
C#
1
2
3
4
5
List<Lopatki> Lopatkies = new List<Lopatki>() 
                      { 
                            new Lopatki("P2314A", 3 ), 
                            new Lopatki("P2617A",  new double[,] () {{ 1,2,3 }, { 5,8,9 }, { 6,3,8 } })
                       };
1
19.11.2018, 17:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2018, 17:27
Помогаю со студенческими работами здесь

Массив как поле класса
Здравствуйте. Пишу класс на Яве, называющийся vector. Столкнулся с такой проблемой: у меня есть 9...

Массив как поле класса
Например, имеется класс с полем массивом размерностью 10 на 10. class massiv { private: int mas;...

Как запихнуть шахматное поле состоящее из картинок в двумерный массив
Как запихнуть шахматное поле состоящее из картинок в двумерный массив. Картинка генерируется с...

Большой двумерный массив как член класса
Размеры массива 2048 на 512. Создал, заполняю в конструкторе, но результата нету. Такое вообще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru