|
|
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Понадобилось написать процедуру для добавления элемента в массива. Как по феншую правильнее, передать параметром переменную-массив или пойнтер на него? ================= Док. Win7 Ultim x64/Deb 8.7 i386: FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb), Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:43:00 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, по феншую переменная-массив и есть пойнтер на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:49:32 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Bred eFeM, я не зря заострил внимание на слове феншуй Я знаю, что это одно и то же. Как настоящие пац программисты пишут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:51:21 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокКак настоящие пац программисты пишут? От задачи зависит. Задача же не в том, чтобы передать массив, это лишь вариант её реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:53:31 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, Зависит от того, что хочешь получить. Есть открытые массивы, как параметр. Можно фиксированной длинны, но целиком в стек запихать. А можно и поинтер, можно и динамический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:54:58 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
wadman, т.е. с пойнтерами проще ошибиться и кода больше. Тогда предпочту переменную :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:55:14 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
DesWind, у меня динамический Код: pascal 1. 2. 3. 4. 5. 6. 7. Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 11:58:34 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, packed record, сделай так: Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 12:13:32 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокDesWind, у меня динамический Код: pascal 1. 2. 3. 4. 5. 6. 7. Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :) Упаковать можно так, всё это дело весит 9 байт ... Поинтер на Int64 и Extended обязательны! Эти типы очень медленно работают при выравнивании Код: pascal 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. А дальше можно написать уже функции по работе Код: pascal 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. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 12:15:07 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Bred eFeMДок, packed record, сделай так зашел уточнить, а тут переписывать уже много чего надо. Так и на целый компонент можно написать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 12:36:05 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокBred eFeM, я не зря заострил внимание на слове феншуй Я знаю, что это одно и то же. Как настоящие пац программисты пишут? Ты зарплату за феншуй получаешь ? Просто интересно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 12:44:14 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
schi, В человеке коде все должно быть прекрасно... ©. Иначе мой перфекционизм не даст мне спать по ночам :) зы. а зарплату я за другое получаю. Пока... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 12:47:44 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокПонадобилось написать процедуру для добавления элемента в массива. Как по феншую... Феншуйно & инлайново на 100%: Код: pascal 1. 2. А когда нужно в цикле добавить 1000 элементов, то еще и быстро: Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 13:35:27 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Докschi, ...Иначе мой перфекционизм не даст мне спать по ночам :) С этим спорить безусловно трудно :) А что, в самом Лазарусе нет примеров передачи массива ? Наверное там и есть феншуй, феншуйнее вроде некуда... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 13:53:33 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 14:42:17 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T> +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 14:50:40 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДФеншуйно & инлайново на 100% а если тебе надо вставить третий элемент? :) schiА что, в самом Лазарусе нет примеров передачи массива ? не нашел. _Vasilisk_логичнее использовать TList<T> это Лазарь, не дельфи зы. короче, можно топ закрыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:05:22 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док_Vasilisk_логичнее использовать TList<T> это Лазарь, не дельфи В дельфи это есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:25:06 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Докэто Лазарь, не дельфиТогда чуть более геморройно. TList + GetMem/FreeMem на добавление/удаление элементов. Я в D2006 так делал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:28:51 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_+ GetMem/FreeMemА если элемент влазит в SizeOf(Pointer), то обычным кастом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:30:38 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокчччДФеншуйно & инлайново на 100% а если тебе надо вставить третий элемент? :) ... Просто в этом случае старайся не использовать массивы. Если "на выходе" все же требуется массив - сформируй его в момент, когда все данные уже стабильны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:31:45 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_GetMem/FreeMem_Vasilisk_то обычным кастомне забывая про инициализацию/финализацию управляемых типов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:31:52 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_TList + GetMem/FreeMem Это еще более геморройнее, чем работа с указателями. Лучше не преумножать сущности без необходимости :) НяшикВ дельфи это есть у меня Лазарь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:34:25 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, У меня код Код: pascal 1. 2. 3. бросал Out of memory. При этом код Код: pascal 1. работал на ура ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:34:52 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДПросто в этом случае старайся не использовать массивы Для отображения на клиенте мне нужно некоторым образом перетасовать данные из датасета, не дергая сервер, и в зависимости от условий добавить/удалить часть произвольных записей. Выбор пока между датасетом с включенным CachedUpdates и каким-нибудь упорядоченным множеством. Вот пока смотрю, где геморроя меньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:50:31 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокЭто еще более геморройнееНичуть. Это один раз написанный правильный абстрактный класс. Как-то так Код: pascal 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. 85. 86. 87. 88. 89. 90. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:57:04 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
И зачем тут абстрактный класс?... Обычного бы хватило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:01:59 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокчччДПросто в этом случае старайся не использовать массивы Для отображения на клиенте мне нужно некоторым образом перетасовать данные из датасета, не дергая сервер, и в зависимости от условий добавить/удалить часть произвольных записей. Выбор пока между датасетом с включенным CachedUpdates и каким-нибудь упорядоченным множеством. Вот пока смотрю, где геморроя меньше Ну вот, а ты - "массивы"... Есть датасеты, которые умеют делать локальную фильтрацию и локальную сортировку. TpFIBPlus, например. Ах да, у тебя же лазарус... Ну, есть библиотека Ehlib. В ней - отличный датасет с локальной сортировкой и локальной фильтрацией. А также отличный грид с локальной сортировкой и фильтрацией. Не? В любом случае, массивы тут - плохой выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:08:42 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокDesWind, у меня динамический Код: pascal 1. 2. 3. 4. 5. 6. 7. Не знаю на 100% насчёт лазаря, но в дельфи даже древних версий можно сделать наследника TList, переопределив у него метод Notify, и дальше как-то так: Код: pascal 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. Ну и добавлять новые элементы соответственно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:55:22 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. разумеется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:56:44 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДЕсть датасеты, которые умеют делать локальную фильтрацию и локальную сортировку. у меня случай сложнее. Надо заполнить VTV из сджойненного запроса к нескольким обычным (недревовидным) таблям, объединив неск. однотипных, следующих друг за другом (child node) записей в одну ноду (root node). Это сформулировать-то трудно, а ты эхлиб-эхлиб Попробую на клиенте сделать, потом пойду вопрос в ветку FB задавать :) alekcvpв дельфи даже древних версий можно сделать наследника TList У меня такая же мысль в голове появилась после наводки чччД по ссылке выше. Ваш вариант мне больше нравится, спасибо. Щас посмотрю, что можно наваять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:01:37 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_правильный абстрактный класс Спасибо за код, познавательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:07:50 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, с VTV вообще никаких проблем. Можешь данные хранить сразу в узлах, заливать их только в рутовые ветви и при экспандинге их. Вот и хранилища данных отдельного не нужно. С сортировкой в VTV тоже просто: определяешь в кастом-методе, как сравнивать два узла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:09:49 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДзаливать их только в рутовые ветви и при экспандинге их вот эта фраза интересна, но не совсем понятна :) т.е., в VTV есть методы, позволяющие группировать записи по каким-то критериям и позволять дереву самому их объединять и отрисовывать соответственно заданным критериям? Я правильно понял? зы. с VTV освоил только простейшие манипуляции: доки нормальной нет не встречал, демки не очень-то информативны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:40:55 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокУ меня такая же мысль в голове появилась после наводки чччД по ссылке выше. Ваш вариант мне больше нравится, спасибо. Щас посмотрю, что можно наваять. У меня там еще косяк, надо так: Код: pascal 1. P.S: Отсутствие возможности править сообщения в 2017м году... вносит свежих впечатлений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 19:24:09 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Докметоды, позволяющие группировать записи нет таких методов. Речь о процессе инициализации дерева. Смотри: 1. читаешь из базы только данные, которые должны быть в ветвях самого верхнего уровня; 1.1. также определяешь для каждой такой ветки - есть ли у нее подуровни ("есть ли в базе") - но не читаешь эти данные из базы: Код: pascal 1. - сие для того, чтобы на ветке получился плюсик для разворачивания дерева. Таким образом, твой исходный "страшно сложный запрос" вырождается до примитивного => "загрузить из базы ветви верхнего уровня" 2. В событии OnInitChildred (как раз, когда юзер "разворачивает" содержимое ветки) - читаешь из базы только те данные, которые являются подветвями текущей ветви. 2.1. Выполняешь пункт 1.1. Итак, вместо чудовищно сложной работы ты обходишься простыми запросами. 3. Если нужна сортировка "на лету" (например, по клику на заголовок столбца дерева) - то задаешь обработчик клика на хэдер: Код: pascal 1. 2. - а саму логику сортировки определяешь в коде обработчика OnCompareNode, сравнивая "правильным" для тебя способа данные двух узлов. 3.1 Если же тебе не нужна сортировка "на лету" - то весь п.3 вообще не делаешь, сортируешь данные в запросе к базе (пп. 1 и 2) и дерево строишь уже отсортированным как нужно. http://teran.karelia.pro/articles/item_5845.html http://delphigears.blogspot.ru/2011/08/virtual-treeview.html Еще тут где-то были статейки, приаттаченные к сообщениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 19:47:39 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
rgreatИ зачем тут абстрактный класс?...По двум причинам 1) Определить наследников для строгого контроля типов компилятором 2) Для управляемых типов обязательно переопределять FinalizeData + CopyData с кастом к конкретному типу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 19:53:28 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДСмотри Ну, хорошо, смотри IDDATEVISITRV_IDRV_NAMEMDNAME_SHORT910.06.2017 10:352повторный осмотрврач гинеколог Нуруллинамедклиника11109.06.2017 20:205инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника11007.06.2017 10:545инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника1507.06.2017 10:344массаж простатыврач гинеколог Нуруллинамедклиника2809.06.2017 10:354массаж простатыврач уролог Перевезенцевмедклиника2608.06.2017 10:344массаж простатыврач уролог Перевезенцевмедклиника2213.09.2016 00:002повторный осмотрврач уролог Перевезенцевмедклиника3131.08.2016 00:001первичный осмотрврач уролог Перевезенцевмедклиника21315.08.2016 21:404массаж простатыврач уролог Перевезенцевмедклиника21414.06.2016 21:414массаж простатыврач уролог Перевезенцевмедклиника3407.06.2017 10:213профилактический осмотрврач эндоскопист Дятловмедклиника1 теперь попробуй одним махом, не дергая сервер, объединить под root-нодой для каждой группы записи с ID 11-10, 5-6-8, 13-14 Повторюсь, объединить однотипные данные, не проблема - у kdv на сайте хорошая статья есть. Теперь понимаешь, откуда мои изыскания? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 21:53:20 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
ДокНу, хорошо, смотри не, вот так корректнее (сортировка по дате) IDDATEVISITRV_IDRV_NAMEMDNAME_SHORT910.06.2017 10:352повторный осмотрврач гинеколог Нуруллинамедклиника31109.06.2017 20:205инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника3809.06.2017 10:354массаж простатыврач уролог Перевезенцевмедклиника2608.06.2017 10:344массаж простатыврач уролог Перевезенцевмедклиника21007.06.2017 10:545инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника3507.06.2017 10:344массаж простатыврач гинеколог Нуруллинамедклиника2407.06.2017 10:213профилактический осмотрврач эндоскопист Дятловмедклиника3213.09.2016 00:002повторный осмотрврач уролог Перевезенцевмедклиника1131.08.2016 00:001первичный осмотрврач уролог Перевезенцевмедклиника21315.08.2016 21:404массаж простатыврач уролог Перевезенцевмедклиника21414.06.2016 21:414массаж простатыврач уролог Перевезенцевмедклиника1 Соответственно объединению подлежат записи 6-8, 13-14 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 22:01:06 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, это не постановка задачи. Ты рассматриваешь свою странную выборку как данность, от которой нужно плясать. Я тебе совсем другое говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 22:45:44 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
чччДэто не постановка задачи. Ты рассматриваешь свою странную выборку как данность, от которой нужно плясать. Я тебе совсем другое говорил если честно, я уже начинаю терять нить твоих суждений :) Постановка задачи проистекает из запросов юзера, не противоречащих здравому смыслу. Ему плевать, как ты ее решишь. Ты же меня зачем-то убеждаешь в том, что если задача не решаема рутинными методами, то она неправильная. В контексте всего выше сказанного у меня создалось впечатление, что из предложенных вариантов (массив, коллекция, дженерики) массив - не самый худший из них. Пожалуй, поэкспериментирую с дженериками (раньше не доводилось их пользовать), и на чем-нибудь остановлюсь уже. Всем искреннее спасибо за участие, было очень познавательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 01:00:58 |
|
||
|
Передача массива параметром
|
|||
|---|---|---|---|
|
#18+
Док, в лазарусе есть FCL-STL, lazarus\fpc\{$ver}\source\packages\fcl-stl\src\ в частности в вашем случе это gvector.pp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 08:02:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2042143]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
225ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 576ms |

| 0 / 0 |
