purebasic.info

PureBasic forum
Текущее время: Пн сен 16, 2019 1:54 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Ср ноя 18, 2015 11:43 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Использовать List не катит? Там можно удалять по индексу

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 18, 2015 11:53 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
а я так и не понял в чем разница между массивами и листами... в моем случае массив сложный. есть в структуре цифровые значения, есть текст, и есть даже массив в массиве... и частично это дело выводится в листиконгаджет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 12:41 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11515
Благодарил (а): 4 раз.
Поблагодарили: 470 раз.
SereZa писал(а):
а я так и не понял в чем разница между массивами и листами...
https://ru.wikipedia.org/wiki/Динамический_массив
https://ru.wikipedia.org/wiki/Связный_список

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 6:58 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 17 раз.
Пункты репутации: 10
SereZa писал(а):
теперь понадобилось удалить какую-то ячейку из массива.

Красивого способа я не знаю, а с извращениями, то можно через
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim ar1.b(10)
Dim ar2.b(9)
 
For i=0 To 10
  ar1(i)=i
Next
 
Debug "Исходный массив"
 
For i=0 To 10
  Debug ar1(i)
Next
 
CopyMemory(@ar1(0), @ar2(0), 3)
CopyMemory(@ar1(4), @ar2(3), 7)
 
Debug "Новый массив"
 
For i=0 To 9
  Debug ar2(i)
Next


_________________
.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 7:09 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 882
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
тут я про массивы выкладывал, может на этой основе чего слепишь, это всё для простого массива писалось
viewtopic.php?t=4200&p=80492#p80492


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 12:36 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11515
Благодарил (а): 4 раз.
Поблагодарили: 470 раз.
SereZa писал(а):
теперь понадобилось удалить какую-то ячейку из массива
SereZa писал(а):
а я так и не понял в чем разница между массивами и листами
Удаление из списка второго элемента.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NewList people()
 
AddElement(people()) : people() = 1
AddElement(people()) : people() = 2
AddElement(people()) : people() = 3
AddElement(people()) : people() = 4
 
ForEach people()
  Debug people()
Next
 
Debug ""
 
SelectElement(people(), 1)
DeleteElement(people())
 
ForEach people()
  Debug people()
Next


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 4:13 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
о! извращения мне подходят. выглядит здорово, и даже я вроде понял что к чему... НО! сможет ли верно копироваться массив, если структура сложная?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
   Structure R300ArrayStructure  
     priznak$  
     matem.optionsII[8]
     vidpi$  
   EndStructure
 
   Structure R300ArrayStr  
     god.i
     Array posinreestr.R300ArrayStructure(0)
   EndStructure
 
   Global Dim ar1.R300ArrayStr(1)
 
CopyMemory(@ar1(0), @ar2(0), 3)
CopyMemory(@ar1(4), @ar2(3), 7)



и я так полагаю в конце такого копирования нужен будет редим массива на минус 1 от размера массива?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 4:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
Пётр, я так полагаю что лист напоминает хмл? типа как в хмл идут друг за другом поля значений, так и в листе? за исключением что в листе можно обратится по номеру, а в хмл придется делать перебор друг за другом?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 4:35 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
SereZa писал(а):
а я так и не понял в чем разница между массивами и листами... в моем случае массив сложный. есть в структуре цифровые значения, есть текст, и есть даже массив в массиве... и частично это дело выводится в листиконгаджет.

Все то же самое можно творить с листами. К примеру
Код:
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
  Structure stuct
    a.s
    b.l
    c.s[10]     ; Строковый массив
  EndStructure
 
  Structure Programmer
    Name.s                 ; Строка
    Strength.b             ; Числа
    Array1.b[10]           ; Числовой массив
    try.stuct              ; Структура
  EndStructure
 
  NewList Programmers.Programmer()  ; The list for storing the elements
 
  *Element.Programmer = AddElement(Programmers())
  If *Element<>0
    *Element\Name = "Dave"
    *Element\Strength = 3
    For i = 0 To 9
      *Element\Array1[i] = Random(100, 0)
    Next
    For i = 0 To 9
          s$ = ""
          For j = 1 To 6
            s$ + Chr(Random(122,97))
          Next j
      *Element\try\c[i] = s$
    Next
  Else
    MessageRequester("Error!", "Unable to allocate memory for new element", #PB_MessageRequester_Ok)
  EndIf
 
  For i = 0 To 9
    Debug *Element\Array1[i]
  Next i  
 
  For i = 0 To 9
    Debug *Element\try\c[i]
  Next i  
 



Разница с массивом то, что в листе перемещаться\следить за указателем на текущий элемент нужно при помощи функций (FirstElement(), LastElement(), SelectElement
()) а в массиве при помощи индекса. Это то что на первый взгляд. А так, плюсов у листа против массива поболе будет

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 4:56 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
в случае с памятью я так понимаю что можно обойтись и без временного второго массива?
CopyMemory(@ar1(4), @ar1(3), 7)
то есть копировать самого в себя? :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 6:35 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
я так понимаю что с памятью затык?
Код:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Enumeration
  #Win
 
  #ListIcG
EndEnumeration
 
Structure strarr
  num$
  data1.i
  data2.i
EndStructure
 
Global Dim MainArr.strarr(600)
 
For i = 0 To 600
  MainArr(i)\num$ = RSet(Str(i+2), 8, "0")
  MainArr(i)\data1 = i
  MainArr(i)\data2 = i
Next
 
  If CreatePopupMenu(2)
     MenuItem(1, "Удалить")
  EndIf
 
Procedure FillListIc()
 
  ClearGadgetItems(#ListIcG)
 
  For i = 0 To ArraySize(MainArr())
    MainArr(i)\num$ = RSet(Str(i+2), 8, "0")
    AddGadgetItem(#ListIcG, -1, Str(Val(MainArr(i)\num$))+Chr(10)+MainArr(i)\data1+Chr(10)+MainArr(i)\data2)
  Next
 
EndProcedure
 
 
  If OpenWindow(#Win, 0, 0, 500, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
    ListIconGadget(#ListIcG,  10,  10, 480, 280, "num", 60, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#ListIcG, 1, "data1", 100)
    AddGadgetColumn(#ListIcG, 2, "data2", 100)
   
    FillListIc()
 
    Repeat
      Select WaitWindowEvent()
     
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #ListIcG
              If EventType() = #PB_EventType_RightClick
                num = GetGadgetState(#ListIcG)
                If num > -1
                  DisplayPopupMenu(2, WindowID(#Win))
                EndIf
              EndIf
 
             
          EndSelect
     
        Case #PB_Event_Menu
          Select EventMenu()
            Case 1
              num = GetGadgetState(#ListIcG)
              If num > -1
               
                MoveMemory(@MainArr(num+1), @MainArr(num), ArraySize(MainArr()) - (num+1))
 
                ReDim MainArr(ArraySize(MainArr())-1)
               
                FillListIc()
               
              EndIf
          EndSelect
           
        Case #PB_Event_CloseWindow
          Quit = 1
       
      EndSelect
           
    Until Quit = 1
   
  EndIf
 


удаляешь там 5 пункт или 10 - все путем. забираешься в дебри - удаляешь какойнить там 580 - начинается фигня... путает данные, дублирует... и все такое :(


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 7:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11515
Благодарил (а): 4 раз.
Поблагодарили: 470 раз.
Используй список вместо массива или удаляй как положено, перемещая данные в цикле.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 8:41 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
сделал через цикл в массиве. ну вроде с 2 тысячами строк по 7 столбиков не очень сильно тормозит... ну посмотрим как себя поведет. надо будет ловить бухгалтерш с 5-10 тысячами строк :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 9:04 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
осталось фигня - найти как получить текущее положение скроллбара и после вернуть после перерисовки с помощью: SendMessage_(GadgetID(#Gadget), #LVM_ENSUREVISIBLE, toposition, 0)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 19, 2015 9:13 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
SereZa писал(а):
найти как получить текущее положение скроллбара

Ну это совсем в тему массивов :D Было уже где-то.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB