powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создать массив
17 сообщений из 17, страница 1 из 1
Создать массив
    #32863181
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!!
Народ, помогите создать процедуру, которая добавляет в массив каждую входящую переменную (Name) до тех пор, пока еще один входящий параметр (ID) у всех одинаковый.... Если ID новый, то массив обнуляем и начинаем новый...
...
Рейтинг: 0 / 0
Создать массив
    #32863280
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то вроде этого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public Sub a(NEwID as integer, Name as string) 

static ID as integer
static iCounter as interger
Dim myarr() as string

if NEwId = ID THen
	ID = NEwID
	clear myarr
	iCounter =  0 
End if


Redim Preserve myarr(iCounter)
myarr(iCounter) = Name
iCounter = iCounter+ 1 

End Sub

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


Magnus
...
Рейтинг: 0 / 0
Создать массив
    #32863656
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Sub GenerateTown(NEwID, Name)

Dim ID, iCounter
Dim myarr()

if NEwId = ID Then
	ID = NEwID
	clear myarr
	iCounter =  0 
End if

Redim Preserve myarr(iCounter)
myarr(iCounter) = Name
iCounter = iCounter+ 1 
MsgBox(join(myarr, " "))
End Sub

Почему-то у меня в MsgBox не выводится все данные массива, у который NEwID одинаковый....
У меня в MsgBox попадает только последнее значение...
Подскажите, что тут не так?
Подскажите,
...
Рейтинг: 0 / 0
Создать массив
    #32863678
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в объявлении переменных не указаны типы?

Вам же человек показал, как правильно :-).

Так они объявляются как Variant, что не есть зашибись...
...
Рейтинг: 0 / 0
Создать массив
    #32863680
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Sub GenerateTown(NEwID, Name)

Dim ID, iCounter
Dim myarr()

if NEwId <> ID Then
	ID = NEwID
	clear myarr
	iCounter =  0 
End if

Redim Preserve myarr(iCounter)
myarr(iCounter) = Name
iCounter = iCounter+ 1 
MsgBox(join(myarr, " "))
End Sub

Напуршил немного :). В условии знак "неравенство" должен быть.

Magnus
...
Рейтинг: 0 / 0
Создать массив
    #32863701
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторOption Explicit

Dim iCounter As Long, id As Long
Dim myarr() As String

Private Sub Command1_Click()

id = 1
GenerateTown 1, "Áëèí"
GenerateTown 1, "Åùå áëèí"
GenerateTown 1, "Îïÿòü áëèí"
GenerateTown 2, "¨-ìî¸"

End Sub

Public Sub GenerateTown(NEwID, Name)

If NEwID <> id Then
MsgBox (Join(myarr, " "))
id = NEwID
Erase myarr
iCounter = 0
Else
ReDim Preserve myarr(iCounter)
myarr(iCounter) = Name
iCounter = iCounter + 1
End If
End Sub
...
Рейтинг: 0 / 0
Создать массив
    #32863710
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз :-).

Каждый раз при вхождении в процедуру счетчик массива обнуляется... Вот одно слово и остается. Да и про неравенство точно... Ну и еще кое-что :-).

Код: plaintext
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.
Option Explicit

Dim iCounter As Long, id As Long
Dim myarr() As String

Private Sub Command1_Click()

id =  1 
GenerateTown  1 , "Блин"
GenerateTown  1 , "Еще блин"
GenerateTown  1 , "Опять блин"
GenerateTown  2 , "Ё-моё"

End Sub

Public Sub GenerateTown(NEwID, Name)

If NEwID <> id Then
    MsgBox (Join(myarr, " "))
    id = NEwID
    Erase myarr
    iCounter =  0 
Else
    ReDim Preserve myarr(iCounter)
    myarr(iCounter) = Name
    iCounter = iCounter +  1 
End If
End Sub

...
Рейтинг: 0 / 0
Создать массив
    #32863711
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, точно :). Erase перепутал и Esle забыл :)

Magnus
...
Рейтинг: 0 / 0
Создать массив
    #32863805
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромная просьба!
Дурак (хотя похоже ты совсем не дурак),
а ты можешь написать небольшие коммертарии к этой функции, чтобы мне разобраться что где происходит!
...
Рейтинг: 0 / 0
Создать массив
    #32863837
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, а как мне поставить ограничение, что если Name уже такой существует в мессиве, то не записывать его повторно?
...
Рейтинг: 0 / 0
Создать массив
    #32863916
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поможет функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function Find_it_(ByVal Искомое As String) As Long
   Dim i As Long
   Find_it_ = - 1 
   For i = LBound(myarr) To ubound(myarr)
      If Искомое = myarr(i) Then
         Find_it_ = i
         Exit For
      End if
   Next
End Function
...
Рейтинг: 0 / 0
Создать массив
    #32863961
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то выдается ошибка на эту строчку:
Код: plaintext
For i = LBound(myarr) To ubound(myarr)

Пишет: "Индекс выходит за предел допустимого диапазона 'LBound'"

Подскажите, что тут нужно подправить?
...
Рейтинг: 0 / 0
Создать массив
    #32863996
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kikaОгромная просьба!
Дурак (хотя похоже ты совсем не дурак),
а ты можешь написать небольшие коммертарии к этой функции, чтобы мне разобраться что где происходит!


Спасибо за комплимент :-)!

По поводу разобраться - лучше всего
сделать форму, добавить туда кнопку, кликнуть на нее, добавить в модуль
формы весь текст и по F8 прогнать в Debugger'е - получишь неоценимый опыт :-). Ручаюсь - разберешься на 100%.


авторПишет: "Индекс выходит за предел допустимого диапазона 'LBound'"

Означает, что в массиве еще нет ни одного элемента.
Нужно сначала проверить, есть ли там элементы и не гонять функцию по пустому массиву...
...
Рейтинг: 0 / 0
Создать массив
    #32864005
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
' данная опция запрещает использование необъявленных переменных
Option Explicit

' объявление глобальных переменных
' счетчик, переменная для хранения последнего id
Dim iCounter As Long, id As Long
' массив
Dim myarr() As String

Private Sub Command1_Click()
' первоначальное значение id = 1
id =  1 

' добавляем элементы
GenerateTown  1 , "Блин"
GenerateTown  1 , "Еще блин"
GenerateTown  1 , "Опять блин"
GenerateTown  2 , "Ё-моё"

End Sub

Public Sub GenerateTown(NEwID, Name)
' если id не соответсвует старому - выводим результат и обнуляем массив
If NEwID <> id Then
    MsgBox (Join(myarr, " "))
    id = NEwID
    Erase myarr
    iCounter =  0 
Else ' иначе - добавляем в массив новый элемент
    ReDim Preserve myarr(iCounter)
    myarr(iCounter) = Name
    iCounter = iCounter +  1 
End If
End Sub
' все, я иссяк :-). И ухожу домой.
' да... забыл. Все удовольствие запускается по клику кнопки Command1
...
Рейтинг: 0 / 0
Создать массив
    #32864008
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Во, точно :). Erase перепутал и Esle забыл :)


Дык я же не в блокноте это делал :-)
...
Рейтинг: 0 / 0
Создать массив
    #32864709
kika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю так:


Код: plaintext
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.
Public Sub GenerateTown(NEwID, Name)
If NEwID <> id Then
    MsgBox (Join(myarr, " "))
    id = NEwID
    Erase myarr
    iCounter =  0 
Else
    ReDim Preserve myarr(iCounter)
    myarr(iCounter) = Name
    iCounter = iCounter +  1 
End If
End Sub



Function CheckTown (ByVal TownName)
   Dim i
   CheckTown = - 1 
   For i = LBound(myarr) To ubound(myarr)
      If TownName = myarr(i) Then
         CheckTown = i
         MsgBox (CheckTown)
         Exit For
      End if
   Next
End Function



Sub...
..............
Dim ParentName, ParentID

If len(Join(myarr, ""))> 0  Then
    If CheckTown(ParentName)= 0  then
         GenerateTown ParentID, ParentName
    End If
ElseIf len(Join(myarr, ""))= 0  Then
         GenerateTown ParentID, ParentName
End If
.............
End Sub


Но почему-то данные все равно дублируются...
В чем тут может быть проблема?
...
Рейтинг: 0 / 0
Создать массив
    #32864797
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
'вместо
    If CheckTown(ParentName)=0 then
'надо
If CheckTown(ParentName) <  0  then
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создать массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]