reading structures
Callisto
structure spe_calib
double offset // +0 offset
double factor
char current_unit
char reserved1
char strings[40]
char reserved2[40]
char calib_valid
char input_unit
char polynom_unit
char polynom_order
char calib_count
double pixel_position[10] // +103 offset
double calib_value[10]
double polynom_coeff[6]
double laser_position
char reserved3
uchar new_calib_flag
char calib_label[81]
char expansion[87]
endstructure
double offset // +0 offset
double factor
char current_unit
char reserved1
char strings[40]
char reserved2[40]
char calib_valid
char input_unit
char polynom_unit
char polynom_order
char calib_count
double pixel_position[10] // +103 offset
double calib_value[10]
double polynom_coeff[6]
double laser_position
char reserved3
uchar new_calib_flag
char calib_label[81]
char expansion[87]
endstructure
By reading the structure from a file the following way
struct spe_calib x_calib
Fbinread/B=3 file, x_calib
Fbinread/B=3 file, x_calib
I get wrong values for "pixel_position", "calib_value", and "polynom_coeff" although the char before them (calib_count) is read correctly.
"pixel_position", "calib_value", and "polynom_coeff" are off by one byte (offset +1). I dont know why.
If I delete a char from the struct (shifting "pixel_position", "calib_value", and "polynom_coeff" by one byte) they are offset-1 off, which is correct because I am reading one char less.
Jumping directly to the offset of "pixel_position", "calib_value", and "polynom_coeff" by fsetpos gives the proper values and deviding the struct into two parts (one before "pixel_position" and the second with the rest) produces also the correct values.
I also had a similar problem when a char like
char calib_label[80]
was read for less then 80 bytes.
Is this a bug in Igor?
Igor structures are 2-byte aligned. This means that any field larger than a single byte will always be at an even offset even if this requires leaving an unused padding byte. Depending on compiler settings a structure may be 1-byte, 2-byte, 4-byte or 8-byte aligned.
If your file is 4-byte or 8-byte aligned then you will need to adjust the Igor structure by adding padding fields. If it is 1-byte aligned then it will be tricky to implement. The details depend on the precise layout of the file structure.
December 8, 2014 at 11:24 am - Permalink