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

C program, struct and functions help

  1. Apr 22, 2010 #1
    Hello, i want to write a function in the form of "float estM( Planet *body);" to calculate radius^3/period^2 for the planet earth, where i have an array of values for radius and period of different planets.
    Here is the program so far, i am getting a -NaN error:

    #include <stdio.h>
    #include <math.h>

    typedef struct pt {
    char *name;
    float period; /* orbital period in years */
    float radius; /* orbital radius in ast units */
    } Planet;

    main() {

    float estM( Planet *body); /* Have been told that the function is of this form to calculate radius^3/period^2 for earth*/

    Planet Earth;
    Planet plist[6];
    int n, i;
    Planet *body;

    char nameMe[]="Mercury", nameV[]="Venus", nameE[]="Earth", nameMa[]="Mars", nameJ[]="Jupiter", nameS[]="Saturn";

    plist[0].name = nameMe;
    plist[0].period = 0.241;
    plist[0].radius = 0.387;

    plist[1].name = nameV;
    plist[1].period = 0.615;
    plist[1].radius = 0.723;

    plist[2].name = nameE; /*Here is info for earth */
    plist[2].period = 1.0;
    plist[2].radius = 1.0;

    plist[3].name = nameMa;
    plist[3].period = 1.881;
    plist[3].radius = 1.524;

    plist[4].name = nameJ;
    plist[4].period = 11.86;
    plist[4].radius = 5.203;

    plist[5].name = nameS;
    plist[5].period = 29.46;
    plist[5].radius = 9.540;

    printf("Planet name\t period\t radius\n");

    for (i=0;i<n;i++) {

    printf("%s\t\t %.3f\t %.3f\n",plist.name, plist.period, plist.radius);


    printf("%f\n",estM(body)); /* I want to calculate radius^3/period^2 for earth */


    float estM( Planet *body) { /*function to caculate radius^3/period^2 for earth */

    float m;
    Planet Earth;
    return m;
  2. jcsd
  3. Apr 22, 2010 #2

    Filip Larsen

    User Avatar
    Gold Member

    Looks like you accidentally left a non-initialized Earth structure in which you point the body pointer to (non-initialized floating point numbers are very likely to give a NaN). You should probably leave out the Earth variable, like

    Code (Text):

    float estM( Planet *body) {     /*function to caculate radius^3/period^2 for earth */
      return pow(body->radius,3)/pow(body->period,2);
    where I have also replaced the (*pointer).member notation with pointer->member. You should then call this function with something sensible, like

    Code (Text):

    printf("%f\n",estM(plist[2])); /* I want to calculate radius^3/period^2 for earth */
    Note, that in your code, the Earth variable in main is again non-initialized and will contain garbage, so either use plist[2] directly to refer to the values for earth (as I did in the above snippet), or declare, say, Earth as "Planet *earth = plist[2];" after the plist declaration and then use "estM(earth)" later. If you want to call estM in your loop you will probably want to call with "estM(plist)".
  4. Apr 23, 2010 #3
    Thanks just did it now, the code i used is:
    in main:

    Planet plist[6];
    Planet *earth;
    int n, i;

    Here i didnt know that i could use a pointer to point to a member in the array, but it makes sense since all the members in the array are of type Planet.

    then my function definition is just:

    float estM( Planet *body) { /*function to caculate radius^3/period^2 for earth */

    return pow(body->radius,3)/pow(body->period,2);

    Thanks again
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook