|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.12.2014, 14:30 | #1 |
Пользователь
Регистрация: 23.12.2009
Сообщений: 56
|
Сохранение двумерных массивов в TFileStream
Доброго времени суток! Помогите, пожалуйста, разобраться, столкнулся с такой проблемой:
при записи в файл через FileStream с помощью Write одним блоком всего массива, пишется белеберда. При записи колонками - пишется нормально. Вот так не работает: Код:
Код:
ColC - кол-во колонок Код:
Можно ли как-то создать динамический двумерный массив, чтобы данные были "единым целым", как это сделано в одномерном массиве?
Nostra Sunt
|
29.12.2014, 14:44 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А почему запись двойным циклом не хочешь делать?
I'm learning to live...
|
29.12.2014, 15:30 | #3 |
Пользователь
Регистрация: 23.12.2009
Сообщений: 56
|
Потому что работает не достаточно быстро, надо записывать миллионы/десятки миллионов точек
Nostra Sunt
|
29.12.2014, 15:58 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Это массив массивов и кроме данных в нем еще метаданные о каждом из подмассивов. Так что прямо в лоб так не получится и в результату Write пишет не весь массив. И читает соответственно не правильно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
29.12.2014, 16:11 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
разве что обернуть одномерный массив в "двумерный" с манипуляцией индексами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
29.12.2014, 16:54 | #6 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Цитата:
Код:
По скольку TDataArray может иметь иную длину в отличии от TDataTable , то в 0-й ячейке массива TDataArray будем хранить длину TDataArray. Чтобы при переборе строк таблицы, 100% знать действительную длину строки таблицы. |
|
29.12.2014, 17:49 | #7 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
12.01.2015, 15:05 | #8 |
Пользователь
Регистрация: 23.12.2009
Сообщений: 56
|
Ура! Нашел способ записи такого двумерного массива!
Данные в памяти в случае массива 5х5 располагаются так: [1 колонка: 1,2,3,4,5 строки][15 байт служебных/непонятных мне данных(СД)][2колонка:1..5 строки][15 байт СД][3колонка:1..5 строки][15 байт СД][4колонка:1..5 строки][15 байт СД][5колонка:1..5 строки] Достаточно взять адрес последней ячейки+размер ячейки в байтах, взять адрес первой ячейки, вычислить длину данных, ну и дальше FS.Write(DataTable[0,0],...); Кому будет интересно/полезно - сделал тестовый исследовательский пример, который заполняет массив данными типа byte, записывает массив в файл, считывает из файла. Проект: Arrays_2x.zip З.Ы. Кто-нибудь знает, что это за (мета)данные между колонками? объём выделенной памяти,кол-во ссылок на массив, количество элементов в массиве, и 3 пустых байта? они иногда меняются от запуска к запуску программы при неизменных адресах ячеек.
Nostra Sunt
Последний раз редактировалось Daemvil; 12.01.2015 в 15:40. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обработка двумерных массивов C++ | 803 | Помощь студентам | 9 | 18.02.2012 20:15 |
TStringList и TFileStream сохранение в файл | MalCer | Общие вопросы Delphi | 2 | 27.12.2010 14:24 |
обработка двумерных массивов... | Mizantrop | Помощь студентам | 2 | 25.03.2010 09:11 |
сохранение изображения с TFileStream | andrey4623 | Общие вопросы Delphi | 10 | 20.10.2007 20:28 |