Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran structures

  1. Jan 29, 2007 #1
    Hi - I expect this is quite a simple question.

    What are fortran structures? I'm trying to convert fortran code into matlab and I don't know what a structure / endstructure statement is.


    structure /pixel/
    INTEGER*4 cl
    INTEGER*4 rw
    INTEGER*4 x
    INTEGER*4 y
  2. jcsd
  3. Jan 29, 2007 #2
    A structure is a defined block of related variables, a feature common to many languages. I am not sure about Fortran structure specifically, but it appears that you have structure called "pixel" that allows you to define specific instances of a pixel with the characteristics of cl, rw, x and y. Somewhere in the code there will be a statement that instantiates a pixel instance, eg something like "myPixel pixel.....". "myPixel" is then the name of your pixel instance, and the pixel members for "myPixel" will likely be identified as "myPixel.cl", "myPixel.rw", myPixel.x" and "myPixel.y". For example, "myPixel.x = 100" and "myPixel.y = 200" will establish the x-y coordinates for the "myPixel" pixel.

    Last edited by a moderator: Jan 29, 2007
  4. Jan 30, 2007 #3

    jim mcnamara

    User Avatar

    Staff: Mentor

    Here is the same thing in C. I have not done MATLAB in so long I'd be afraid to post anything that purports any relationship.
    Code (Text):

    typedef union
            long cl;
            long rw;
          } s1;
            long x;
            long y;
          } s2;
    } pixel_t;

    pixel_t pix;
    It's a union of two structs.
  5. Feb 1, 2007 #4
    So what is the point in this?:surprised

    Do I have to have structures? Can't I just use an array somehow?
  6. Feb 1, 2007 #5
    Thanks for your help by the way :)
  7. Feb 1, 2007 #6


    User Avatar
    Science Advisor
    Homework Helper

    No you don't have to use structures (and that particular union of two structures seems rather complicated, for what it actually does).

    The point of structures is to logically group a set of data items together so you can refer to the group by one name - for instance

    pixel p1,p2, pfun() // pfun is a function that returns a pixel structure
    p1 = p2
    call sub(p1)
    p2 = pfun(1,2,3)

    Yes you could do all this without using structures - except for the function return. But if you had a structure with 20 elements not 2, the code would be about 20 times longer.
  8. Feb 1, 2007 #7
    Yes you can probably manage with an array, depending on the complexity of the problem. eg, something like:

    INTEGER pixel(4)
    * then address the members as element of the array
    cl = pixel(1)
    rw= pixel(2)
    x = pixel(3)
    y = pixel(4)
  9. Feb 2, 2007 #8

    jim mcnamara

    User Avatar

    Staff: Mentor

    ..thought C would help. :)

    In English, not computer, the FORTRAN code means the following:
    cl occupies the exact same memory location as does x
    rw does the same with y
    cl, rw, x, and y are all signed integers - 32 bit int -- what INTEGER*4 means.

    Your array does not seem to do all that - ie., overlap memory. I'm assuming INTEGER pixel(4) creates four elements in vector of 32 bit signed ints.
  10. Feb 2, 2007 #9
    Hi jim

    Yes, the array method does not physically overlap in memory the elements cl with x, and rw with y. cammo12, that is what the union does in your original code.
    Without structures or unions this can be achieved in FORTRAN by using "equivalence". However, equivalence will not work with members from the same array. So if this type of union is required then two arrays will have to be created:

    integer pixelx(2),pixely(2)
    equivalence (pixelx(1),pixely(1)), (pixelx(2),pixely(2))
    etc, etc

    This may not help with the Matlab translation, but hopefully jim's C example and the explanations may help cammo12 to interpret the Fortran snippet.

    Last edited by a moderator: Feb 2, 2007
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook