|
|
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Как сохранить в файл запись (record) с динамическими массивами? file of, естественно, не работает. Вручную сохранять по одной переменной - не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 06:51 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, Покажи, что именно ты имеешь ввиду под "запись (record) с динамическими". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 08:23 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 08:46 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, в общем виде только серелиализацию писать, например с помощью TypInfo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 08:52 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered> file of, естественно, не работает. Покажи код. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 09:21 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Да любую, хотя бы, такую. Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 10:48 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Может, JSON? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 11:13 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, Так тебе запись с динамическими массивами или массив записей с массивами? В первом случае можно в бинарном виде без цикла за три последовательных акта записи, во втором в общем случае без цикла, имхо, не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 13:10 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Массив записей с массивами. Тут ещё придумал, что можно с помощью Move скопировать всё содержимое записи, за исключением указателей. А вот как бы ещё динамический массив скопировать, тоже напрямую из памяти, вместе с длиной? И потом загрузить из файла таким же образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 13:20 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, См. выше про три порции. Первый move() это собственно сам record. Потом пишешь длину массива и затем опять через move() содержимое динмассива. Читаешь в том же порядке, только перед третьим чтением делаешь массиву нужный (прочитанный вторым чтением) SetLenth(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 14:47 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Динамический массив же не копируется через Move, копируется только указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 14:59 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, А мужики-то и не знают.))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 15:02 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Ну так пусть мужики пример приведут, что-ли, однако. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 19:39 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, для динамических массивов, элементы которых не содержат, в свою очередь, динамических элементов (в т.ч. строк), можно копировать тело массива так: Код: pascal 1. Общее правило для использования строк, дин. массивов в качестве нетипизированного var/const параметра - разыменовать указатель (т.к. компилятор сам возьмёт адрес переменной) Вариант: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 19:48 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, Начинаю догадываться, - студент? курсовая? А поиск в сети по ключевым словам еще не проходили? К тебе же третий от начала пост был на эту тему, - спроецируй его самостоятельно на Move(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 19:51 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
в любом случае нужно еще длину поля динамического массива в record тоже записывать))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:10 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredНу так пусть мужики пример приведут, что-ли, однако.сначала студент напишет свой вариант кода, вот тогда и будем смотреть, что ты написал и что нужно исправить. А если студент этого не хочет делать (выкладывать свой вариант), то тогда бегом в режим заказа платной разработки, коль сам не можешь/не хочешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:12 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
asutp2, Это только если делать транспортабельный (считываемый другими приложениями) формат. А в своем собственном длину отдельного элемента и так знает. Другое дело что в рекорд можно было ввести длину самого динамического массива, тогда писать/читать можно было бы не за три итерации, а за две. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:20 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Делал такое использовал RTTI и дженерики, но в конечном счете пришлось отказаться от этой идеи так как тормозило при интенсивных нагрузках. Вот пример кода: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:22 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Vlad FНачинаю догадываться, - студент? курсовая?Совершенно неверно! В общем, тем, кто начал писать про мужиков, студентов, - отвечать нет желания. Остальным - спасибо (получилось, код приводить не буду). Относительно "Динамический массив же не копируется через Move" - было Move(SrcArr, DstArr[0], ...); а нужно было Move(SrcArr[0], DstArr[0],, ...); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:29 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, Ну и слава богу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 20:37 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredVlad FНачинаю догадываться, - студент? курсовая?Совершенно неверно! В общем, тем, кто начал писать про мужиков, студентов, - отвечать нет желания. Остальным - спасибо (получилось, код приводить не буду). Относительно "Динамический массив же не копируется через Move" - было Move(SrcArr, DstArr[0], ...); а нужно было Move(SrcArr[0], DstArr[0],, ...);хотелось бы увидеть этот код, если он вообще есть)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 22:38 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredОстальным - спасибо (получилось, код приводить не буду). Относительно "Динамический массив же не копируется через Move" - было Move(SrcArr, DstArr[0], ...); а нужно было Move(SrcArr[0], DstArr[0],, ...);...и будет это работать только до тех пор пока элементы массива сами не станут управляемым типом или его содержащим контейнером... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 22:40 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
gssboxДелал такое использовал RTTI и дженерики, но в конечном счете пришлось отказаться от этой идеи так как тормозило при интенсивных нагрузках. довольно много выделений памяти и цикл с поиском параметров + то что white_nigger написал можно ещё допиливать и допиливать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2018, 23:23 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
А если есть вложенная запись Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. То, если скопировать память переменной rec, то, вместо указателя на структуру a , может оказаться левый адрес. Вероятно, то же и с s:string; . И даже отдельное копирование переменной a не спасёт, потому что адрес затёрт. Что делать, однако? Код привести не могу, потому что "в продакшене"... э-э, в общем, тестовый проект с просто записью и чтением из файла - работает, а реальный - нет. Где-то так: Код: pascal 1. 2. 3. 4. Крэшится на втором "move". str1, str2, str3 - это ansistring, с данными, соответственно, rec, rec.a, rec.a.s. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 19:37 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, проца move работает с байтами, length(s) возвращает не количество байтов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 19:49 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), у ansistring же длина равна кол-ву байт. Если перед копированием запомнить указатели на rec.a и rec.a.s, то как их потом вернуть? Т.е., можно присвоить pointer'у адрес rec.a, а обратно - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 20:08 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredу ansistring же длина равна кол-ву байт.У UTF8String кстати тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 20:10 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, не забывай, что record выравнивается, соответственно между полями записи в памяти может быть разрыв. у packet record все поля идут строго друг за другом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 20:15 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
А вообще сама задача изначально странная. Я понимаю, что в качестве студенческой задачи пойдет. Но в реальном проекте использовать file of ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 20:17 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Хотя, вложенная структура, вроде, хранится не по указателю, а целиком в теле первой. Значит, второе "move" лишнее, и нужно разобраться только со строкой. Оказалось, там строка string, а в неё копирую ansistring - не работает (это потому что уже кучу раз исправлял, и испортилось, а так там тоже копировалось по байтам). В общем, перед "move" присвоить Код: pascal 1. потом Код: pascal 1. а потом Код: pascal 1. и только потом - Код: pascal 1. А если "pointer(rec.a.s):=p;" убрать, тогда - error! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 21:07 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, мой тебе совет - не делай так . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 21:33 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Ну а как? Передать структуру, а потом её восстановить? Не по одному полю же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 21:39 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered, автор Код: pascal 1. А если строка будет пустая - мув не сглючит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 21:55 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registered Код: pascal 1. Ну вот что это за адский пц?.. 1) где выделение памяти под копию строки? 2) вы же в курсе, что строка - это указатель?.. т.е. вы копируете данные строки str1 в запись rec, которая у вас имеет размер 12 байт + выравнивание и этим самым портите значения других полей и память за этой записью; 3) копировать строки через move() - это такое себе. Если вам обязательно нужно получить отдельную копию строки в памяти, то делайте так: Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 22:50 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredА если "pointer(rec.a.s):=p;" убрать, тогда - error! 1. p:=@rec.a.s; - сохранили адрес строки s 2. move(str1[1],rec,length(str1)); - затёрли содержимое rec мусором из str1 (в т.ч. и адрес строки s) 3. pointer(rec.a.s):=p; - восстановили адрес строки s (чему равен pointer(rec.a.s) перед этой инструкцией?..) 4. rec.a.s:=str3; - присвоили строке s значение str3, при этом компилятор изменяет значение счётчика ссылок по адресу pointer(s) - 8 (afair). Теперь догадаетесь почему без 3го шага у вас вылезает ошибка?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 22:57 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
alekcvpregistered Код: pascal 1. Ну вот что это за адский пц?.. 1) где выделение памяти под копию строки?Так в этой же инструкции строка копируется в запись, для которой не нужно выделять память. Если выделять память под rec.a.s перед копированием, чтобы получить правильный указатель на строку, то разницы нет (в этом случае). alekcvp2) вы же в курсе, что строка - это указатель?.. т.е. вы копируете данные строки str1 в запись rec, которая у вас имеет размер 12 байт + выравнивание и этим самым портите значения других полей и память за этой записью;Ну если я сначала сохраняю такую же запись в строку, а потом восстанавливаю, значит такое же кол-во байт должно быть. alekcvp3) копировать строки через move() - это такое себе. Если вам обязательно нужно получить отдельную копию строки в памяти, то делайте так: Код: pascal 1. 2. Почему? Если память под 2-ю строку уже выделена нужной длины, то, вроде, как была, так и останется уникальная копия (хоть copy, хоть move), да и обычное присваивание тоже должно сделать уникальную копию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 11:10 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredalekcvpпропущено... Ну вот что это за адский пц?.. 1) где выделение памяти под копию строки?Так в этой же инструкции строка копируется в запись, для которой не нужно выделять память. Если выделять память под rec.a.s перед копированием, чтобы получить правильный указатель на строку, то разницы нет (в этом случае). alekcvp2) вы же в курсе, что строка - это указатель?.. т.е. вы копируете данные строки str1 в запись rec, которая у вас имеет размер 12 байт + выравнивание и этим самым портите значения других полей и память за этой записью;Ну если я сначала сохраняю такую же запись в строку, а потом восстанавливаю, значит такое же кол-во байт должно быть. Я попытаюсь ещё раз наглядно объяснить. Если всё равно не понимаете, то лучше сначала почитать какие-нибудь книжки по тому как устроена память ПК, что такое строки и указатели и чем они отличаются: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 13:22 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
alekcvpЯ попытаюсь ещё раз наглядно объяснить. у Саши-GunSmoker'а в блоге весьма наглядная статья-перевод есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 14:20 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
В str1 - не мусор, а такое же бинарное представление записи rec, сделанное ранее. А строка по ссылке запоминается отдельно (в str3), и восстанавливается отдельно, после сохранения адреса rec.a.s, копирования str1 в rec, восстановления адреса, и потом уже присваивание значения строке из str3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 14:40 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredВ str1 - не мусор, а такое же бинарное представление записи rec, сделанное ранее. А строка по ссылке запоминается отдельно (в str3), и восстанавливается отдельно, после сохранения адреса rec.a.s, копирования str1 в rec, восстановления адреса, и потом уже присваивание значения строке из str3. Ты понимаешь, что адрес в rec.a.s действителен только на момент его запоминания? На момент восстановления эта строка может находиться уже в совершенно другом месте и восстановленный адрес будет показывать на участок памяти, в котором хранится хрен-знает-что? И если строка по ссылке запоминается в str3, то этот адрес потом вообще не нужен. Достаточно запомнить (str3 = rec.a.s) и сохранить str3, а потом восстановить (rec.a.s := str3) и всё. Через move() можно сохранять только неуправляемые просты типы, вроде integer, cardinal, boolean, статических массивов и записей, состоящих только из таких же простых типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 15:24 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredНу а как? Передать структуру, а потом её восстановить? Не по одному полю же?Ты не поверишь! Именно так и делают сериализаторы. Примеры можешь посмотреть в том-же Classes.pas ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 15:33 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
alekcvpИ если строка по ссылке запоминается в str3, то этот адрес потом вообще не нужен. Достаточно запомнить (str3 = rec.a.s) и сохранить str3, а потом восстановить (rec.a.s := str3) и всё.Так не работает. Access violation. Код: pascal 1. 2. Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 16:58 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
registeredТак не работает. Access violation. Код: pascal 1. 2. Именно то, о чём я говорил: вы командой Move() затираете действительный адрес с мусором (т.е. устаревшим адресом s, который сейчас содержит неизвестно что), поэтому присвоение в следующей строке вызывает ошибку. Поэтому поля записи с динамическими типами следует вообще исключить из сохранения через move() и сохранять их отдельно. И да, проще всего это сделать через сохранение каждого поля отдельно. Ну или так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 17:36 |
|
||
|
Как сохранить в файл запись (record) с динамическими массивами?
|
|||
|---|---|---|---|
|
#18+
Насмотревшись на ваши мучения, решил-таки выложить свой модуль для автоматического сохранения подобных структур. Я не буду его хвалить и пиарить, это гнусное хакерство (поскольку писалось ещё до "новой" RTTI) и я сам им уже не пользуюсь - в основном потому, что не использую структуры с многоуровневой вложенностью массив-запись-массив. Всё-таки они неудобны по многим причинам. Хотя с современными навороченными рекордами может и есть какой-то смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 17:55 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2040021]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
102ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 430ms |

| 0 / 0 |
