Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Соколиный глаз
Alvin Seville
324 / 258 / 130
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
Завершенные тесты: 4
1

Почему вылетает с ошибкой, а не создает два

27.06.2017, 17:47. Просмотров 1231. Ответов 17
Метки нет (Все метки)

Почему вылетает с ошибкой?

На VBA модуль переписывал с Pascal-евского оригинального варианта (моего).

Немного о модуле:
Модуль предназначен для создания графов. В нем есть 4 класса: Style (управляет внешним видом точек и ребер), GPoint (является классом точки), GEdge (является классом ребра) и Graph (класс самого графа).
0
Вложения
Тип файла: rar Graph.rar (38.1 Кб, 6 просмотров)
Тип файла: rar Graphics.rar (2.4 Кб, 6 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2017, 17:47
Ответы с готовыми решениями:

Почему вылетает с ошибкой NullReferenceException?
Код модуля: unit GraphOptimized; uses GraphABC; const Radius = 5; type ///Location...

Программа вылетает с ошибкой EXC_? (11). Почему?
Комрады, надеюсь на вашу помощь. Решил тряхнуть стариной (лет 13 назад в вузе изучал делфи) и...

Почему вылетает с ошибкой NullReferenceException при закраске пикселя?
uses crt,GraphABC; type Point2D = class X, Y: real; constructor(px, py:...

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

Access вылетает с ошибкой
При двойном нажатии на некоторые поля в списке, аксесс крашится

17
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
27.06.2017, 17:57 2
было бы неплохо, так сказать, сузить место предполагаемого вылета. Запустить в пошаговом режиме, создать условия, при которых вылетает с ошибкой и посмотреть на какой именно строчке происходит этот вылет.
1
SoftIce
es geht mir gut
11162 / 4638 / 1167
Регистрация: 27.07.2011
Сообщений: 11,355
Завершенные тесты: 1
27.06.2017, 18:58 3
черт те что отрабатывает, но коллекция пустая.
1
Миниатюры
Почему вылетает с ошибкой, а не создает два  
Вложения
Тип файла: rar VBA.rar (36.1 Кб, 3 просмотров)
Соколиный глаз
Alvin Seville
324 / 258 / 130
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
Завершенные тесты: 4
27.06.2017, 19:18  [ТС] 4

Не по теме:

идеально



Добавлено через 5 минут

Не по теме:

Если косяки найдете, мне сообщите :D мне самому интересно. Я тоже искать их пошел.

0
27.06.2017, 19:18
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
28.06.2017, 16:29 5
Цитата Сообщение от SoftIce Посмотреть сообщение
коллекция пустая.
из любопытства покопался в программе. Коллекция пустая из-за вот этого участка кода:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Sub Add(ByRef obj As GEdge)
    Dim t As Boolean, n
    t = False
    For Each n In S
        If n = obj Then
            t = True
            Exit For
        End If
    Next
    If t = True Then
        S.Add obj
    End If
End Sub
коллекция всегда будет пустой, поскольку при отсутствии элементов в ней цикл For-Each будет игнорироваться, соответственно, переменная t всегда будет = false и далее при ее проверке новый объект не будет добавлен в коллекцию.
0
Соколиный глаз
Alvin Seville
324 / 258 / 130
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
Завершенные тесты: 4
28.06.2017, 16:33  [ТС] 6
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' Addes edge.
Public Sub Add(ByRef obj As GEdge)
    Dim t As Boolean
    
    t = False
    For Each n In S
        If n = obj Then
            t = True
            Exit For
        End If
    Next
    If t = False Then
        S.Add obj
    End If
End Sub
0
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
28.06.2017, 17:24 7
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

оптимальней, наверное было бы:
Visual Basic
1
2
3
4
5
6
Public Sub Add(ByRef obj As GEdge)
   For Each n In S
      If n = obj Then Exit Sub
   Next
   S.Add obj
End Sub
правда, смущает меня эта классовая проверка n = obj...
1
Соколиный глаз
Alvin Seville
324 / 258 / 130
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
Завершенные тесты: 4
28.06.2017, 17:56  [ТС] 8
Хм, но все равно выскакивает ошибка.
0
Вложения
Тип файла: rar VBA.rar (38.5 Кб, 2 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
17154 / 7208 / 865
Регистрация: 25.12.2011
Сообщений: 10,987
Записей в блоге: 16
29.06.2017, 22:39 9
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Volobuev Ilya, проведи полную ревизию кода. У тебя куча ошибок с присвоением.
Объектные переменные присваиваются с помощью оператора Set. Пересмотри всё, начиная с:

Visual Basic
1
2
Property Get (там где результат - объектная переменная)
Property Set
и заканчивая этой строчкой, которая тоже неверна:
Visual Basic
1
E1.A.StyleOptions = S1
Visual Basic
1
If n = obj
Объектные переменные не сравниваются через знак равенства. Для этого есть ключевое слово Is
Равенством сравнивают только значения.
Если хочешь через равенство, тогда получай указатель на объект через ObjPtr.

P.S. Вообще странно, что VBA не позволяет показать место ошибки в подобных случаях. С VB6 в этом плане проще. Ну в любом случае вы можете расставить точек останова по F9. И по F5 найти часть, возбуждающую исключение.
1
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
30.06.2017, 11:26 10
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Цитата Сообщение от Dragokas Посмотреть сообщение
If n = obj
Объектные переменные не сравниваются через знак равенства. Для этого есть ключевое слово Is
Равенством сравнивают только значения.
вот-вот, что меня и смущало. (:
В данном случае Илье надо просто написать функцию, сравнивающую все значения объекта из коллекции со значениями объекта-параметра. Или же просто сравнить побайтно два участка памяти.

Вообще, я ему ранее советовал не заморачиваться с классами и сделать всё в виде структур. Это помогло бы избежать "косяков" с присваиванием и сравнением, да и сами поля в структурах, по идее, можно инициализировать значениями, просто передавая их "пачкой", как ParamArray и копируя побайтно в структуру.
1
Соколиный глаз
30.06.2017, 16:12  [ТС]
  #11

Не по теме:

Спасибо, буду переписывать :)

0
Dragokas
Эксперт WindowsАвтор FAQ
17154 / 7208 / 865
Регистрация: 25.12.2011
Сообщений: 10,987
Записей в блоге: 16
30.06.2017, 18:14 12
Цитата Сообщение от _shark Посмотреть сообщение
В данном случае Илье надо просто написать функцию, сравнивающую все значения объекта из коллекции со значениями объекта-параметра. Или же просто сравнить побайтно два участка памяти.
_shark, в коллекцию добавляется не копия объекта, а ссылка на него.
Следовательно, нет необходимости выверять все поля, если обе объектные переменные ссылаются на одну и ту же область памяти.

Добавлено через 2 минуты
Цитата Сообщение от _shark Посмотреть сообщение
Вообще, я ему ранее советовал не заморачиваться с классами и сделать всё в виде структур. Это помогло бы избежать "косяков" с присваиванием и сравнением, да и сами поля в структурах, по идее, можно инициализировать значениями, просто передавая их "пачкой", как ParamArray и копируя побайтно в структуру.
Да это дело привычки.
Если человек привык работать с классами, то ему так будет легче.
Просто один раз выучить правила.
1
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
01.07.2017, 21:05 13
Цитата Сообщение от Dragokas Посмотреть сообщение
в коллекцию добавляется не копия объекта, а ссылка на него.
Следовательно, нет необходимости выверять все поля, если обе объектные переменные ссылаются на одну и ту же область памяти.
все верно, но у ТС в коде, как я понял, идет проверка "не повторяется ли объект с такими же данными?". Т.е. создается новый объект, поля заполняются переданными значениями, и перед размещением его в коллекции проверяется не существует ли в ней уже объекта с такими же числовыми значениями. Понятное дело, что ссылки в этом случае будут различными
0
Dragokas
Эксперт WindowsАвтор FAQ
17154 / 7208 / 865
Регистрация: 25.12.2011
Сообщений: 10,987
Записей в блоге: 16
01.07.2017, 21:25 14

Не по теме:


м.б., м.б. Я в детали реализации не вникал.



Добавлено через 9 минут
Если реализация действительно должна быть такова, то в этом случае быстрее сравнивать данные, заключённые в структуру.
Можно даже объединить все данные класса в структуру и затем применить функцию RtlCompareMemory на ней.
0
_shark
175 / 175 / 29
Регистрация: 11.10.2016
Сообщений: 566
01.07.2017, 23:02 15
Цитата Сообщение от Dragokas Посмотреть сообщение
Можно даже объединить все данные класса в структуру и затем применить функцию RtlCompareMemory на ней.
именно!. нечто подобное я и имел в виду, когда говорил о побайтном сравнении участков памяти
0
Dragokas
Эксперт WindowsАвтор FAQ
17154 / 7208 / 865
Регистрация: 25.12.2011
Сообщений: 10,987
Записей в блоге: 16
01.07.2017, 23:36 16
Уточню, что я имел в виду, что структуру можно хранить в том же классе. Затем к классу добавить ещё одно свойство, которое будет возвращать структуру по ссылке. Таким образом можно будет сравнить данные двух классов. Единственное, что динамические массивы (если имеются) придётся проверять отдельно.
1
Homarty
136 / 114 / 27
Регистрация: 12.02.2017
Сообщений: 308
02.07.2017, 11:13 17
Тоже посмотрел код, м-мм..., предлагаю автору делать все постепенно, т.е. создать один класс, протестировать и отладить его, затем можно усложнять его (поэтапно) или добавлять, по-одному, другие классы. Лично я, так и делаю, иначе, сужу по своему опыту, ничего не получится. Желаю ТС удачи, терпения и последовательности в действиях.
1
Соколиный глаз
02.07.2017, 11:24  [ТС]     Почему вылетает с ошибкой, а не создает два
  #18

Не по теме:

Благодарю :)

0
02.07.2017, 11:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2017, 11:24
Привет! Вот еще темы с ответами:

Программа вылетает с ошибкой
начал читать Б. Страуструпа "Программирование. Принципы и практика использования C++" Пробую...

Прога вылетает с ошибкой
Здрасте! На диске есть файл AutoDVD.exe (последняя фотка) Его запускаешь и он должен установить...

Программа вылетает с ошибкой
Написал программу (64-bit), очень требовательную к количеству памяти. При запуске считывает...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.