Проблемы с загрузкой структуры??
Есть структура состоящая из нескольких массивов общим размером 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 байт получаю полную чушь.
Почему так происходит и как быть?
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. Была аналогичная проблема, но времени было мало и я не гимороился - сделал несколько структур, отрабатывал с одной - переходил к следующей (но у меня это было логически можно).
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]));
Есть такая штука, как выравнивание. Твоя структура будет занимать место в памяти равное не суммарному размеру всех ее полей, а сумме с учетом выравнивания (обычно выравнивается на DWORD).
Т.о. запись FileRead(fHandle,&data[0],4346);
является неграмотной с точки зрения программирования на С++. Правильно писать так:
FileRead(fHandle, data, sizeof(mystruct[2]));
Спасибо за совет, проблема действительно в выравнивании, правда sizeof не подходит т.к. данные в файле уже фиксированы по размеру, поэтому пришлось выравнить структуру на 8 битную границу, а проект на DWORD, вроде заработало.