多维C程序结构

多维C程序结构,c,function,multidimensional-array,gcc-warning,C,Function,Multidimensional Array,Gcc Warning,我有一个用C编写的程序,它是作为多维代码运行的。例如,用户可以通过将宏“DIMENSION”设置为“1”或“2”来选择1D或2D。下面是一个简单的例子: #define DIMENSION 1 #define UNUSED(x) (void)(x) void fun(double *x, double *y); int main() { double *x; double *y; x = calloc(5,sizeof(double)); #if DIMENSION == 2

我有一个用C编写的程序,它是作为多维代码运行的。例如,用户可以通过将宏“DIMENSION”设置为“1”或“2”来选择1D或2D。下面是一个简单的例子:

#define DIMENSION 1
#define UNUSED(x) (void)(x)

void fun(double *x, double *y);
int main()
{
  double *x;
  double *y;

  x = calloc(5,sizeof(double));
#if DIMENSION == 2
  y = calloc(5,sizeof(double));
#elif DIMENSION == 1
  UNUSED(y);
#endif

  fun(x,y);

  free(x);
#if DIMENSION == 2
  free(y);
#endif
  return 0;
}

fun(double *x, double *y)
{
  int i;

  for(i = 0; i < 5; i++)
  {
      x[i] = i;
#if DIMENSION == 2
      y[i] = i;
#endif
  }

}
它似乎抑制了一些警告,但不是全部。这是因为函数“fun”接受y项,即使我没有初始化它?我该如何解决这个问题?理想情况下,通过将“DIMENSION”设置为“1”,代码将在没有警告的情况下编译为1D代码,并且不需要内存开销。建议?谢谢。

试试看

#define DIMENSION 1


#include<cstdlib>
void fun(double *x, double *y);
int main()
{
  double *x = NULL;
  double *y = NULL;

  x =(double*) malloc(5*sizeof(double));
#if DIMENSION == 2
  y =(double*) malloc(5*sizeof(double));
#endif

  fun(x,y);

  free(x);
#if DIMENSION == 2
  free(y);
#endif
  return 0;
}

void fun(double *x, double *y)
{
  int i;
  for(i = 0; i < 5; i++)
  {
      x[i] = i;
#if DIMENSION == 2
      y[i] = i;
#endif
  }

}
#定义尺寸1
#包括
虚无乐趣(双倍x,双倍y);
int main()
{
double*x=NULL;
double*y=NULL;
x=(双*)malloc(5*sizeof(双));
#如果维度==2
y=(双*)malloc(5*sizeof(双));
#恩迪夫
乐趣(x,y);
免费(x);
#如果维度==2
免费(y);
#恩迪夫
返回0;
}
虚无乐趣(双倍x,双倍y)
{
int i;
对于(i=0;i<5;i++)
{
x[i]=i;
#如果维度==2
y[i]=i;
#恩迪夫
}
}

最简单的解决方案就是将y初始化为NULL。这可以让你摆脱所有的
无用的
废话

#define DIMENSION 1

void fun(double *x, double *y);

int main()
{
    double *x;
    double *y = NULL;

    x = calloc(5,sizeof(double));
#if DIMENSION == 2
    y = calloc(5,sizeof(double));
#endif

    fun(x,y);

    free(x);
#if DIMENSION == 2
    free(y);
#endif
    return 0;
}

void fun(double *x, double *y)
{
    int i;

    for(i = 0; i < 5; i++)
    {
        x[i] = i;
#if DIMENSION == 2
        y[i] = i;
#endif
    }
}
#定义尺寸1
虚无乐趣(双倍x,双倍y);
int main()
{
双*x;
double*y=NULL;
x=calloc(5,sizeof(双));
#如果维度==2
y=calloc(5,sizeof(双));
#恩迪夫
乐趣(x,y);
免费(x);
#如果维度==2
免费(y);
#恩迪夫
返回0;
}
虚无乐趣(双倍x,双倍y)
{
int i;
对于(i=0;i<5;i++)
{
x[i]=i;
#如果维度==2
y[i]=i;
#恩迪夫
}
}

您的解决方案可以抑制这些错误,但我仍然在某些应用程序中保留未使用的宏。例如,如果变量的作用域在函数中是局部的,则保留未使用的方法。若一个变量被传递给函数,那个么我会按照你们的建议给它赋值一个NULL。为了进一步说明,我们假设它们是main()中的另一个变量,称之为“double*yprime”。如果“yprime”没有传递到“fun”,那么我使用“UNUSED(yprime);”。但是如果我使用“UNUSED(y)”,它仍然会给出一个警告,因此我现在使用y=NULL;正如您所建议的。最后,将变量赋值为NULL与将其类型转换为void是否与未使用的宏一样?我之前的评论应该是“抑制那些警告”,而不是错误。我错过了编辑的机会。您是否介意评论一下:“最后,将变量赋值为NULL是否与将其类型转换为VOID相同,就像未使用的宏所做的那样?”为什么一种解决方案比另一种更好?请发布您正在讨论的警告。
#define DIMENSION 1

void fun(double *x, double *y);

int main()
{
    double *x;
    double *y = NULL;

    x = calloc(5,sizeof(double));
#if DIMENSION == 2
    y = calloc(5,sizeof(double));
#endif

    fun(x,y);

    free(x);
#if DIMENSION == 2
    free(y);
#endif
    return 0;
}

void fun(double *x, double *y)
{
    int i;

    for(i = 0; i < 5; i++)
    {
        x[i] = i;
#if DIMENSION == 2
        y[i] = i;
#endif
    }
}