Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как создать элемент структуры с массивом 
:(
    Опции темы
kobalt
Дата 24.9.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 24.9.2008
Где: москва

Репутация: нет
Всего: нет



есть структура  poi основанная на структуре   point

при создание элемента el1 структуры poi 
выдается ошибка:
Дополнительные сведения: В экземпляре объекта не задана ссылка на объект.

как правильно создать элемент el1 ?

Код

Public Structure poi
        Public i As Double
        Public pp() As point
    End Structure

    Public Structure point
        Public x As Double
        Public y As Double
    End Structure

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim el1 As poi
        el1.i = 5
        el1.pp(1).x = 3
    End Sub




PM MAIL   Вверх
Pilger
Дата 24.9.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Объект создается так:
Код

Dim el1 As New Poi


или так:
Код

Dim el1 As Poi
el1 = New Poi



Это сообщение отредактировал(а) Pilger - 24.9.2008, 17:40


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 24.9.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Думаю, в данном случае ошибка возникает в строке
Код

el1.pp(1).x = 3

Дело в том, что в самой структуре, ты объявляешь пустой массив, а потом обращаешься к индексу 1 этого массива. Тебе нужно либо переопределить массив перед использованием, либо вообще вместо массива использовать коллекцию(по-моему оптимальный вариант).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
kobalt
Дата 24.9.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 24.9.2008
Где: москва

Репутация: нет
Всего: нет



Pilger,  пробовал ваш вариант - не работает
PM MAIL   Вверх
diadiavova
Дата 24.9.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата

пробовал ваш вариант - не работает 

Ну дык, ясный перец не будет работать. Для разнообразия можно было бы и на моё замечание обратить внимание. Я же объяснил, что NullReferenceException вызывает не структура, а её поле pp. Оно пустое, естественно обращаться к нему нельзя. А вариант, предложенный Pligerом, от твоего ни чем не отличается. Ну если ты считаешь, что diadiavova просто гонит, тогда - удачи.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
kobalt
Дата 25.9.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 24.9.2008
Где: москва

Репутация: нет
Всего: нет



сейчас читаю про коллекции (раньше  с ними не работал).

В самой структуре объявить непустой массив не удается. 
Как переопределить массив перед использованием?
PM MAIL   Вверх
Pilger
Дата 25.9.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Цитата(kobalt @ 24.9.2008,  18:50)
Pilger,  пробовал ваш вариант - не работает

Знаю. Извиняюсь, не правильно понял проблему.
Diadiavova предложил такой вариант:
"Тебе нужно либо переопределить массив перед использованием"
Тобишь это будет так:
Код

        Dim el1 As poi
        el1.i = 5
        ReDim el1.pp(5)
        el1.pp(1).x = 3


Это сообщение отредактировал(а) Pilger - 25.9.2008, 17:34


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 25.9.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



В общем и целом Pilger ответил на вопрос, однако, судя по всему, здесь потребуются некоторые дополнительные разъяснения. 
Если говорить о массивах то они создаются при объявлении в том случае, когда указаны индексы, в ином случае, объявляется просто пустая переменная(как и произошло), тогда можно переопределить, используя конструкцию ReDim(как предложил Pilger) или просто присвоить полю значение. Например так
Код

Dim pa(3) As point
el1.pp = pa

Разницы нет.
При этом надо иметь в виду, что если конструкция ReDim используется для увеличения количества индексов её следет применять со словом Preserve.
Если нужно, чтобы массив создавался внутри структуры, здесь всё зависит от задач, стоящих перед тобой. Например: если известно заранее сколько будет элементов в массиве, и это число фиксированное - то нет проблем, приведу пример для случая, когда в массиве 5 элементов
Код

    Public Structure poi
        Public i As Double
        Public pp(4) As point
    End Structure

Однако, подозреваю, что число это может быть разным. В таком случае, тебе следует рассмотреть вариант использования параметрического конструктора
Код

    Public Structure poi
        Public Sub New(ByVal poinCount As Integer, ByVal ind As Double)
             ReDim pp(poinCoun - 1)
             i = ind
        End Sub
        Public i As Double
        Public pp() As point
    End Structure


В этом случае, для создания экземпляра структуры можно использовать код
Код

Dim el1 As New poi(10, 5)

в результате получится объект с десятью элементами в массиве, а поле i будет равно 5.

Что касается структуры point. Во-первых, в пространстве System.Drawing имеется две похожие структуры (Point и PointF), прежде, чем создавать свою, рассмотри возможность использования одной из них. Если же ни одна не подойдёт, всё равно называть свою структуру point - плохая идея, пространство это импортируется в проект по умолчанию, а дублирование имён может привести к конфликту(сам запутаешься).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
kobalt
Дата 26.9.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 24.9.2008
Где: москва

Репутация: нет
Всего: нет



Спасибо, все работает! smile  smile  smile 

PS: структуру point взял где то из примеров - использую для описания координат точек на плоскости 

PPS: сейчас описываю задачу формулами, после понадобится рисование несложной графики на плоскости (передвигающиеся линии, окружности) - не могли бы взяться (разумеется не бесссплатно)

PM MAIL   Вверх
diadiavova
Дата 26.9.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Если точки нужны для рисования графики - тем более лучше использовать "родные" (из System.Drawing). Например: прорисовка многоугольника требует передачи массива точек, естественно "родных" конвертирование требует дополнительных затрат. Насчёт взяться - надо посмотреть, что там за задача.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 27.9.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Кстати, в сообщении, где я привёл следующий код:
Код

    Public Structure poi
        Public i As Double
        Public pp(4) As point
    End Structure


я слегка ошибся. В структурах инициировать массив нельзя. То есть можно использовать либо второй вариант(где массив инициируется в конструкторе), либо переопределять его вне кода самой структуры.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.