Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179

Динамическое создание экземпляра структуры

21.08.2014, 10:02. Показов 4633. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая, имеется структура с параметром. Приходят данные по послед. порту с числом, если ещё не создан экземпляр структуры с полем Channel, равным числу в запросе, то динамически создаём новый экземпляр структуры:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public struct PostalAddress
    {
       public int Channel;
    }
 
PostalAddress PA = new PostalAddress();
 
 private void Form1_Load(object sender, EventArgs e)
        {
        PA.Channel=44;
        }
 
 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
          char MyChan= serialPort1.ReadChar(); 
 
          //Здесь идёт обработка, см ниже 
        }
Знач. вопросы у меня следующие: 1) Каким образом циклом просмотреть все экземпляры структуры PostalAddress на соответствие поля Channel пришедшему числу (MyChan)? 2) Как динамически создать новый экземпляр структуры в случае, если другие экземпляры структуры не удовлетв. условию MyChan=PostalAddress.Channel ?

Возможно сумбурно изложил вопросы, буду рад услышать ваши мысли
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2014, 10:02
Ответы с готовыми решениями:

Создание экземпляра структуры
Добрый день! Читаю книжечку Джона Скита. В теме по ссылочным типам и типам значениям он пишет следующее: -Экземпляры ссылочных типов...

Динамическое создание экземпляра класса
Подскажите начинаюшему! Есть FileUpload, с помощью него я хочу отправить файл на почтовый ящик. string file5 =...

Динамическое создание экземпляра класса.
Есть программа. Как сделать что-бы пользователь вводил имя, а затем создавался экземпляр класса с таким же именем?

14
147 / 73 / 17
Регистрация: 31.05.2014
Сообщений: 215
21.08.2014, 10:14
mappy89, хранить лист структур, проверять на присутствие, если отсутствует - добавлять в лист
0
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
21.08.2014, 10:21  [ТС]
Можете привести пример кода, с добавлением структуры в лист структур?
0
147 / 73 / 17
Регистрация: 31.05.2014
Сообщений: 215
21.08.2014, 10:53
mappy89,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 class Program
    { 
        public struct PostalAddress
        {
            public int Channel;
        } 
        List<PostalAddress> PAs = new List<PostalAddress>(); 
        private void Form1_Load(object sender, EventArgs e)
        {
            PAs.Add(new PostalAddress() { Channel = 44 });
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            char MyChan = serialPort1.ReadChar();
            int Index = PAs.FindIndex(x=>x.Channel==MyChan);
            if (Index == -1)
                PAs.Add(new PostalAddress() { Channel = MyChan });
            //Здесь идёт обработка, см ниже 
        }
    }
1
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
21.08.2014, 15:18  [ТС]
Возникла такая проблема, при создании списка при попытке изменить поле добавленной в лист структуры аозникает ошибка: "Не удалось изменить возвращаемое значение для "System.Collections.Generic.List<Windows FormsApplication1.PostalAddress>.this[int]", так как он не является переменной"

C#
1
2
3
4
5
6
7
8
9
10
11
12
 public struct PostalAddress
        {
            public int Channel;
        } 
        List<PostalAddress> PAs = new List<PostalAddress>(); 
 
        private void Form1_Load(object sender, EventArgs e)
        {
            PAs.Add(new PostalAddress() { Channel = 44 });
            
            PAs[0].Channel=99;  // здесь возникает ошибка
        }
Как решить проблему?
0
Заблокирован
21.08.2014, 15:39
Цитата Сообщение от mappy89 Посмотреть сообщение
Как решить проблему?
C#
1
PAs[0] = new PostalAddress {Channel = 99};
0
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
21.08.2014, 15:47  [ТС]
NightmareZ, спасибо, но я никак не пойму логику этого действия, ведь экземпляр уже был создан, почему для задание поля нужно создавать его ещё раз?

Зы: при создании консольного приложения PAs[0].Channel=99; работает без ошибок, почему так?
0
Заблокирован
21.08.2014, 23:09
Цитата Сообщение от mappy89 Посмотреть сообщение
но я никак не пойму логику этого действия, ведь экземпляр уже был создан, почему для задание поля нужно создавать его ещё раз?
Потому что выражение PAs[0] возвращает структуру, а не ссылку на неё. Если бы PostalAddress был классом, это бы прокатило.
0
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
25.08.2014, 09:45  [ТС]
Проблема при этом способе следующая: допустим я создаю новый элемент списка и при этом присваиваю одному полю одно значение. Следующей командой присваиваю другому поле другое значение в результате чего происходит полная перезапись значений полей текущего элемента списка

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public struct PostalAddress
    {
        public short channel;
        public short isAdd;
   }
 
int CurChannel=0;
public List<PostalAddress> StrList = new List<PostalAddress>();  //список структур
 
...
 
StrList.Add(new PostalAddress() { channel = 1});
StrList[CurChannel] = new PostalAddress { isAdd = 22};  //происходит перезапись поля channel в 0 текущего элемента!
 
CurChannel++;
Как с этим бороться?

Добавлено через 22 минуты
Другими словами, как изменять поля элемента структуры в списке уже ПОСЛЕ добавления его в список?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.08.2014, 11:04
Цитата Сообщение от mappy89 Посмотреть сообщение
как изменять поля элемента структуры в списке уже ПОСЛЕ добавления его в список?
Обращаться к элементу списка (структуре) по индексу.
0
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
25.08.2014, 11:16  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Обращаться к элементу списка (структуре) по индексу.
ошибка: "Не удалось изменить возвращаемое значение для "System.Collections.Generic.List<Windows FormsApplication1.Po stalAddress>.this[int]", так как он не является переменной" Об этом я отписывался выше

Впринципе я уже отказался от списка в пользу обычного массива структур, просто академический интерес
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.08.2014, 11:45
Цитата Сообщение от mappy89 Посмотреть сообщение
я уже отказался от списка в пользу обычного массива структур
mappy89, а какая разница? Список - тот же массив, только с динамически изменяемым размером. Покажите участок кода, где вы пытаетесь что-то изменить. Ятд, вы что-то не так делаете.

Добавлено через 25 минут
mappy89, вот накидал пример.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            List<PostalAddress> postList = new List<PostalAddress>();
            Random r = new Random();
 
            for (int i = 0; i < 10; i++)
            {
                string temp = string.Format("{0}_{1}", "Struct", i.ToString());
                PostalAddress p = new PostalAddress();
                p.StructName = temp;
                p.Channel = r.Next(0, 100);
                postList.Add(p);
            }
 
            PrintStructs(postList);
            Console.WriteLine();
            ChangeStructs(ref postList);
            Console.WriteLine();
            PrintStructs(postList);
 
            Console.ReadLine();
        }
        static void ChangeStructs(ref List<PostalAddress> list)
        {
            Random r = new Random();
            for (int i = 0; i < list.Count; i++)
            {
                PostalAddress p = new PostalAddress { StructName = list[i].StructName, 
                                                      Channel = r.Next(0,50) };
                list[i] = p;
            }
        }
        static void PrintStructs(List<PostalAddress> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i].ToString());
            }
        }
    }
    struct PostalAddress
    {
        public string StructName { get; set; }
        public int Channel { get; set; }
        public override string ToString()
        {
            return string.Format("Name: {0}, Channel: {1}", StructName, Channel);
        }
    }
}
1
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
25.08.2014, 13:45  [ТС]
Тогда можно ещё вопросик по теме? =)

Вот у меня есть массив структур (обратно в лист попозже переделаю), внутри структуры есть ещё одна структура, а внутри 2-й структуры есть список (List). Нужно ли инициировать эжкземпляр этого списка, или напрямую добавлять элементы в список без его инициализации?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public struct PostalAddress
    {
        public short channel;
        public short IsNeg;
 
        public struct schedule
        {
            public List<int> StringValues; 
        }
        public schedule MySched;
    }
 
....
PostalAddress[] PA = new PostalAddress[100];
Random r = new Random();
 
.....
 
PA[0].MySched.StringValues.Add(r.Next(0,50); //ок?
0
 Аватар для Slicker
49 / 49 / 12
Регистрация: 18.01.2013
Сообщений: 169
25.08.2014, 14:56
Жуть какая-то, зачем вам это?)

P.S. разумеется так добавить не получится.
0
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
25.08.2014, 15:03  [ТС]
Вопрос решён, да, нужно инициировать все экземпляры. Сделал циклом, ы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2014, 15:03
Помогаю со студенческими работами здесь

Динамическое добавление экземпляра неизвестного мне enum-а
Пишу свой аналог контрола PropertyGreed. (Зачем - по работе тестовое задание такое) хочу менять значения property, если с текстом в виде...

Создание экземпляра класса
Народ, можете пожалуйста доходчиво объяснить в чем разница. есть, например, класс class MyClass { public...

Создание экземпляра класса
Как написать класс class Class1 Class1(int x1,int x2) { ........ } так чтобы при вызове

Создание экземпляра класса выдает ошибку
Учил по учебнику СИ Шарп так вот в начале были экземпляры класса делал по образцу не выходит , подскажите как их делать в последней...

Создание экземпляра класса из текстовой строки
Доброго времени суток, появилась проблема, подскажите, как решается. Допустим есть строка, которая принимает значение какого-то,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru