Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> СИ, Структуру записать в файл, размер неизвестен 
V
    Опции темы
insidex
Дата 6.11.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.11.2006

Репутация: нет
Всего: нет



Вроде бы детский вопрос, но я не знаю размер структуры, которой как я понял динамически память выделяется, и соответственно не могу её в (char *) первести для записи в файл. Может кто знает, как решать проблему...

Вот оно:
Код

struct _zend_op_array {
    /* Common elements */
    zend_uchar type;
    char *function_name;        
    zend_class_entry *scope;
    zend_uint fn_flags;
    union _zend_function *prototype;
    zend_uint num_args;
    zend_uint required_num_args;
    zend_arg_info *arg_info;
    zend_bool pass_rest_by_reference;
    unsigned char return_reference;
    /* END of common elements */

    zend_uint *refcount;

    zend_op *opcodes;
    zend_uint last, size;

    zend_compiled_variable *vars;
    int last_var, size_var;

    zend_uint T;

    zend_brk_cont_element *brk_cont_array;
    zend_uint last_brk_cont;
    zend_uint current_brk_cont;

    zend_try_catch_element *try_catch_array;
    int last_try_catch;

    /* static variables support */
    HashTable *static_variables;

    zend_op *start_op;
    int backpatch_count;

    zend_bool done_pass_two;
    zend_bool uses_this;

    char *filename;
    zend_uint line_start;
    zend_uint line_end;
    char *doc_comment;
    zend_uint doc_comment_len;

    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

Вот эту херуимевну мне надо сохранить на диск, а потом еще и считать как структуру...Вообще возможно??
PM MAIL   Вверх
JackYF
Дата 6.11.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(insidex @  6.11.2007,  17:53 Найти цитируемый пост)
Вообще возможно?? 

Возможно. Запись структуры в файл осуществляется последовательной записью всех подструктур в файл. Выясни всю информацию про подструктуры (то бишь, про все поля - статическое пишется напрямую, динамическое - хитрее) и дело в шляпе.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
insidex
Дата 6.11.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.11.2006

Репутация: нет
Всего: нет



Цитата(JackYF @ 6.11.2007,  17:58)
Цитата(insidex @  6.11.2007,  17:53 Найти цитируемый пост)
Вообще возможно?? 

Возможно. Запись структуры в файл осуществляется последовательной записью всех подструктур в файл. Выясни всю информацию про подструктуры (то бишь, про все поля - статическое пишется напрямую, динамическое - хитрее) и дело в шляпе.

а если оно динамическое, как мне узнать сколько оно памяти занимает?


то есть такой вариант бессмысленен:

Код

long len = sizeof(_zend_op_array); // здесь мне рекурсивно размер всех подструктур узнавать надо ????
char *buf[100000];
memcpy((char *)buf,(struct zend_op_array*)op_array,len);
fwrite(buf,len,1,File);


Это сообщение отредактировал(а) insidex - 6.11.2007, 18:13
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(insidex @  6.11.2007,  18:05 Найти цитируемый пост)
// здесь мне рекурсивно размер всех подструктур узнавать надо ????

Нет. Но sizeof, к примеру включит в результирующий размер размеры указателей, но не размеры того на что они указывают. Так что, всё таки придётся немного попотеть smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 6.11.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



я в таком случае (на С++) писал у каждого класса (и подкласса) функции GetRawData. Получалось именно что-то типа рекурсии. Функция GetRawData или добавляла по очереди в поток или примитивные данные-члены или результат функции GetRawData от подклассов-членов.

на чистых сях все выглядит (по мне) сложнее, но логика туда-же


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



А лучше написать wrapper'ы(если нужно поддерживать POD'овость структур) и прикрутить к ним boost::serialization smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 7.11.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



archimed7592, вот потому я и хочу прочесть книгу по бусту (как время появится). потому что всех его возможностей не знаю. smile приходится делать лисапеды


--------------------
user posted image    user posted image
PM MAIL   Вверх
insidex
Дата 7.11.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.11.2006

Репутация: нет
Всего: нет



хех задачка не для слабонервных smile
PM MAIL   Вверх
Dims
Дата 9.11.2007, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Одной строчкой -- невозможно. Придётся явно написать код сохранения каждого элемента структуры. При этом нужно ещё откуда-то знать длины тех объектов, на которые ссылаются указатели. То есть, нужно либо понимать устройство структуры, если длины хранятся в ней, либо знать это откуда-то ещё. 

Дело в том, что Си/Си++ сам не хранит информацию о длине массивов.

Можно немного упростить себе задачу. Написать "тупой" код, который сохраняет всю структуру. При этом на тех местах в файле, которым соответствуют члены с указателями, будет бред (адреса памяти, которые к моменту считывания будут недействительными). Затем, отдельно дописать после структуры все объекты, на которые ссылаются её указатели.

При чтении поступить обратно. Сперва считать структуру. Сразу после этого нельзя будет пользоваться членами с указателями, так как там будет бред. Затем ПРАВИЛЬНО считать другие объекты после структуры, разместить их в памяти и в конце заполнить указатели исходной структуры правильными адресами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.