Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с загрузкой структуры??

860
11 мая 2003 года
Abell2000
138 / / 15.01.2003
Hi!.
Есть структура состоящая из нескольких массивов общим размером 4346 байт, создаю динамический массив структур т.е. :
struct mystruct {
int value1[100];
double value2[100];
.....
} *data;
data=new mystruct[2];
теперь нужно загрузить из файла данные в эту структуру, делаю так:
FileRead(fHandle,&data[0],4346);
Проблема в том, что первые ~2690 байт грузятся нормально, а остальные нет, т.е. при обращении к массивам (напр. data[0].value[n]) лежащим в области последних 1656 байт получаю полную чушь.
Почему так происходит и как быть?
427
11 мая 2003 года
Glazunov Oleg
79 / / 20.03.2000
Скорее всего это из-за того, что команда FileRead производит побайтовое чтение из файла. Таким образом получается - как записаны данные в файле побайтово, так они тебе и передадутся в структуру. У тебя структура состоит из массивов двух типов int и double, проверь в каком формате записаны данные для второго массива (может они записаны в формате int или еще в каком-нибудь).
989
11 мая 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Abell2000
Hi!.
Есть структура состоящая из нескольких массивов общим размером 4346 байт, создаю динамический массив структур т.е. :
struct mystruct {
int value1[100];
double value2[100];
.....
} *data;
data=new mystruct[2];
теперь нужно загрузить из файла данные в эту структуру, делаю так:
FileRead(fHandle,&data[0],4346);
Проблема в том, что первые ~2690 байт грузятся нормально, а остальные нет, т.е. при обращении к массивам (напр. data[0].value[n]) лежащим в области последних 1656 байт получаю полную чушь.
Почему так происходит и как быть?


Как предположение. В свое время у Борланда размер стека (в отличии от MS) был фиксированым, и при работе с ф-ми (особенно если структуры в другом файле и при подкачке сами по себе жрут памяти немеряно) вылазили аналогичные грабли. Т.е. укороти структуру к твоим 1656 и если считаешь правильно то поэксперементируй с настройками и моделями BCB. Была аналогичная проблема, но времени было мало и я не гимороился - сделал несколько структур, отрабатывал с одной - переходил к следующей (но у меня это было логически можно).

3
11 мая 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Abell2000
Hi!.
Есть структура состоящая из нескольких массивов общим размером 4346 байт, создаю динамический массив структур т.е. :
struct mystruct {
int value1[100];
double value2[100];
.....
} *data;
data=new mystruct[2];
теперь нужно загрузить из файла данные в эту структуру, делаю так:
FileRead(fHandle,&data[0],4346);
Проблема в том, что первые ~2690 байт грузятся нормально, а остальные нет, т.е. при обращении к массивам (напр. data[0].value[n]) лежащим в области последних 1656 байт получаю полную чушь.
Почему так происходит и как быть?



Есть такая штука, как выравнивание. Твоя структура будет занимать место в памяти равное не суммарному размеру всех ее полей, а сумме с учетом выравнивания (обычно выравнивается на DWORD).
Т.о. запись FileRead(fHandle,&data[0],4346);
является неграмотной с точки зрения программирования на С++. Правильно писать так:

FileRead(fHandle, data, sizeof(mystruct[2]));

860
12 мая 2003 года
Abell2000
138 / / 15.01.2003
Цитата:
Originally posted by Green

Есть такая штука, как выравнивание. Твоя структура будет занимать место в памяти равное не суммарному размеру всех ее полей, а сумме с учетом выравнивания (обычно выравнивается на DWORD).
Т.о. запись FileRead(fHandle,&data[0],4346);
является неграмотной с точки зрения программирования на С++. Правильно писать так:

FileRead(fHandle, data, sizeof(mystruct[2]));


Спасибо за совет, проблема действительно в выравнивании, правда sizeof не подходит т.к. данные в файле уже фиксированы по размеру, поэтому пришлось выравнить структуру на 8 битную границу, а проект на DWORD, вроде заработало.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог