Удаление элемента сложного массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Удаление элемента сложного массива

Сообщение Matew » 06.12.2005 (Вт) 11:38

Подсмотрел на Вбстритс вот такую процедуру:
Код: Выделить всё
Private Sub DelElMas(ByRef nArr() As Element, ByVal nIndex As Integer)
    If UBound(nArr) = nIndex Then
        ReDim Preserve nArr(nIndex - 1)
    Else
        If nIndex < LBound(nArr) Or nIndex > UBound(nArr) Then
            Err.Raise 10, , "Откуда такой индекс?"
        Else
            'Очищаем удаляемый элемент
            Erase nArr(nIndex).pt
'            nArr(nIndex).c = Empty
'            nArr(nIndex).d = vbNullString
            'Смещаем все элементы
            CopyMemory VarPtr(nArr(nIndex)), VarPtr(nArr(nIndex + 1)), (UBound(nArr) - nIndex) * LenB(nArr(0))
            'Мы уже очистили последний элемент(см. выше). Так не дадим же VB еще что-нибыдь очистить!
            ZeroMemory VarPtr(nArr(UBound(nArr))), LenB(nArr(0))
            'Подтираем последний
            ReDim Preserve nArr(UBound(nArr) - 1)
        End If
    End If
End Sub

Но она не работает с массивом вот такого типа:
Код: Выделить всё
Public Type Element
    pt() As POINTAPI
    mastab As Single
    '... несколько as long
End type

Как поправить?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 07.12.2005 (Ср) 2:48

Никак? :(
Вот ссылка:
http://www.vbstreets.ru/VB/Articles/66160.aspx
Там в конце написано:
...очищать следует Variant-переменные(приравнивая их к Empty), String-переменные(приравнивая их именно к vbNullString, а не ""), Object-переменные(приравнивая их к Nothing) и динамические(не статические!) массивы(используя оператор Erease).

А к чему надо приравнивать тип Pointapi?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение alibek » 07.12.2005 (Ср) 8:40

POINTAPI вполне себе фиксированный тип. Только размерность ему надо задавать фиксированную, а не динамическую.
Lasciate ogni speranza, voi ch'entrate.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 07.12.2005 (Ср) 9:11

Так у меня в этом вся и фишка, что этот массив POINTAPI динамический! В той статье написано, что динамичекий массив можно так удалять, тока массивы обычные, т.е. не из юзер-типа сделанные. Нельзя с POINTAPI сделать через копимемори? Придется перебором чтоли? :(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.12.2005 (Ср) 13:09

Там же написано:
динамические(не статические!) массивы(используя оператор Erease)

Так что мешает написать Erase Element.pt :?::?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 08.12.2005 (Чт) 3:08

ANDLL, у меня это в коде есть. Вот:
Код: Выделить всё
...
            'Очищаем удаляемый элемент
            Erase nArr(nIndex).pt
...


Но, так тоже не работает. Почему-то стираются все pt или что-то, что я не понимаю. :(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 08.12.2005 (Чт) 9:57

Приведи-ка полностью код, вместе с инициализацией массива и вызовом функции.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 09.12.2005 (Пт) 4:55

Код: Выделить всё
Public Type Element
    pt() As POINTAPI
    mastab As Single
    lnum as long
    '... несколько as long
End type
dim masElementov() as Element
...
schethik = schethik + 1
    ReDim Preserve masElementov(schethik)
' тут заполняется  masElementov(schethik)

    masElementov(schethik).lnum = lnum
    ReDim Preserve masElementov(schethik).pt(lnum)
' тут заполняется  masElementov(schethik).pt(i) в цикле до lnum
'  когда удаляешь все эменты нет проблем и когда последний тоже нет, а если удалить из середины, то косяк
' удаляю процедурой DelElMas из первого поста

Больше кода привести не получается надо всю базу кидать, а она много весит.
В принципе сделал перебором-работает.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 12.12.2005 (Пн) 7:34

Просто любопытно, да и хотелось бы чтобы красиво было. Никак нельзя поправить??
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 12.12.2005 (Пн) 9:14

Посмотрим
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 13:26

А если дан массив строк, то как я понимаю с такой же легкостью элемент из середины не удалить ?
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение alibek » 15.02.2006 (Ср) 13:35

Если строки фиксированной длины (String*n), то удастся.
Lasciate ogni speranza, voi ch'entrate.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 13:49

Естественно не фиксированной.....
Мда, приравнивание это жестко :roll:
Если всё делать своими ручками, они скоро отвалятся !

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.02.2006 (Ср) 14:53

Kovu писал(а):А если дан массив строк, то как я понимаю с такой же легкостью элемент из середины не удалить ?

Да. Но сначала прировнять удаляемую строку к vbNullString.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.02.2006 (Ср) 14:58

Matew писал(а):Просто любопытно, да и хотелось бы чтобы красиво было. Никак нельзя поправить??

Таксс. Слушай, можеш привести полную демонстрацию, что бы я увидел, где ошибка?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 15:20

ANDLL писал(а):
Kovu писал(а):А если дан массив строк, то как я понимаю с такой же легкостью элемент из середины не удалить ?

Да. Но сначала прировнять удаляемую строку к vbNullString.

Гм, а зачем? Ведь я её тут же приравняю к следующему элементу....
Вот последнюю строку перед ReDim'om да, а тут-то зачем?
Если всё делать своими ручками, они скоро отвалятся !

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.02.2006 (Ср) 15:31

Ты статью читал? Что тебе там не понятно?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 15:40

ANDLL
Статью читал, понял что таким образом можно удалять элементы массива только если они фиксированного размера. Если ты не заметил, у меня массив строк, так что зачем здесь обнулять строку, в которой уже следующим приравниваем будет присвоено новое значение?
Если всё делать своими ручками, они скоро отвалятся !

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.02.2006 (Ср) 15:50

элементы массива только если они фиксированного размера

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

Это где там будет присвеоно новое значение?
Если ты не заметил,

Я заметил, что если люди часто задают вопросы в таком тоне, то они вскоре просто перестают получать каки бы то ни было ответы:)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 15:57

ANDLL писал(а): Я заметил, что если люди часто задают вопросы в таком тоне, то они вскоре просто перестают получать каки бы то ни было ответы:)

Извини, если обидел .
Ну и где ты это читал?

Перечитал ещё раз статью. Где там написано, что CopyMemory свободно может делать сдвиг массива, если все его члены имеют разный размер, ткни меня пожалуйста носом.
Это где там будет присвеоно новое значение?

Это к тому что тут придется обойтись ручным сдвигом массива в цикле :roll:
Если всё делать своими ручками, они скоро отвалятся !

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.02.2006 (Ср) 16:14

Где там написано, что CopyMemory свободно может делать сдвиг массива, если все его члены имеют разный размер, ткни меня пожалуйста носом

Элементы массива всегда имеют одинаковую длину(Если это строки, то длина элементов массива 4 байта). И еще раз повторю, что можно совершенно спокойно использовать мой метод ДЛЯ ЛЮБЫХ МАССИВОВ.
Еще вопросы?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 16:22

ANDLL
Спасибо за разъяснение, извиняюсь за грубость.
Если всё делать своими ручками, они скоро отвалятся !

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 16:54

*cut*
Последний раз редактировалось Kovu 15.02.2006 (Ср) 17:22, всего редактировалось 1 раз.
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение tyomitch » 15.02.2006 (Ср) 17:12

Kovu, как объявлена CopyMemory?
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 15.02.2006 (Ср) 17:23

tyomitch
Спасибо
Второй параметр забыл как ByVal :oops:
Если всё делать своими ручками, они скоро отвалятся !


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 100

    TopList