简体   繁体   中英

How do I call a function with pointer variable?

long Convert_Geodetic_To_UTM (double Latitude,
                          double Longitude,
                          long   *Zone,
                          char   *Hemisphere,
                          double *Easting,
                          double *Northing);

I'm confused because variables with pointers are outputs of Convert_Geodetic_To_UTM . When I create functions, I always create ones with return values. I cannot find the appropriate expression syntax. I mean what am I supposed to insert to an output slot of a function? I did check a dozen of questions in order not to duplicate, but all I could find was "function pointers" which isn't the same thing I think.

This is only one function from an entire .c file. To view full code, refer to this github link.

long Convert_Geodetic_To_UTM (double Latitude,
                          double Longitude,
                          long   *Zone,
                              char   *Hemisphere,
                              double *Easting,
                              double *Northing)
    {
/*
 * The function Convert_Geodetic_To_UTM converts geodetic (latitude and
 * longitude) coordinates to UTM projection (zone, hemisphere, easting and
 * northing) coordinates according to the current ellipsoid and UTM zone
 * override parameters.  If any errors occur, the error code(s) are returned
 * by the function, otherwise UTM_NO_ERROR is returned.
 *
 *    Latitude          : Latitude in radians                 (input)
 *    Longitude         : Longitude in radians                (input)
 *    Zone              : UTM zone                            (output)
 *    Hemisphere        : North or South hemisphere           (output)
 *    Easting           : Easting (X) in meters               (output)
 *    Northing          : Northing (Y) in meters              (output)
 */

  long Lat_Degrees;
  long Long_Degrees;
  long temp_zone;
  long Error_Code = UTM_NO_ERROR;
  double Origin_Latitude = 0;
  double Central_Meridian = 0;
  double False_Easting = 500000;
  double False_Northing = 0;
  double Scale = 0.9996;

  if ((Latitude < MIN_LAT) || (Latitude > MAX_LAT))
  { /* Latitude out of range */
    Error_Code |= UTM_LAT_ERROR;
  }
  if ((Longitude < -PI) || (Longitude > (2*PI)))
  { /* Longitude out of range */
    Error_Code |= UTM_LON_ERROR;
  }
  if (!Error_Code)
  { /* no errors */
    if((Latitude > -1.0e-9) && (Latitude < 0))
      Latitude = 0.0;
    if (Longitude < 0)
      Longitude += (2*PI) + 1.0e-10;

    Lat_Degrees = (long)(Latitude * 180.0 / PI);
    Long_Degrees = (long)(Longitude * 180.0 / PI);

    if (Longitude < PI)
      temp_zone = (long)(31 + ((Longitude * 180.0 / PI) / 6.0));
    else
      temp_zone = (long)(((Longitude * 180.0 / PI) / 6.0) - 29);

    if (temp_zone > 60)
      temp_zone = 1;
    /* UTM special cases */
    if ((Lat_Degrees > 55) && (Lat_Degrees < 64) && (Long_Degrees > -1)
        && (Long_Degrees < 3))
      temp_zone = 31;
    if ((Lat_Degrees > 55) && (Lat_Degrees < 64) && (Long_Degrees > 2)
        && (Long_Degrees < 12))
      temp_zone = 32;
    if ((Lat_Degrees > 71) && (Long_Degrees > -1) && (Long_Degrees < 9))
      temp_zone = 31;
    if ((Lat_Degrees > 71) && (Long_Degrees > 8) && (Long_Degrees < 21))
      temp_zone = 33;
    if ((Lat_Degrees > 71) && (Long_Degrees > 20) && (Long_Degrees < 33))
      temp_zone = 35;
    if ((Lat_Degrees > 71) && (Long_Degrees > 32) && (Long_Degrees < 42))
      temp_zone = 37;

    if (UTM_Override)
    {
      if ((temp_zone == 1) && (UTM_Override == 60))
        temp_zone = UTM_Override;
      else if ((temp_zone == 60) && (UTM_Override == 1))
        temp_zone = UTM_Override;
      else if ((Lat_Degrees > 71) && (Long_Degrees > -1) && (Long_Degrees < 42))
      {
        if (((temp_zone-2) <= UTM_Override) && (UTM_Override <= (temp_zone+2)))
          temp_zone = UTM_Override;
        else
          Error_Code = UTM_ZONE_OVERRIDE_ERROR;
      }
      else if (((temp_zone-1) <= UTM_Override) && (UTM_Override <= (temp_zone+1)))
        temp_zone = UTM_Override;
      else
        Error_Code = UTM_ZONE_OVERRIDE_ERROR;
    }
    if (!Error_Code)
    {
      if (temp_zone >= 31)
        Central_Meridian = (6 * temp_zone - 183) * PI / 180.0;
      else
        Central_Meridian = (6 * temp_zone + 177) * PI / 180.0;
      *Zone = temp_zone;
      if (Latitude < 0)
      {
        False_Northing = 10000000;
        *Hemisphere = 'S';
      }
      else
        *Hemisphere = 'N';
      Set_Transverse_Mercator_Parameters(UTM_a, UTM_f, Origin_Latitude,
                                         Central_Meridian, False_Easting, False_Northing, Scale);
      Convert_Geodetic_To_Transverse_Mercator(Latitude, Longitude, Easting,
                                              Northing);
      if ((*Easting < MIN_EASTING) || (*Easting > MAX_EASTING))
        Error_Code = UTM_EASTING_ERROR;
      if ((*Northing < MIN_NORTHING) || (*Northing > MAX_NORTHING))
        Error_Code |= UTM_NORTHING_ERROR;
    }
  } /* END OF if (!Error_Code) */
  return (Error_Code);
} /* END OF Convert_Geodetic_To_UTM */

You declare the variables first and pass their addresses into the function. At the end of the function call they will be populated.

long zone;
char hem;
double easting;
double northing;

Convert_Geodetic_To_UTM(35.123,-70.321, &zone, &hem, &easting, &northing);

In C there are two major ways to return or "output" some values. What you are most accustomed to would be returning using the return keyword, like so:

int func() {
    return 0; // Like this
}

And you would call it like this: ret = func() . However, sometimes when a function has to return multiple values, typically in C they return by reference to the parameters:

void func2(int* a, bool* b) {
    *a = 1;
    *b = 2;
}

And you would call this function by declaring the variables and then using the & operator to get the address of the variable. Then when the function is called, the values will be populated into the declared variables.

int a;
bool b;
func2(&a, &b);

This is typically done when also you have to return an additional error code (whether if the function succeeds, or fails with a particular error number). In that case, the error code would be returned using return and the other return or output values will be passed by reference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM