Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/198: Рейтинг темы: голосов - 198, средняя оценка - 4.92
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
1

Как проверить пуст ли массив?

22.07.2015, 09:47. Показов 35957. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
это продолжение темы. интересует грамотность записи
Visual Basic
1
If Массив(0) = "" Then ' вот эта проверка мне кажется неграмотная
Добавлено через 1 минуту
Еще интересно: как его грамотно начать заполнять. Так чтобы не было нулевой позиции в начале и постоянной проверки на ее заполненность в последующем
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2015, 09:47
Ответы с готовыми решениями:

Как грамотно проверить: пуст ли массив?
Создал массив, инициализировал его. Нужно его заполнить сведениями из другого массива, который...

Как проверить, что выбранный диапазон ячеек пуст
Такой вопрос: есть такой код: Dim r As Range With Sheets("data1").Columns(Target.Column -...

Как проверить в с++ пуст файл или нет?
Добрый день! Мне нужно написать программу, которая после открытия файла делает проверку, пуст этот...

Как проверить пуст или нет буфер обмена?
Есть острая необходимость проверить пуст или нет БО. Как это можно сделать средствами vb.net?...

42
3917 / 2315 / 784
Регистрация: 02.11.2012
Сообщений: 6,158
22.07.2015, 10:13 2
Цитата Сообщение от AndreA SN Посмотреть сообщение
чтобы не было нулевой позиции
перед внесением проверять.
если ячейка не пустая то вносим значение в массив.
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
22.07.2015, 11:12  [ТС] 3
Vlad999, согласен. Я постоянно так и делаю. Но проверять постоянно есть-ли запись в первой строке - это увеличение операций по заполнению массива в 2 раза. Вот я и спрашиваю: какие технологии заполнения массивов спецами используются. Чтобы не было лишних проверок состояния массива на "полный, пустой"
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 796
22.07.2015, 11:53 4
Трудно что-то советовать, когда не видно как Вы этот массив заполнять собрались.
Есть определенные костыли, чтобы проверить является ли переменная массивом и есть ли в нем хоть какое-то значение. Но здесь большую роль играет и то как переменная массива была объявлена - как массив
Dim Arr()
или как переменная типа Variant
Dim Arr
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
22.07.2015, 12:37  [ТС] 5
The_Prist, привожу пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
For i = 0 to дофига ' это цикл внешних проверок
Dim garbV As Long, is_ As Long
      varGarbagCombo = mc1.VarGARBAG_POST ' получаю данные из другого массива
      garbV = UBound(varGarbagCombo)
      For is_ = 0 To garbV
           If Iskl2(0) = "" Then ' вот эта проверка мне кажется неграмотная
                Iskl2(0) = varGarbagCombo(is_)
           Else 
                ReDim Preserve Iskl2(UBound(Iskl2) + 1) 
                Iskl2(UBound(Iskl2)) = varGarbagCombo(is_) 
           End If 
      Next is_
Next i
В первой части If заполняю первую позицию массива, а в части Else - постоянно проверяю на заполненность первую строку. Вот эта необходимость постоянной проверки вызывает вопрос.
Рабочий массив постоянно обновляется и дополняется частью глобального массива. Проводятся какие-то операции, потом рабочий массив очищается и снова всё повторяется. Вот такие циклы заполнения исчисляются десятками и сотнями тысяч. Соответственно число операций по проверке удваивает эту величину. И наворачивает код
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 796
22.07.2015, 12:50 6
Лучший ответ Сообщение было отмечено AndreA SN как решение

Решение

И все же не видно как объявлен этот массив. Где строка объявления Iskl2?
Он как объявлен?
dim Iskl2()? Или иначе?
В общем случае куда грамотнее завести отдельную переменную-счетчик
dim Iskl2_Cnt as Long
и потом просто её увеличивать:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim Iskl2_Cnt as Long
Dim garbV As Long, is_ As Long
For i = 0 to дофига ' это цикл внешних проверок
      varGarbagCombo = mc1.VarGARBAG_POST ' получаю данные из другого массива
      garbV = UBound(varGarbagCombo)
      For is_ = 0 To garbV
            ReDim Preserve Iskl2(Iskl2_Cnt) 
            Iskl2(Iskl2_Cnt) = varGarbagCombo(is_)
            Iskl2_Cnt = Iskl2_Cnt + 1
      Next is_
Next i
1
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
22.07.2015, 13:00  [ТС] 7
The_Prist, извиняюсь... проглядел ответный вопрос об объявлении массива
уточняю объявление
Visual Basic
1
Dim Iskl2() As String
в связке с этим вопросом интересует просто вопрос грамотной проверки массива на непустотность

Добавлено через 2 минуты
кстати. Спасибо за ответ для общего случая. Это, наверное, самый понятный мне подход...
0
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
22.07.2015, 13:44 8
Смотря что считать пустым массивом...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim arr() As String
'сейчас массив пустой
redim arr(0)
'теперь уже не пустой
erase arr
'снова пустой
If Not Not arr Then
  Debug.Print "Not Empty"
Else
  Debug.Print "Empty"
End If
2
4079 / 1459 / 401
Регистрация: 07.08.2013
Сообщений: 3,649
22.07.2015, 13:51 9
а массивы большие
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
22.07.2015, 13:52  [ТС] 10
Dragokas, спасибо)))
Самая крутая сводка пустых-непустых массивов)))
0
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
22.07.2015, 14:31 11
AndreA SN, только не забывайте, что результат операции - это не BOOL, а указатель на SAFEARRAY.
Так, что если нужно проверить на "Empty", пишем:

Visual Basic
1
If Not Cbool(Not Not arr) Then Debug.Print "Empty"
2
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
22.07.2015, 14:45  [ТС] 12
snipe, опять же смотря из какого объема действий исходить.
вот две обработки одного и того же суммирования
Visual Basic
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 Sub Вложенность_циклов()
    Dim ndd, t, ewq, s
ndd = 1000
 
    DoEvents: t = Timer
    For idd = 1 To ndd
        For h = 1 To 6000
            s = s + 1
        Next h
    Next idd
    ewq = Timer - t
Debug.Print ewq, s
s = 0
    DoEvents: t = Timer
    For idd = 1 To ndd
        For h = 1 To 20
        For hh = 1 To 20
        For hhh = 1 To 15
            s = s + 1
        Next hhh
        Next hh
        Next h
    Next idd
    ewq = Timer - t
Debug.Print ewq, s
 
End Sub
в итоге получаем за счет суммирования 6000000
Но!
У меня по времени получилась разница в 1,5 раза
0,15625 6000000
0,2617188 6000000

а по максимальному размеру цикла - читай по Ubound(массив) разница составила 300 раз...
Хотя я понимаю, что мне сейчас выставят произведение размеров как конечное количество действий
но речь в данном случае всё таки о размерах обрабатываемой информации в зависимости от сложности шага обработки...

Добавлено через 13 минут
Dragokas,
Цитата Сообщение от Dragokas Посмотреть сообщение
If Not Cbool(Not Not arr) Then
очень прошу (хотя понимаю, что мой вопрос кошмарит грамотных людей), объяснить все эти Not понятным языком - что за что отвечает.
0
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
22.07.2015, 22:31 13
Лучший ответ Сообщение было отмечено AndreA SN как решение

Решение

AndreA SN, да. Вы правы. Перемудрил. Можно проще.

Visual Basic
1
2
if -1 = not arr then debug.? "Empty"
if -1 <> not arr then debug.? "not Empty"
Если кратко, то оператор Not кроме основной функции (побитовое отрицание) умеет разыменовывать указатель,
что он и делает. Если указатель нулевой (т.е. массив неинициализирован), тогда Not 0 = -1.
1
4079 / 1459 / 401
Регистрация: 07.08.2013
Сообщений: 3,649
23.07.2015, 04:02 14
AndreA SN, есть 2 функции Join и Split
первая собирает массив в текстовую переменную а вторая наоборот разбирает текстовую переменную в массив
если текстовая переменная выдержит то работать по идее это должно быстрее
вы ведь пытаетесь из много массивов сделать один
код будет выглядеть примерно так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
dim asd as string
for i=1 to m' где m количество массивов
' тут строка с проверкой массива на пустоту и если не пустой то
if asd="" Then
asd=Join(dfg(),"*")' где dfg имя массива
else
asd=asd & "*" & Join(dfg(),"*")
end if
next i
dim a() as string
a=Split(asd,"*")
1
4079 / 1459 / 401
Регистрация: 07.08.2013
Сообщений: 3,649
23.07.2015, 04:09 15
Dragokas,
в коде VBA номера строк сползают вверх относительно текста строк
Миниатюры
Как проверить пуст ли массив?  
0
Эксперт NIX
3220 / 887 / 195
Регистрация: 14.01.2013
Сообщений: 4,373
23.07.2015, 06:54 16
В Опере всё норм выглядит.
Миниатюры
Как проверить пуст ли массив?  
1
snipe
23.07.2015, 09:01
  #17

Не по теме:

так я тоже в опере делал

0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
23.07.2015, 10:54  [ТС] 18
snipe,
Цитата Сообщение от snipe Посмотреть сообщение
из много массивов сделать один
нет... у меня задача другая... я делаю маленький реплик-массив из большого массива. причем оба они двумерны. реплик-массив как правило варьирует от 2 до нескольких десятков записей (встречаются редко случаи и до 2500), а большой массив может включать десятки тысяч записей. Постоянная перезапись реплик-массива с изменяющимися исходными условиями вынуждают при последующей работе проверять : а записалось ли чего-то в реплик-массив, или он при изменившихся условиях отбора записей остался пустым? Вот последнее хочется грамотно проверять, что Dragokas и подсказал как делать.

Добавлено через 11 минут
snipe, по поводу строчек... у меня в Chrom всё вроде норм выглядит
0
4079 / 1459 / 401
Регистрация: 07.08.2013
Сообщений: 3,649
23.07.2015, 11:01 19
AndreA SN, вы тему разместили в разделе VBA, а в какой программе вы все это делаете?
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
23.07.2015, 11:25  [ТС] 20
snipe, толковый вопрос))) мне уже столько людей у виска пальцем крутит по поводу моего проекта в VBA))) И Вы почуяли, что моя задача монстрифицирована.
Пишу всё в Excel. Начиналось как побочная группа минимакросов по предварительной обработке данных. Разрослось до масштабного проекта по верификации сведений с функцией минимизации влияния "шаловливых ручек". В итоге на стадии завершения программа-прототип.
Конечный продукт будет рисоваться в Шарпее.

Добавлено через 9 минут
Просто почему VBA:
1. Если на VBA будет быстрей - то на шарпее будет летать аки бчёл!
2. excel - замечательный полигон для отладки работы с двумерными базами данных при сложном аналитическом инструментарии. Я вижу что происходит с данными и соответственно отлаживаю инструменты поиска
3. размечаю в цвете измененные позиции - получается учет изменений для оценки объемов корректировок
4. не нужно специального программного обеспечения - работаю на 5 машинах в разное время - нигде не ставлю шарпик
это быстрый список причин - почему VBA.
0
23.07.2015, 11:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 11:25
Помогаю со студенческими работами здесь

Проверить, пуст ли файл
Как можно проверить пустоту файла? Поиск юзал. Добавлено через 17 минут fstream f;...

Проверить пуст ли Listbox
Добрый день! Помогите, пожалуйста. На форме есть список (listbox) по нажатию кнопки происходит...

Списки. Не могу проверить, пуст ли список
Здравствуйте. Пишу лабу по прологу. Задание такое вывести список Пьес. Я написал код но в нем есть...

SQL через ODBC: проверить перед вытаскиванием sqlread[0] что столбец не пуст
Имеется БД Access, беру оттуда строки. OdbcConnection connect = new...


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

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