Cast fpos_t to int or char

10,617

Solution 1

You're misusing that type. First, it doesn't represent a length. It represents a position. Second, it's only meant to use in a call to fsetpos. You're not meant to do arithmetic on it because it doesn't necessarily represent a numeric type. It contains whatever information your library needs to be able to perform an fsetpos operation. In your library's implementation, fpos_t appears to be an aggregate type, such as a struct. (You can check the definition in the header files to be sure, but don't rely on whatever you discover there; it's liable to differ on other platforms or in future versions of your standard library.)

As for your next step, consider asking a more direct question about how to solve whatever problem you were working on when you came up with the idea to do bitwise operations on a fpos_t.

Solution 2

I was getting the same error when i was trying to do this: char aux = (char)flen & 15, where flen was fpos_t. I found a solution here: http://dsmarkchen.blogspot.com.br/2008/08/fpost.html . It should be: char aux = flen.__pos & 15.

Solution 3

It sounds like you want to work with current file position as an integer. If so, you'll probably want to use ftell/fseek (or their 64-bit brethren), rather than fgetpos/fsetpos. Both serve analogous operations, but ftell/fseek work with integral values, while fgetpos/fsetpos work with an intentionally-abstract structure.

Share:
10,617
sj755
Author by

sj755

Updated on June 04, 2022

Comments

  • sj755
    sj755 almost 2 years

    I'm working with a function that uses bitwise operations with the length of a file: fpos_t flen;

    When I try casting it to an int or char, or attempt on arithmetic operation on it, it fails with the following compilation error: error: aggregate value used where an integer was expected

  • sj755
    sj755 over 12 years
    I went through gdb. In linux (Fedora 15), there is a member variable called __pos, that appears to hold the length. I'm thinking maybe the author was going for this originally.
  • Rob Kennedy
    Rob Kennedy over 12 years
    Maybe. But there's no guarantee that the __pos member means what you or the other author think it means.
  • sj755
    sj755 over 12 years
    I asked the guy who gave me the code. He said it compiled just fine under Solaris when he used it a few years back. I installed Solaris 11 on VMWare, compiled the program, and found that fpos_t is an integer type. In other words, fpos_t on Solaris is the same thing as fpos_t.__pos on Linux. I've since changed the code, got it to compile, and found that it works correctly.
  • rwst
    rwst about 5 years
    Again, this is not guaranteed to work on every machine (see above).