С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
1

Сохранение соразмерности массивов, лежащих внутри разных полей одного класса

27.10.2024, 20:09. Показов 655. Ответов 16

Author24 — интернет-сервис помощи студентам
Есть допустим следующие типы, внутри которых имеются массивы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ControlValve
    {
        private List<PneumoChamber> chambers;
        private List<double> electroLines;
        private List<TransCondition> transConditions;
    }
 
    internal class TransCondition
    {
        private string literal;
        private double setValue;
        private bool sign;          //true for more-or-equal  and false for less-sign
 
        private int[] matrix;       //these three vecteurs have format {chamber1, chamber2, chamber3... chamberN, eLine1, eLine2...}
        private bool[] absolute;
        private bool[] heaviside;
    }
То есть размерность массивов matrix, absolute, heaviside -- равна количеству chambers.Count + electroLines.Count

Из-за этого чтобы добавить скажем дополнительную chamber в экземпляр ControlValve пришлось написать целое
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
  public class ControlValve
    {
      public void AddChamber(PneumoChamber ch)
        {
            this.chambers.Add(ch);  
            foreach (TransCondition tc in this.transConditions)
                tc.AddingChamberAtIndex(this.chambers.Count - 1);
        }
    }
  internal class TransCondition
    {
      internal void AddingChamberAtIndex(int chamberIndex)
        {
            int[] newmatrix = new int[matrix.Length + 1];
            for(int i = 0; i < newmatrix.Length; i++)
            {
                if (i < chamberIndex) newmatrix[i] = matrix[i];
                if (i == chamberIndex) newmatrix[i] = 0;
                else newmatrix[i] = matrix[i - 1];
            }
 
            this.matrix = newmatrix;
 
            bool[] newabsolute = new bool[absolute.Length + 1];
            for (int i = 0; i < newabsolute.Length; i++)
            {
                if (i < chamberIndex) newabsolute[i] = absolute[i];
                if (i == chamberIndex) newabsolute[i] = false;
                else newabsolute[i] = absolute[i - 1];
            }
 
            this.absolute = newabsolute;
 
            bool[] newheaviside = new bool[heaviside.Length + 1];
            for (int i = 0; i < newheaviside.Length; i++)
            {
                if (i < chamberIndex) newheaviside[i] = heaviside[i];
                if (i == chamberIndex) newheaviside[i] = false;
                else newheaviside[i] = heaviside[i - 1];
            }
 
            this.heaviside = newheaviside;
        }
    }
Эта задача правду решается влоб? Или есть более правильные способы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2024, 20:09
Ответы с готовыми решениями:

Есть два класса, изменения внутри полей одного должны менять поля другого
К примеру, есть классы: public class Class1 { private double _num; ...

Вызов метода одного класса внутри другого класса
PHP передача метода, с класса, в другой класс Столкнулся с проблемой не могу передать метод или...

Поле одного класса внутри другого класса
class fio { public: char* fam; char* name; char* otch; }; class clinic

Посчитать сумму полей price у элементов разных массивов
Вынесено из Переиспользование функции в других модулях С переиспользованием функций всё...

16
2337 / 1825 / 753
Регистрация: 27.07.2012
Сообщений: 5,400
27.10.2024, 21:02 2
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Эта задача правду решается влоб? Или есть более правильные способы?
Ну для начала зачем мешать в кучу списки и массивы? Почему maxtrix, absolute и heavyside не могут тоже быть списками? У них хотя бы есть метод вставки List.Insert в любое место со всеми проверками.

Но вообще надо просто всю структуру пересмотреть. Я не знаю, что за задачу вы решаете, но почему эти matrix надо постоянно заполнять, а не вычислить по имеющимся chambers и electroLines в тот момент, когда они понадобятся? Сейчас же вы пытаетесь связать несвязуемое.
1
Эксперт JavaЭксперт по электронике
3106 / 2201 / 553
Регистрация: 04.09.2018
Сообщений: 7,454
Записей в блоге: 3
28.10.2024, 01:51 3
Цитата Сообщение от John Prick Посмотреть сообщение
Сейчас же вы пытаетесь связать несвязуемое
Согласен. Еще и какая-то тупая логика в приведенном коде класса TransCondition. Создать массив на основании другого и его же переписать.. Ну, это как разбирать двигатель через... глушитель.
0
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 09:27  [ТС] 4
Листы делал для сущностей, матрицы для взаимосвязей.
Если касательно задачи:
Есть n чамберов со сжатым воздухом и есть m правил по которым между чамберами i и j открывается переток k. правила могут зависеть от ряда давлений p0, p1, p2... из n, а также от ряда напряжений q0, q1, q2... из e (которое я еще не вводил, но думаю тут уже никто читать не будет).

Короче видимо раздвигаю и вставляю я неправильно. Надо буду да почитаю работу с массивами опять.
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
28.10.2024, 10:58 5
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Надо буду да почитаю работу с массивами опять.
С ООП наверно лучше начать.

Цитата Сообщение от Linus Torvalds
I will, in fact, claim that the difference between a bad programmer
and a good one is whether he considers his code or his data structures
more important. Bad programmers worry about the code. Good
programmers worry about data structures and their relationships.
0
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 11:00  [ТС] 6
Цитата Сообщение от IamRain Посмотреть сообщение
С ООП наверно лучше начать.
Тк, а какое, обобщенно, замечание по поводу моей структуры данных и принципов ООП здесь?
Слишком расплывчатый ответ просто: "проверьте вашу структуру данных, она плоха"...
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
28.10.2024, 11:11 7
Да пока непонятна ваша задумка, но сам факт, что подобная проблема возникает, уже говорит о том что что-то не так.
Явно можно сделать проще.
1
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 11:29  [ТС] 8
Задумка тут в том, что есть воздухораспределитель.
Есть входящие параметры: ряд давлений и ряд напряжений.
Есть выходные параметры: ряд давлений вых.

А внутренность класса ControlValve должна обеспечить чтобы когда по таймеру на вход накидываются входные параметры, на выходе были отынтегрированные соответствующие выходные.

Внутри сама по себе штука непростая.
На сей момент из ваших ответов я составил резюме:
"Если у тебя возник такой вопрос -- вероятно пересмотри код, породивший необходимость этих операций, возможно проблема впринципе отпадет. И в массивы ты как-то неправильно вставляешь".
0
2105 / 1515 / 392
Регистрация: 26.06.2017
Сообщений: 4,350
28.10.2024, 11:46 9
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Или есть более правильные способы?
Ну как минимум можно использовать Array.Resize<T>, тогда часть итераций, а именно chamberIndex - 1, будут не нужны. Кроме этого сэкономите на создании ещё одного массива.
И соглашусь с участниками темы, что вы в одну кучу сваливаете и сущности чамберов и какие-то операции с ними. Почему бы их не разделить?
Чтобы добавление чамбера выглядело в коде естественно, т.е. с применением метода Add или Insert, то я бы применил в классе ControlValve собственные коллекции вместо List. Эти коллекции должны определять/переопределять методы вставки так, чтобы при этом можно было изменять размер связанных массивов автоматически.
1
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 15:06  [ТС] 10
Да, пожалуй есть прблема вот в этом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    internal class PneumoTransition
    {
        private string name;
        private int chamberAnum;     //chAnum is minor and chB is major of two
        private int chamberBnum;
        private int openCondition;
        private int closeCondition;
 
        private bool isOpened;
 
        private double K;       //coefficient of masstransition dm = K * (pA-pB)^2 * dt
    }
Здесь получается, объект, описывающий переток между камерами, хранит ссылки на камеры, которые соединяет -- в виде тупо int индекса из листа.
То же самое ссылка на условие открытия и условие закрытия канала.

Оттуда этот рак и стал распространяться по всему классу.

По идее нужно эти инты замменить на соответствующие классы, у меня периодически бывает отъезд мышления в сторону "класс в сишарп -- НЕ ссылочный объект", а если исходить из такого, то да, фигня происходит.

Пойду словарями позаменяю всё...
0
2105 / 1515 / 392
Регистрация: 26.06.2017
Сообщений: 4,350
28.10.2024, 15:52 11
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Пойду словарями позаменяю всё...
Зачем словарями, может всё таки коллекциями? Хотя вам виднее конечно. Но шарп насквозь ссылочный.
0
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 16:15  [ТС] 12
Цитата Сообщение от Uswer Посмотреть сообщение
Зачем словарями, может всё таки коллекциями? Хотя вам виднее конечно. Но шарп насквозь ссылочный.
Ну всё словарями это гипербола конешно. Просто еще при первом составлении кода как минимум один словарь у меня появился там. Входные параметры которые. Они же выходные для некоторого другого объекта суть.
И вот задача как их в соответствие составить. Их может быть один, два, четыре может быть. И какой-то экземпляр ControlValve управляется только одним параметром, а какой-то двумя. В Индии большинство двумя например...

Короче когда на выходе управляющего объекта есть List<Штука>, пришедший на вход моего ControlValve -- как этому ControlValve определить -- какой из членов коллекции к чему относится?

В реальной жизни определяют по именам/цветам, ну то есть тормоза подключают к тормозной магистрали, а питание пневматическое к питающей...

И тут уже дальше можно думать только о коде, не о структуре данных.
Если Лист -- то нужно убедиться что в Листе всегда одинаковые индексы у одноименных сигналов.
Если Словарь -- то нужно убедиться, что тормозная магистраль всегда называется "ТМ", а напорная "НМ"...

В любом случае нужна какая-то преддоговоренность о формате, вопрос что удобнее для кода -- Дикшнри или Лист?

(Дополнительно нужно не забыть про случай, когда количество выходов управляющего объекта больше, чем количество входов данного. И обратную ситуацию поиметь ввиду, хотя мне на ум из реалайф приходят только вырожденные случаи)
0
2105 / 1515 / 392
Регистрация: 26.06.2017
Сообщений: 4,350
28.10.2024, 18:04 13
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Короче когда на выходе управляющего объекта есть List<Штука>, пришедший на вход моего ControlValve -- как этому ControlValve определить -- какой из членов коллекции к чему относится?
Ничего пока не понял, но думаю что мне это и не нужно, однако если у вас с этим есть нюансы, то создайте ещё оду тему.
0
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 20:51  [ТС] 14
Избавится от тех матриц придумал только так:
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
public interface IConditionPart
    {
        double ConditionValue { get; }
    }
 
internal class ConditionPart
    {
        private IConditionPart source;
        private int sign;
        private bool isAbsolute;
        private bool isHeavisideMul;
    }
internal class PneumoChamber : IConditionPart
    {
        internal double ConditionValue => this.pressure;
    }
public class TransCondition
    {
        private string literal;
        private double setValue;
        private bool sign;          //true for more-or-equal  and false for less-sign
 
        //private int[] matrix;       //these three vecteurs have format {chamber1, chamber2, chamber3... chamberN, eLine1, eLine2...}
        //private bool[] absolute;
        //private bool[] heaviside;
       private List<ConditionPart> conditionParts;
    }
Лучшего ничего не получается, но проверки те уже не нужны зато.
0
2105 / 1515 / 392
Регистрация: 26.06.2017
Сообщений: 4,350
28.10.2024, 21:13 15
Цитата Сообщение от LexMcLinn Посмотреть сообщение
В реальной жизни определяют по именам/цветам, ну то есть тормоза подключают к тормозной магистрали, а питание пневматическое к питающей...
А-а-а, понял в чём у вас дилемма. Это же про паровозы из соседней ветки! Ну так и с пневмой также, как там: есть базовый класс пневмы, а дальше пошло-поехало класс для тормозов, класс для питающей ветви, класс для подкачки ЖД-колёс
1
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
28.10.2024, 21:39  [ТС] 16
Таки интерфейс, как бы намекающий, что вот эти вот колёсики:железяки, Iскладываемое можно сложить с вот теми проводочками:кабеляки,Iскладываемое, а вон те колёсищи:железяки -- нельзя.

Не так просто мне оказалось это сформулировать.
0
Эксперт JavaЭксперт по электронике
3106 / 2201 / 553
Регистрация: 04.09.2018
Сообщений: 7,454
Записей в блоге: 3
28.10.2024, 21:50 17
Цитата Сообщение от Uswer Посмотреть сообщение
класс для подкачки ЖД-колёс
АЗС еще надо по пути...
0
28.10.2024, 21:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2024, 21:50
Помогаю со студенческими работами здесь

Сохранение всех полей класса в файл
Здравствуйте! В программе есть 2 структуры. В классе объявлены массивы этих структур. В процессе...

Реализовать сохранение в базу данных полей разных типов (в том числе и пользовательских)
Здравствуйте! Подскажите как можно реализовать такую задачу: В базе данных должны быть...

Вывод значений полей класса в разных формах
1.Создан класс и 2-е формы 2.Кнопкой формы1 присваивается значение полям этого класса 3.При...

Массив разных объектов внутри класса
Хочу сделать что-то типа системы событий и их обработчиков. Есть класс Window и класс Control, от...

Вывод одного ответа из разных значений и сохранение их в строке
В общем - пытаюсь заставить программу понимать что ей написали, и выдавать некий ответ на...

Привязка одного из полей класса к TextBox
Здравствуйте. Такие дела: Класс человек. Допустим, у него пока только имя. public class...

Использование массивов внутри методов класса
Нужно сделать так, чтобы массив NextBrick можно было использовать в ShowNB. При этом Массив...


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

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