【问题标题】:Is there a way to declare the variables a and b in this code?有没有办法在这段代码中声明变量 a 和 b ?
【发布时间】:2021-05-23 23:34:01
【问题描述】:

我正在尝试在 main 中调用一个函数,以便我的代码将通过我的代码的所有部分执行。现在,当我在 main 中调用 compare_quads 时。我收到未声明 a 和 b 的错误代码。但我的问题是我不知道如何声明变量,因为我已经在我认为可行的代码顶部声明了函数和变量。如果我尝试在 main 中声明变量,例如

const void *a;
const void *b;

然后在编译时收到,警告 a 在此函数中未初始化,与 b 类似。

这是我的代码,

//declare libraries
  #include <string.h>
  #include <stdio.h>
  #include <stdlib.h>
 
  //declare other functions/files to be used in the program
  void print_fun(void);
  void read_fun(void);
  static int compare(int arg, unsigned char networks[arg][4]);
  int compare_quads(const void *a, const void *b);
 
 
  //read command line input and store the information
  int main(int argc, char** argv){
      //declar variable
      int arg = 0;
 
      //make argv into an int
      arg = atoi(argv[1]);
      //assign size to networks
       unsigned char networks[arg][4];
 
      //assign input to networks
      for (int j =0; j<1; ++j){
          if(argc == 1)
               {
                  printf("ERROR ERROR, you messed up\n");
              }
  
         else
         {
          // hold network addresses in a 2-d array, with 4 unsigned char
 
              for(int k = 0; k<arg; k++){
                  for (int i =0; i<4; i++){
 
                  scanf("%hhu.", &networks[k][i]);
                  //checks to see if scanf was working properly
                 // printf(" %hhu",networks[k][i]);
 
              }
                  //printf("\n");
              }}}
 
 
      compare_quads(a, b);
      compare(arg, networks);
 
  return(0);
  }
 
 
  int compare_quads( const void *a, const void *b) {
      return memcmp (a, b, 4);
  }
 
 
  static int compare(int arg, unsigned char networks[arg][4])
  {
 
  qsort(networks, arg, sizeof(networks[0]), compare_quads);
 
      for (int k = 0; k< arg; k++){
          printf("%d.%d.%d.%d\n", networks[k][0],networks[k][1],networks[k][2],networks[k][3]);
          }
          return 0;
 }

我对 c 很陌生,所以如果您需要任何说明,请告诉我。谢谢。

确切的警告是

统一

main.c: In function ‘main’:
main.c:47:19: error: ‘a’ undeclared (first use in this function)
   47 |     compare_quads(a, b);
      |                   ^
main.c:47:19: note: each undeclared identifier is reported only once for each function it appears in
main.c:47:22: error: ‘b’ undeclared (first use in this function)
   47 |     compare_quads(a, b);
      |                      ^

当 const void *a;用于初始化。

main.c: In function ‘main’:
main.c:48:5: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
   48 |     compare_quads(a, b);
      |     ^~~~~~~~~~~~~~~~~~~
main.c:48:5: warning: ‘b’ is used uninitialized in this function [-Wuninitialized]

编辑 我正在接受一个输入文件,该文件具有不同数量的带有网络地址的行,例如

139.72.16.202

我将值存储在一个大小为 [由 arg 设置的变量][4]

的数组中

然后在主要功能之后,我使用其余部分按列对代码进行排序。排序功能运行良好。

【问题讨论】:

  • 您显示的完整代码不包括 a 和 b 的定义。您确实说过您在代码的顶部定义了它们,但呈现的代码没有显示(这涵盖了第一个编译器错误)。第二个提示您确实包含 a 和 b,但在将它们传递给 compare_quads() 函数之前您没有给它们任何值。
  • 你为什么不解释一下你到底想做什么?目前,您正在做的是在您尚未定义的两个变量上调用compare_quads,然后丢弃结果。这对我来说没有任何意义。
  • 我更新了我的问题以解释它的作用。我想把 int compare_quads(const void a, const voidb);正在声明变量。如果没有 compare_quads 函数,排序也不起作用。
  • 在我看来,您根本没有理由在main 中调用compare_quadscompare_quads 的唯一目的是被qsortcompare() 调用(对于一个工作是排序的函数来说,这是一个糟糕的名字)。所以main 中的compare_quads(a, b); 行没有任何意义,也没有任何意义。只需将其删除,然后想想还剩下什么。
  • 如果您在此之后还有更多问题,最好提供一个输入文件来演示问题,并解释结果与您想要的结果有何不同。

标签: c uninitialized-constant


【解决方案1】:

指向compare_quads 函数的指针作为比较函数传递给qsort 函数,因此qsort 将在内部调用它。

因此,您无需在 main 函数中调用 compare_quads。将其传递给qsort 就足够了。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多