The far versions of the pgm_read functions take a 32bit value of the memory to read. Are you passing it a 32bit value? You don't include your class declaration, so I can't see what your variables are declared as, but a number of your methods are returning ints, which are not only 16 bit types, but signed 16 bit types.
Any variables that are going to be used to passed to the pgm_read_xxx_far functions must be declared as unsigned longs, and any values assigned to those variables also have to retain their unsigned long value.
It is important to ALWAYS be aware of the range of values you are working with, and the range of values the variables you are using can contain.