purebasic.info

PureBasic forum
Текущее время: Пн окт 22, 2018 2:50 am

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вт фев 18, 2014 11:28 am 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Понадобилось обращение к нескольким элементам списка, дергать каждый раз основной элемент неудобно было, вот что обнаружил, может будет полезно.

Код:
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
 
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
NewList spisoka.spisok_s()
NewList spisokb.spisok_s()
 
Define.spisok_s *uk_a,*uk_b
 
AddElement(spisok())
 
ChangeCurrentElement(spisoka(),@spisok())
ChangeCurrentElement(spisokb(),@spisok())
 
spisok()\a=1
spisok()\b="Первый елемент"
 
For n=1 To 5
  AddElement(spisok())
  spisok()\a=n*2
  spisok()\b="Строка "+Str(n)  
Next
 
Repeat
  Debug "Список a.a = "+Str(spisoka()\a)
  Debug "Список a.b = "+spisoka()\b
Until NextElement(spisoka())=0
 
Debug "Список b.a = "+Str(spisokb()\a)
Debug "Список b.b = "+spisokb()\b
 
 
ResetList(spisok())
NextElement(spisok())
*uk_a=@spisok()
NextElement(spisok())
*uk_b=@spisok()
Debug "Указатель a.a = "+Str(*uk_a\a)
Debug "Указатель a.b = "+*uk_a\b
Debug "Указатель b.a = "+Str(*uk_b\a)
Debug "Указатель b.b = "+*uk_b\b
 
 



С указателем на список можно делать :
чтение\запись PreviousElement NextElement
Может еще что-то можно.
Нельзя Foreach addElement deleteElement.

С указателями на структуру, которые указываю на элемент списка можно делать только чтение\запись.


Последний раз редактировалось AlexSVC Вт фев 18, 2014 3:37 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Код:
1
2
ChangeCurrentElement(spisoka(),@spisok())
ChangeCurrentElement(spisokb(),@spisok())

Это не самое лучшее решение и может привести к ошибкам.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 1:20 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
дергать каждый раз основной элемент неудобно было
Имеется в виду, список перебирать было неудобно (Foreach)? Если да, тогда можно юзать это:
Код:
1
2
3
PushListPosition(List()) ;Запоминаем текущую позицию
;Делаем что-то с элементами списка, делаем перебор, добавляем новые элементы
PopListPosition(List()) ;Восстанавливаем позицию


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 1:29 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Код:
1
2
ChangeCurrentElement(spisoka(),@spisok())
ChangeCurrentElement(spisokb(),@spisok())

Это не самое лучшее решение и может привести к ошибкам.

Альтернативы отсутствуют :cry: .
Если-бы была возможность объявить списочный указатель, то я б так и сделал, но они отсутствуют.
NewList *Mylis.struct() - не работает.

Это решение уже в динамическом FIFO буфере трудится :oops: , причем с паралельным вводом-выводом.

А вот обращение к элементу списка через указатель на структуру это "законно" :?:

Код:
1
2
3
4
5
 
PushListPosition(List()) ;Запоминаем текущую позицию
;Делаем что-то с элементами списка, делаем перебор, добавляем новые элементы
PopListPosition(List()) ;Восстанавливаем позицию
 



Это жуткий тормоз, который я день отлавливал (исполняются очень медленно). И переписывал на ChangeCurrentElement().
ListIndex(LinkedList()) - тоже тормоз ( при списке в 200000 очень чувствуется) убрав его ускорил обработку раз в 30.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 1:55 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AlexSVC писал(а):
А вот обращение к элементу списка через указатель на структуру это "законно"
Да, при условии что этот элемент списка не будет удален при работе с ним через указатель.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 2:01 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
AlexSVC писал(а):
NewList *Mylis.struct() - не работает.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
 
Define.spisok_s *uk_a,*uk_b
 
*uk_a = AddElement(spisok())
spisok()\a=1
spisok()\b="Первый елемент"
 
*uk_b = AddElement(spisok())
spisok()\a=2
spisok()\b="Второй елемент"
 
Debug "Указатель a.a = "+Str(*uk_a\a)
Debug "Указатель a.b = "+*uk_a\b
Debug "Указатель b.a = "+Str(*uk_b\a)
Debug "Указатель b.b = "+*uk_b\b
 


_________________
.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 2:09 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ну этот способ у меня в первом посте описан как "Указатель на структуру".
А разговор ведется про "Указатель на список" это не одно и тоже.
"Указатель на структуру" - можно только считать\записать.
"Указатель на список" - можно считать\записать, NextElement() AddElement() и т.д. все что можно делать со списком. Вот он как-раз не реализован. Собственно почему такой "трюк".


Последний раз редактировалось AlexSVC Вт фев 18, 2014 2:42 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 2:21 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AlexSVC писал(а):
"Указатель на список" - можно считать\записать, NextElement() AddElement() и т.д. все что можно делать со списком.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
 
Procedure x(List sp.spisok_s())
  AddElement(sp())
  sp()\a=2
  sp()\b="Второй елемент"
EndProcedure
 
AddElement(spisok())
spisok()\a=1
spisok()\b="Первый елемент"
x(spisok())
 
ForEach spisok()
  With spisok()
    Debug \a
    Debug \b
  EndWith
Next


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 2:36 pm 
Не в сети
профессор
Аватар пользователя

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

_________________
.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 3:00 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
AlexSVC писал(а):
"Указатель на список" - можно считать\записать, NextElement() AddElement() и т.д. все что можно делать со списком.

Код:
1
2
3
4
5
6
7
8
9
10
11
 
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
 
Procedure x(List sp.spisok_s())
....
 


Ну да, это он List sp.spisok_s().
Вот тока штуки три таких на один список сделать не получится или получится но через "костыли"
Код:
1
2
3
4
5
6
 
Procedure x(List sp_cur.spisok_s(),List sp_pervious.spisok_s(),List sp_next.spisok_s())
....
;вызов
x(sp(),sp(),sp())
 


Не уверен что вообще работать будет.
lakomet писал(а):
AlexSVC, раскажи что тебе со списком делать надо? Зачем все эти костыли?


Рассказываю, откуда все это вылезло:
Список, может быть до 300-500 тысяч элементов, нужно его как можно быстрее обработать. При обработке необходим одновременный доступ к 3 точкам списка (предыдущий элемент, текущий элемент, следующий элемент), причем между предыдущим текущим и следующим элементом могут быть сколько угодно неиспользуемых элементов, ну и двигать все это дело вперед по списку с возможностью удаления\добавления\изменения. Сейчас все это дело ChangeCurrentElemet - тится (ну прям через ...) .
Вот собственно откуда пошли изыскания.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 3:29 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Неработает... :cry:
List pr.spisok_s(),List cur.spisok_s(),List sled.spisok_s()
ведут себя как один и тот-же указатель
А должны были вести себя независимо.

Код:
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
 
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
 
AddElement(spisok())
 
spisok()\a=1
spisok()\b="Первый елемент"
 
For n=1 To 5
  AddElement(spisok())
  spisok()\a=n*2
  spisok()\b="Строка "+Str(n)
Next
 
Procedure test(List pr.spisok_s(),List cur.spisok_s(),List sled.spisok_s())
  Debug "Список pr.a = "+Str(pr()\a)
  Debug "Список pr.b = "+pr()\b
  AddElement(cur())
  cur()\b="Добавил cur"
  AddElement(sled())
  sled()\b="Добавил sled"  
  Debug "Список pr.a = "+Str(pr()\a)
  Debug "Список pr.b = "+pr()\b
EndProcedure
 
test(spisok(),spisok(),spisok())
 
ForEach spisok()
  Debug "Список spisok.a = "+Str(spisok()\a)
  Debug "Список spisok.b = "+spisok()\b  
Next
 
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 4:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Если нужно получить несколько копий листа, то можно поступить следующим образом.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Structure Lists
  List x.l()
EndStructure
 
x.Lists
*p.Lists=@x
 
AddElement(x\x())
x\x()=1
AddElement(*p\x())
 
*p\x()=2
 
ForEach *p\x()
  Debug *p\x()
Next

Только нужно учитывать что это по сути один и тот же список.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Structure Lists
  List x.l()
EndStructure
 
x.Lists
*p.Lists=@x
 
AddElement(x\x())
x\x()=1
 
AddElement(*p\x())
*p\x()=2
 
Debug ListIndex(*p\x())
ResetList(x\x())
Debug ListIndex(*p\x())


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


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

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Только нужно учитывать что это по сути один и тот же список.

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

Есть список. Он имеет имя. Рассматриваем имя списка как "бегунок", который перемещается по списку.
Все выше приведенные примеры по сути указатели на один этот "бегунок", соответсвенно при смещении "бегунка" все ссылки смещаются вместе с ним.

А нужно вот что: Несколько бегунков на одном списке. Т.е. список один а точек входа "бегунков" несколько, в этом случае смещение одного из них не вызывает смещение остальных.

В вашем случае - список один, точка входа - одна, и несколько ссылок на точку входа.
в последнем примере сброс в начало одного указателя сбрасывает и второй, а это не то что нужно. Нужно что-бы при сбросе одного указателя, остальные остались на месте.

Если я плохо объясняю, вы мне скажите, я еще раз попытаюсь, боюсь мне не удается объяснить разницу между указателем на список, и списковым указателем. Может кто сформулирует это получше ?


Последний раз редактировалось AlexSVC Вт фев 18, 2014 4:51 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
AlexSVC
Так а в чём фишка то, если можно только PreviousElement NextElement? А так уже не работает?
Код:
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
Structure spisok_s
  a.l
  b.s
EndStructure
 
NewList spisok.spisok_s()
NewList spisoka.spisok_s()
NewList spisokb.spisok_s()
 
Define.spisok_s *uk_a,*uk_b
 
AddElement(spisok())
 
ChangeCurrentElement(spisoka(),@spisok())
ChangeCurrentElement(spisokb(),@spisok())
 
spisok()\a=1
spisok()\b="Первый елемент"
 
For n=1 To 5
  AddElement(spisok())
  spisok()\a=n*2
  spisok()\b="Строка "+Str(n)  
Next
 
Debug FirstElement(spisoka())



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

_________________
.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 18, 2014 5:06 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Я понимаю, то, что я нашел это не полный вариант спискового указателя, а его "урезанный" вариант, ну это хоть, что-то чем совсем ничего.
Использовать эту "фишку" можно как обыкновенный указатель на элемент списка, который еще может Next\Pervious (как вы заметили), это дает экономию вызовов ChangeCurrentElemet.

т.е. при обычном указателе :
при смещении предыдущего элемента, мне надо сохранит текущую позицию, ChangeCurrentElemet на предыдущий элемент, PreviousElement списка , сохранить указатель на предидущий, потом опять ChangeCurrentElemet на текущую позицию

при "урезанном" списковом указателе :
при смещении предыдущего элемента, мне нада PreviousElement спискового указателя.

Разницу чувствуете ?

При обработке больших листов разница уже в минутах.
Это я только один пример привел.

Конечно если надо предыдущий элемент удалить или добавить рядом с ним новый то "урезанный" списковый этого не позволяет, почему и искался полный его вариант, но он не реализован, вот и "костыли".


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

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


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

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


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

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