0 / 0 / 0
Регистрация: 08.11.2014
Сообщений: 20
1

На выходе получаю лист одинаковых элементов

24.09.2015, 18:49. Показов 547. Ответов 4
Метки нет (Все метки)

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
public struct Cyl
        {
            public TDPoint c1, c2;
            public List<TDPoint> cir1, cir2;
        }
        public Cyl cylinder;
 
        public class TDPoint
        {
            public float x;
            public float y;
            public float z;
            public const float w = 1;
            public TDPoint(float _x, float _y, float _z)
            {
                x = _x;
                y = _y;
                z = _z;
            }
            public TDPoint()
            {
                x = 0; y = 0; z = 0;
            }
        }
 
        public void createCyl(float r, float h, int a)
        {
            cylinder.cir1 = new List<TDPoint>();
            cylinder.cir1.Add(new TDPoint(r, 0f, 0f));
            float angle = 10;
            float[,] rOY = MathLib.RmatrixOY(angle);
//дальше происходят странные вещи
            for (int i = 0; i < 36; i++)
            {
                cylinder.cir1.Add(MathLib.Multiply(rOY, cylinder.cir1[i]));
            }
        }
И собсна вырезка из класса математики

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
//поворот вокруг Y
        static public float[,] RmatrixOY(double a)
        {
            a = a * Math.PI / 180;
            float[,] R = new float[4, 4] { {  (float)Math.Cos(a), 0, (-1)* (float)Math.Sin(a), 0},
                                           {   0,           1, 0,                0},
                                           {    (float)Math.Sin(a), 0,  (float)Math.Cos(a),      0},
                                           {   0, 0,        0,                   1}};
            return R;
        }
 
        static public Form1.TDPoint Multiply(float[,] q, Form1.TDPoint p)
        {
            Form1.TDPoint tempPoint = p;
            float[] tempArr = new float[4];
            float[] arr = new float[4] { p.x, p.y, p.z, 1 };
            int c = 0;
            for (int j = 0; j < 4; j++)
            {
 
                for (int i = 0; i < 4; i++)
                {
                    tempArr[c] += arr[i] * q[i, j];
                }
                c++;
            }
 
            tempPoint.x = (float)tempArr[0];
            tempPoint.y = (float)tempArr[1];
            tempPoint.z = (float)tempArr[2];
            return tempPoint;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2015, 18:49
Ответы с готовыми решениями:

На выходе функции получаю None
Добрый день! Подскажите, пожалуйста, по такому вопросу. Есть функция, давление насыщенных паров...

Enum - почему на выходе получаю 0, а не 1 ?
начал писать на шарпе, вот появился вопрос есть перечисление enum days { ...

На выходе программы получаю искривление теплового фронта
Здравствуйте! Помогите найти ошибку в решении... На выходе получаю искривление теплового фронта...

Xerox 3160n При выходе из принтера лист застревает
Точнее лист вылезает до тех пор пока ролики на печке его толкают, как только лист полностью вышел...

4
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,581
Записей в блоге: 14
24.09.2015, 19:10 2
Код 1, строка 29
Добавляется 1 элемент в список.

1:35
Этот элемент передаётся в функцию Multiply.

2:14 этот элемент сохраняется во временной переменной.
2:31 переменная возвращается.

1:35 добавляется в список, обратно.

А так как TDPoint не структура, а класс, то передаётся она по ссылке, а не по значению. Т.е. на самом деле вы меняете один и тот же экземпляр везде.

Добавлено через 2 минуты
Т.е. ошибка тут:
Цитата Сообщение от NonameUser1933 Посмотреть сообщение
На каждой итерации вновь созданный элемент забивает собой все предыдущие.
Он не созданный заново, это всё тот же первый, единственный элемент.
1
0 / 0 / 0
Регистрация: 08.11.2014
Сообщений: 20
24.09.2015, 19:20  [ТС] 3
Спасибо огроменное тебе, человечище. Просто перепилил в структуру и заработало. Но может можно как-то иначе решить эту проблему? Так сказать, покрасивше.
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,581
Записей в блоге: 14
24.09.2015, 19:28 4
Да, можно просто на входе в Multiply создавать новый экземпляр TDPoint, а не юзать переданный.
Создавать можно и конструктором копирования, если его прописать.

Добавлено через 2 минуты
C#
1
2
3
4
5
static public Form1.TDPoint Multiply(float[,] q, Form1.TDPoint p)
        {
            Form1.TDPoint tempPoint = new Form1.TDPoint();
            float[] tempArr = new float[4];
            float[] arr = new float[4] { p.x, p.y, p.z, 1 };
Добавлено через 2 минуты
Или вообще так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static public Form1.TDPoint Multiply(float[,] q, Form1.TDPoint p)
        {
            float[] tempArr = new float[4];
            float[] arr = new float[4] { p.x, p.y, p.z, 1 };
            int c = 0;
            for (int j = 0; j < 4; j++)
            {
                for (int i = 0; i < 4; i++)
                {
                    tempArr[c] += arr[i] * q[i, j];
                }
                c++;
            }
 
            return new Form1.TDPoint(tempArr[0], tempArr[1], tempArr[2]);
        }
1
0 / 0 / 0
Регистрация: 08.11.2014
Сообщений: 20
24.09.2015, 19:59  [ТС] 5
Спасибо. Особенно за оперативность.
0
24.09.2015, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 19:59
Помогаю со студенческими работами здесь

Массив: Почему при сравнении двух одинаковых объектов я получаю false?
var a = ; var b = ; console.log(a); // console.log(b); // console.log(typeof a); //object...

Замена первой группы одинаковых элементов на последнюю группу одинаковых элементов
Всем привет, помогите с заменой первой группы одинаковых элементов в нашем случае пять единиц на...

Копирование на новый лист строк, с одинаковых днями
Есть файл с приходом сотрудников на работу.В нем 4 столбца,первый столбец с датой.Нужно чтобы...

Выделение подсчет и копирование одинаковых значений в отдельный лист
Добрый день! Есть эксель документ с логом просмотра разных документов за 10 лет. В логе название...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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