如何使用指针变量调用函数?

时间:2018-04-05 22:19:35

标签: c

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

我很困惑,因为带指针的变量是输出  Convert_Geodetic_To_UTM。当我创建函数时,我总是创建具有返回值的函数。我找不到合适的表达式语法。我的意思是我应该插入函数的输出槽?为了不复制,我确实检查了十几个问题,但我能找到的只是“函数指针”,这与我想的不一样。

这只是整个.c文件中的一个函数。要查看完整代码,请参阅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 */

2 个答案:

答案 0 :(得分:5)

首先声明变量并将其地址传递给函数。在函数调用结束时,它们将被填充。

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

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

答案 1 :(得分:1)

在C中有两种主要的返回方式或者&#34;输出&#34;一些价值观。您最习惯使用return关键字返回的内容如下:

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

你可以这样称呼它:ret = func()。但是,有时当函数必须返回多个值时,通常在C中它们通过引用返回参数:

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

您可以通过声明变量然后使用&运算符来获取变量的地址来调用此函数。然后,当调用该函数时,这些值将填充到声明的变量中。

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

这通常在您还必须返回其他错误代码时完成(无论函数是否成功,或者是否因特定错误号而失败)。在这种情况下,将使用return返回错误代码,其他返回值或输出值将通过引用传递。