是否可以使用预处理器对数组进行排序?

时间:2010-04-13 11:48:16

标签: c sorting gcc c-preprocessor

我有很多很长的数组。没有运行时排序是可能的。手动排序也很耗时。此外,可以在以后以任何顺序添加新元素,因此我想使用 C 预处理器按值对它们进行排序,或者可能有任何编译器标志(GCC)?

例如:

sometype S[] = {
  {somevals, "BOB", someothervals},
  {somevals, "ALICE", someothervals},
  {somevals, "TIM", someothervals},
}
必须对

进行排序:

sometype S[] = {
   {somevals, "ALICE", someothervals},
   {somevals, "BOB", someothervals},
   {somevals, "TIM", someothervals},
}

<小时/> 的解决

好的,这是我的解决方案:

  1. 手动将每个数组复制并粘贴到名为tobesorted.c的临时文件中
  2. 按第二栏排序:sort -b -i --key=2 tobesorted.c
  3. 将输出复制并粘贴回原始文件。
  4. 实际上,有一种可能直接从预处理器调用“排序”会很好(我希望至少GCC能以某种方式支持这些功能,但似乎它没有。)

5 个答案:

答案 0 :(得分:11)

这样做。

  1. 将巨型阵列放入文件中。

  2. 使用内置sort

  3. 对文件进行排序
  4. 编写一个小程序,从文件中创建C代码。编写C程序的C程序很好。您可以使用Python及其中一些很酷的模板包来简化这项工作。

  5. 编译剩余的程序,该程序由转换为C代码的分类文件和程序的其余部分组成。

答案 1 :(得分:5)

不,这是不可能的。您不能使用预处理器执行字符串操作(连接除外)。而且你也无法将字符串与模板元编程进行比较。

[edit]你可以做的是将你的数据结构放在一个文件中,该文件应由外部构建脚本(例如unix“sort”实用程序)预处理,然后修改你的makefile / project以便在构建时生成带有(已排序)初始化数组的C文件

答案 2 :(得分:1)

我不认为你可以在gcc预处理器中做到这一点,从来没有见过可以做你正在寻找的东西。

但你可以用自己喜欢的脚本语言(python,perl,sed等......)编写自己的“预处理器”,在gcc启动之前对这些值进行排序。

答案 3 :(得分:1)

我认为不可能使用预处理器,但您可以使用sort#include的组合来实现所需的效果:

将这些值放入单独的文件values.h 中,排序键位于前面(您需要重新排列struct sometype以获取此值):

{"BOB", somevals, someothervals},
{"ALICE", somevals, someothervals},
{"TIM", somevals, someothervals},

在Makefile中,使用Unix命令sort将该文件排序为values_sorted.h

sort < values.h > values_sorted.h

在实际代码中,包含已排序的文件:

sometype S[] = {
#include "values_sorted.h"
};

答案 4 :(得分:0)

以下内容适用于两个和三个要素:

// Experiment: static sort:

#define STATIC_SORT2(CMP, a, b)    CMP(a,b) <= 0 ?(a):(b), CMP(a,b) <= 0 ? (b):(a),
#define STATIC_SORT3(CMP, a, b, c) \
    (CMP(a,b) <= 0 && CMP(a,c) <= 0 ? (a) : \
     CMP(b,a) <= 0 && CMP(b,c) <= 0 ? (b) : \
     (c)), \
    (CMP(a,b) <= 0 && CMP(a,c) <= 0 ? ( CMP(b,c) <= 0 ? (b) : (c) ) : \
     CMP(b,a) <= 0 && CMP(b,c) <= 0 ? ( CMP(a,c) <= 0 ? (a) : (c) ) : \
     (CMP(a,b) <= 0 ? (a) : (b))), \
    (CMP(a,c) <= 0 && CMP(b,c) <= 0 ? (c) : \
     CMP(a,b) <= 0 && CMP(c,b) <= 0 ? (b) : \
     (a))


// Example:
// #define STATIC_INT_CMP(a,b) ((int)(a) - (int)(b))
// int sorted[] = { STATIC_SORT3(STATIC_INT_CMP, 2, 3, 1 } // gives { 1, 2, 3 }
// #define STATIC_INT_COCMP(a,b) ((int)(b) - (int)(a))
// int cosorted[] = { STATIC_SORT3(STATIC_INT_COCMP, 2, 3, 1 } // gives { 3, 2, 1 }

但我要说很明显,这种方法并不适用于任意大小的数组。 我想这是不可能的,但我仍然没有这个猜想的正式证据。