Ручное заполнение массива двумерного динамического

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Ручное заполнение массива двумерного динамического

Сообщение R » 14.08.2007 (Вт) 7:00

Как заполнить двумерный массив если неизвестен заранее размер массива ? Я пытался через ReDim Presereve код становится каким то сложным... Мне кажется наверное есть путь легче... Внизу выкладываю свой код... там постоянно вылетает ошибка ... Хотя все должно работать.

Dim Array()
Dim i,j,s,s1
Dim WshSHel

Set WshShel=CreateObject("Wscript.Shell")
i=0
j=0
Redim Preserve Array(i,j)
For i=1 to 2
For J=1 to 2
If j=Ubound(Array,2) then
Redim Preserve Array(i,j)
End If
S1="Введите элемент в "&i&"-ую строку "&j&"-й столбец."
s=InputBox(s1, "окно для ввода пароля Элементов")
Array(i,j)=s
Next
Next

For i=1 to 2
For J=1 to 2
WshShel.PopUp Array(i,j)
Next
Next

Wscript.Quit

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.08.2007 (Вт) 7:27

Еще бы она не вылетала, вот здесь
Код: Выделить всё
i=0
j=0
Redim Preserve Array(i,j)

ты делаешь массив размером 1 на 1 элемент. Вот здесь
Код: Выделить всё
If j=Ubound(Array,2) then

пытаешься сравнить верхнюю гранизу массива, равную в твоем случае 0 с j, которая может быть 1 или 2, естественно получаешь False и на ReDim не идешь. Далее, вот здесь:
Код: Выделить всё
Array(i,j)=s

пытаешься присвоить значение элементу массива явно няходящемуся за его границами.

Вопрос, собственно, что сделать то надо? А то из кода это совершенно непонятно.

З.Ы. Зацени теги code и делай отступы в коде
Весь мир матрица, а мы в нем потоки байтов!

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 7:40

Вопрос, собственно, что сделать то надо? А то из кода это совершенно непонятно.


Я пытаюсь сделать подпрограмму для заполнения массива 2-х мерного.
Для этого сначала пытаюсь отдельный код наварить.... Пытался сходу подпрограмму сделать- неполучилось. Просто с 2-х мерными динамическими никогда не работал.
Код я переделал, учитывая твои замечания:
Код: Выделить всё
Dim Array()
Dim i,j,s,s1
Dim WshSHel

Set WshShel=CreateObject("Wscript.Shell")
i=0
j=0
Redim Preserve Array(i,j)
For i=1 to 2
    For J=1 to 2
   If j=Ubound(Array,2)+1 then
                           Redim Preserve Array(i,j)
   End If
   S1="Введите элемент в "&i&"-ую строку "&j&"-й столбец."
   s=InputBox(s1, "окно для ввода пароля Элементов")
   Array(i,j)=s
   Next     
Next

For i=1 to 2
    For J=1 to 2
   WshShel.PopUp Array(i,j),3
   Next     
Next

Wscript.Quit


Только насчет
Код:
Array(i,j)=s

пытаешься присвоить значение элементу массива явно няходящемуся за его границами.

Непонятно... i=1, j=1 пусть присваивает... что то непойму...

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 8:19

Извиняюсь, но прграмма исправленная вообще теперь не запускается... Комманда Redim Preserve что то ему не нравится, которая внултри вложенных циклов... Для одномерных массивов все работает для 2-х мерных что то стопорится...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 14.08.2007 (Вт) 8:40

MSDN писал(а):If you use the Preserve keyword, you can resize only the last array dimension and you can't change the number of dimensions at all. For example, if your array has only one dimension, you can resize that dimension because it is the last and only dimension. However, if your array has two or more dimensions, you can change the size of only the last dimension and still preserve the contents of the array.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 8:59

Не совсем понял смысл... Я могу менять только длину последней размерности ? Или я могу менять длину только одной размерности в течении всего скрипта ?
Какое то ограничение несправедливое. Как тогда быть если незнаешь количесвто строк заранее у 2-х мерного массива ? Как тогда с ним работать ?
Последний раз редактировалось R 14.08.2007 (Вт) 9:04, всего редактировалось 1 раз.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 14.08.2007 (Вт) 9:04

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

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 9:05

Какое то ограничение несправедливое. Как тогда быть если незнаешь количесвто строк заранее у 2-х мерного массива ? Как тогда с ним работать ? Как тогда его заполнять данными, незная количество сттрок заранее ?

Кто нибудь может тогда дать пример кода для заполнения массива с фиксированным количеством строк и изменением числа столбцов ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 10:26

Можно сделать массив массивов.
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 14.08.2007 (Вт) 11:51

Может такой вариант устроит R?
Код: Выделить всё
Dim Matrix() As Long
Dim i As Long, j As Long, s As Long
Dim s1 As String

Dim x As Long ' столбцы
Dim y As Long ' строки

x = Val(Text2.Text) - 1 ' столбцы
y = Val(Text1.Text) - 1 ' строки

ReDim Matrix(y, x)

For i = 0 To y
   For j = 0 To x
        s1 = "Введите элемент в " & i + 1 & "-ую строку,  " & j + 1 & "-й столбец."
        s = InputBox(s1, "окно для ввода пароля элементов")
        Matrix(i, j) = s
        Debug.Print s;
   Next
   
   Debug.Print " "

Next
O, sancta simplicitas!

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 12:07

Не устраивает... Тут тебе опять приходится задавать переменные Х и У. А у меня скрипт который подрубается к журналам безопасности компов и считывает данные в массив. В моем случае имя ПК, ЛогИн пользователя, время и дату... Разумеется предварительно выяснив включен ли ПК в сети. Поэтом размер массива заранее не известен. В первую строку записывается данные первого ПК, в 1-й столбец имя Пк, во 2-й дата, в 3-й время, в 4-й .. В следующую строку данные 2-го ПК.. и пошло.... Некотрые ПК будут выключены поэтому и число строк будет меняться... Щас попробую сам сварить код.... Выложу тут..

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 14.08.2007 (Вт) 12:19

Ха! В таком разе проще всего заюзать UDT!

Код: Выделить всё
Type CompStatus
   cName As String
   cDate As Date
   cTime As Long
   ...
   ' перечислить сохраняемые параметры
End Type

Dim Computers() As CompStatus
O, sancta simplicitas!

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 12:25

Я для WSH скрипт пишу. VBS скрипт. Если там возможно определить массив элементами которого являлись бы массивы.... Никто не знает как это делать в WSH ?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 14.08.2007 (Вт) 12:30

Тогда альтернативный вариант - заранее объявить двухмерный массив достаточного размера?..
O, sancta simplicitas!

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 12:40

Значит так.... буду тупо жестко размер задавать...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 13:47

R писал(а):Я для WSH скрипт пишу. VBS скрипт. Если там возможно определить массив элементами которого являлись бы массивы.... Никто не знает как это делать в WSH ?

Код: Выделить всё
v = Array(Array(1, 2, 3), Array(4, 5, 6))
Изображение

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 14.08.2007 (Вт) 13:49

Код: Выделить всё

Dim compInfo()
Dim cols
Dim rows
Dim N
Dim i

cols = 4 'количество параметров (Имя ПК, Логин и т. д.)
rows = 1 'изначально 1 строка
N = 5

ReDim compInfo(cols,rows)


For i = 1 to N 'N-количество компов
    'если комп № i включен, то:
    rows = rows + 1
    ReDim Preserve compInfo(cols,rows)
    compInfo(0, rows) = "Имя ПК"
    compInfo(1, rows) = "Лигин"
    compInfo(2, rows) = "Дата"
    compInfo(3, rows) = "Время"
Next


Вот так работает без ошибок
Последний раз редактировалось burik 14.08.2007 (Вт) 14:03, всего редактировалось 1 раз.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 13:53

А определив данным образом массив - я смогу менять его и подмассивы через комманду ReDim Preserve ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.08.2007 (Вт) 13:58

Конечно.
Но ReDim Preserve можно применять только для последнего измерения массива.
Lasciate ogni speranza, voi ch'entrate.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 14.08.2007 (Вт) 14:05

R
А мой вариант не подходит?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 14:09

Для массива массивов можно применять ReDim Preserve к любой строке независимо от остальных, плюс можно им добавлять--удалять строки.
Изображение

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 14:13

R
А мой вариант не подходит?


Вроде подходит.

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 14:25

Тогда следующий вопрос.... Пробежит цикл - присваивая ячейкам массива имена ПК. А некоторые ячейки будут пустыми....потому что не все ПК включены - как мне их потом находить ? Т.е. какой оператор существует для нахождения таких ячеек пустых ? там ведь не ноль - там пустота...
Вроде есть какой то оператор IsNull(). Он подойдет ?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 14.08.2007 (Вт) 14:55

Если это строки, присваивай :
Код: Выделить всё
sVar=""    'Пустые двойные кавычки

Ну и находить точно так же.
Код: Выделить всё
If sVar="" Then ...


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

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 14.08.2007 (Вт) 16:33

R писал(а):А некоторые ячейки будут пустыми....потому что не все ПК включены - как мне их потом находить ?

Так может лучше вообще не добавлять в массив выключенные компы?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.08.2007 (Вт) 16:37

tyomitch писал(а):Для массива массивов можно применять ReDim Preserve к любой строке независимо от остальных, плюс можно им добавлять--удалять строки.

Ты хочешь сказать, что такое допустимо?
Код: Выделить всё
Dim A()
ReDim A(1 To 2, 1 To 3)
A(1,1) = Array(...)
A(1,2) = Array(...)
...
A(2,3) = Array(...)
...
ReDim Preserve A(1 To 5, 1 To 4)
Lasciate ogni speranza, voi ch'entrate.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 14.08.2007 (Вт) 16:44

А если делать массив массивов, то зачем этот массив делать двухмерным? Если сделать одномерный массив (массив строк), каждым элементом которого является одномерный массив (массив ячеек), то получится таблица. Или я не прав?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 17:12

burik прав, alibek нет :-)
Изображение

R
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 14.08.2007 (Вт) 6:31

Сообщение R » 14.08.2007 (Вт) 19:23

Так может лучше вообще не добавлять в массив выключенные компы?


Вот так и собираюсь делать.

Только получается что последние строки массива остануться незаполненными.
Т.е. в моем случае массив будет 100X20 элементов. Если будут включены 60 компов, то заполняться только первые 60 строк. А дальше мне надо будет считать усредненное время включения ПК.

И как мне исключить из раасчета последние пустые элементы ?

Существует ли функция которая определяет пустоту элемента массива ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 19:38

IsEmpty существует.
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 92

    TopList