Как работать с массивом

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

Как работать с массивом

Сообщение mrkoder » 11.01.2007 (Чт) 22:06

Забыл как с массивом работать ...как сделать
В заданном массиве a1, a2, … , an найти среднее геометрическое положительных элементов.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 12.01.2007 (Пт) 0:05

Dmitrich

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 12.01.2007 (Пт) 1:46

А автор шустр, однако :)
Успел отметиться как минимум на 3-х форумах.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Viper » 12.01.2007 (Пт) 8:17

Пора ему в баню... Пока не научиться либо кодить сам, либо не увидит раздел Работа
Весь мир матрица, а мы в нем потоки байтов!

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Ответ на вопрос

Сообщение Wolfie » 12.01.2007 (Пт) 20:08

С массивом работать просто:
Код: Выделить всё
Dim Имя(Граница) as Тип 'объявили
Dim Имя() as Тип 'объявили динамич. массив
ReDim Имя(Граница) 'задали границу динамическому массиву

а обращаемся к элементу по индексу:
Код: Выделить всё
Переменная=Имя(Индекс)
И ВСЁ :) перебирать элементы стоит в цикле...
Боюсь только, что это, Вам, автор, не помогло :lol: :lol: :lol:
Но бесплатно решать никто не будет :))
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

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

Сообщение Viper » 13.01.2007 (Сб) 7:17

Wolfie, не забывай, что можно задать и нижнюю границу... хотя автору конечно все это всяко не нужно
Весь мир матрица, а мы в нем потоки байтов!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 10.06.2007 (Вс) 18:31

А реально ли отследить пуст ли динамический массив?

Dim arrD() as Long

Если не пусто как проверить?


П.С. хотел добавить что метод GSerg немного тяжёл для восприятия. Пока же нашёл два выхода: это обрабатывать ошибку и сравнивать Lbound с Ubound, хотя как раз-таки они и возвращают иррор...

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

Сообщение VVitafresh » 10.06.2007 (Вс) 19:10

Как определить: пуст массив или нет?
http://bbs.vbstreets.ru/viewtopic.php?t=17555#134927
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

Сообщение tyomitch » 10.06.2007 (Вс) 20:18

У GSerg-а код проще.
Изображение

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 10.06.2007 (Вс) 21:40

а ещё, может посоветуете, что всё-таки лучше: использовать динамический массив или коллекции?

задача такая:
заполняется листвью, в нём чекятся какие-то записи, потом листвью заполняется другими значениями, там тоже можно почекать какие-то записи... когда я возвращаюсь на предыдущщую страницу листвьюхи, я хочу чтобы восстанвливались чекбоксы, которые выделялись. так вот где лучше хранить индексы записей? уникальные индексы я храню в тагах.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 11.06.2007 (Пн) 10:20

kibernetics писал(а):а ещё, может посоветуете, что всё-таки лучше: использовать динамический массив или коллекции?

Мне кажется, что в твоём случае лучше использовать коллекции, т.к. поиск по ключу исключит перебор всего массива. Но, конечно же, нужно исходить из реального объёма данных, как общего, так и почеканного. При небольших объёмах и редкой смене страниц самый простой метод -- перебор массива может оказаться быстрее более технологичного.

Можно ещё извратиться с отсоединённым RS. Добавить ему поле состояния и в нём хранить почеканность. Т.о. ни создавать левые коллекции/массивы, ни тем более их перебирать не придётся. Потом фильтром выбрать только почеканные и передать их на дальейшую обработку.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.06.2007 (Пн) 11:34

skiperski
да, я много думал, и решил, что всё-таки стоит с тобой согласится, т.к. анчек итема приведёт к тому, что индекс нужно будет удалять из массива, а это наверное проще сделать в коллекции. Определять пуста ли коллекция тоже намного проще.
Единственное, что непонятно, как объявить итемы в коллекции конкретного типа, например As Long. Насколько вообще отличаются в памяти размер динамического массива и размер коллекции с одним и тем же заполением?

П.С. и еще почему-то неработает такая штука
Private colCIDs as Collection

Private Sub Splittering()
Dim sStr As String
sStr = Join(colCIDs, ",") <- Ошибка
End Sub

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 11.06.2007 (Пн) 11:58

Хм, работать и не должно. Это же коллекция, а не массив.

По поводу размера: если мне склероз не изменяет, то в коллекции можно хранить объекты различных типов, соответственно Varian, а массив можно определить конкретного требуемого типа. Т.е. коллекция по определению более ресурсоёмкая. Но возможность быстрого поиска/удаления компенсирует затраты памяти. Тем более хранить что-то в самой коллекции не обязательно, достаточно того, что ты используешь её индекс.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.06.2007 (Пн) 12:14

да...
тупанул я.
а как тогда можно сконкатенировать коллекцию в строку?
перебирать в цикле каждый итем?
Код: Выделить всё
Dim li as Long
Dim sStr As String

For li = 0 To colCIDs.Count
If sStr = vbNullString Then
sStr = colCIDs(li)
Else
sStr = sStr & "," & colCIDs(li)
End if
Next li


:?:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 11.06.2007 (Пн) 12:51

kibernetics писал(а):перебирать в цикле каждый итем?

угу

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

Сообщение VVitafresh » 11.06.2007 (Пн) 14:16

tyomitch писал(а):У GSerg-а код проще.

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

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

Сообщение tyomitch » 11.06.2007 (Пн) 14:56

Воспроизвожу по памяти, разыскивать лень.
Код: Выделить всё
Option Explicit

Private Declare Function VarPtrArray Lib "msvbvm60" Alias "VarPtr" (Arr() As Any) As Long
Private Declare Sub GetMem4 Lib "msvbvm60" (ptr As Any, val As Long)

Sub Main()
Dim a()
    If Peek(VarPtrArray(a)) Then Debug.Print "Массив непустой" ' не напечатается
    ReDim a(1)
    If Peek(VarPtrArray(a)) Then Debug.Print "Массив непустой" ' напечатается
End Sub

Private Function Peek(ByVal Address As Long) As Long
    GetMem4 ByVal Address, Peek
End Function
Изображение

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

Сообщение VVitafresh » 11.06.2007 (Пн) 15:00

Наверное, эта тема?
http://bbs.vbstreets.ru/viewtopic.php?t=6676

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


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

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

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

    TopList