【问题标题】:Using array from main in function ( C )在函数 ( C ) 中使用 main 中的数组
【发布时间】:2013-11-27 11:00:35
【问题描述】:

有什么方法可以在另一个函数中使用 main() 中定义的静态数组,而不将其作为参数提供给函数?

例如:

main() 定义了数组:

int Array[10];

用整数填充。我想为 qsort 创建一个比较函数,它必须有这个标题:

int compar (const void* a, const void* b);

我希望它做出这样的决定:

if Array[a]<Array[b] return 1

等等……

这个数组不能直接给qsort,而是精确排序所必需的。

此外,这个数组必须是静态的(不能重新分配)。

有人有什么想法吗?

【问题讨论】:

    标签: c arrays qsort


    【解决方案1】:

    qsort 需要数组的地址,所以你别无选择。但是数组在哪里定义,这并不重要。你只需要能够参考它。

    qsort 签名是:

       void qsort(void *base, size_t nmemb, size_t size,
                  int (*compar)(const void *, const void *));
    

    所以你可以这样称呼它:

    qsort(Array, 10, sizeof(int), compar);
    

    您将照常执行比较功能:

    int compar (const void* a, const void* b) {
        return *((int*)a) - *((int*)b);
    }
    

    您需要了解传递给compar 的值不是索引,而是数组单元格的地址。所以你不必使用compar函数中的Array,你已经拥有了你需要的东西。

    【讨论】:

      【解决方案2】:

      当然,唯一的方法是让数组的地址作为全局变量可用。

      即使数组本身在main() 内也是可能的,但您必须将全局初始化为适当范围的地址,并注意生命周期,当然。

      int *mains_array;
      
      static int qsort_callback(const void *a, const void *b)
      {
        /* use mains_array */
      }
      
      int main(void)
      {
        int secret_array[100];
      
        mains_array = secret_array;
        qsort(something, something, qsort_callback);
      }
      

      这是一个非常丑陋的解决方案,应该多加考虑。

      【讨论】:

        【解决方案3】:

        您不能从另一个函数访问局部变量。您需要将其设为全局或文件范围。

        全球:

        /* Declare Array outside any function */
        int Array[10];
        
        int main(...
        

        或者,文件范围:

        /* Declare Array outside any function */
        static int Array[10];
        
        int main(...
        

        注意:

        您的比较函数将接收到要比较的元素的指针。如果要对 int 数组进行排序,则需要取消引用比较函数中的指针:

        我假设Array 不是您要排序的数组,而是一个包含有关如何对数组进行排序的信息的数组。

        int compare (const void * ap, const void * bp)
        {
            int a = *((int*)ap);
            int b = *((int*)bp);
        
            if (Array[a] < Array[b]) {
              return 1;
            }
            if (Array[a] > Array[b]) {
              return -1;
            }
            return 0;
        }
        

        【讨论】:

          【解决方案4】:

          你已经通过调用给他你的数组

          qsort (a, numberOfElements, sizeOfEachElement, compare);
          

          您需要在比较函数中执行以下操作:

          int compare (const void * a, const void * b)
          {
              //Here int can be other type
              return ( *(int*)a - *(int*)b );
          }
          

          【讨论】:

          • 这正是我想要避免的。了解我,我不需要按其项目的值对数组进行排序。此特定数组仅包含另一个数组中的索引,需要对其进行排序。
          • 所以您要同时对两个数组进行排序? (例如:一个是排序的,另一个是通过修改索引来模仿变化的)
          猜你喜欢
          • 1970-01-01
          • 2015-05-12
          • 2021-01-28
          • 1970-01-01
          • 2022-06-20
          • 1970-01-01
          • 2020-09-19
          • 1970-01-01
          • 2011-11-22
          相关资源
          最近更新 更多