7
votes

Est-il possible de trier les tableaux en utilisant le préprocesseur?

J'ai un certain nombre de très longs tableaux. Aucune sorte de temps d'exécution n'est possible. Cela prend également du temps pour les trier manuellement. De plus, de nouveaux éléments peuvent être ajoutés dans n'importe quel ordre plus tard, je voudrais donc les trier par valeur en utilisant C STRORT> PreProcesseur ou peut-être un drapeau des compilateurs (GCC)?

Par exemple: P>

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


1 commentaires

Puisque vous pouvez #include tout fichier sur n'importe quelle ligne, vous pouvez faire SIMEType S [] = {\ n # Inclure "Trié_array_elements.txt" \ n}; et ne pas vous embêter avec copier / coller, ce qui prend du temps et peut parfois se tromper.


5 Réponses :


6
votes

Non, ce n'est pas possible. Vous ne pouvez pas faire des opérations de chaîne (autres que la concaténation) avec le préprocesseur. Et vous ne pouvez pas comparer des chaînes avec métaprogrammation de modèle, non plus.

[modifier] Ce que vous pourrait faire est de mettre votre source de données dans un fichier destiné à être préparé par un script de construction externe (par exemple, l'utilitaire UNIX "Trier"), puis modifier votre makingfile / Projet de sorte que, à la hauteur de la construction, vous générez un fichier C avec les tableaux initialisés (triés)


0 commentaires

2
votes

Je ne pense pas que vous puissiez le faire dans le préprocesseur de la GCC, n'avez jamais vu quelque chose qui pourrait faire ce que vous recherchez.

Mais vous pouvez écrire votre propre "préprocesseur" dans votre langage de script préféré (Python, Perl, SED, etc.) qui trierait ces valeurs avant que GCC ne frappe.


0 commentaires

12
votes

fais cela.

  1. Mettez votre réseau géant dans un fichier.

  2. Trier le fichier avec le tri

  3. Écrivez un petit programme pour créer un code C dans le fichier. Un programme C qui écrit des programmes C est bon. Vous pouvez utiliser Python et quelques-uns des packages de modèle Cool pour rendre ce travail plus simple.

  4. compilez le programme restant constitué du fichier trié transformé en code C plus le reste de votre programme.


5 commentaires

Et modifiez votre maquette pour faire tout cela automatiquement.


3 alt. Chargez le fichier et créez le tableau dans le programme au démarrage, aucun tri requis.


@Tobias: Je ne peux pas utiliser le temps d'exécution (car il s'agit d'un système intégré et d'une startup très rapide est requise)


Je ne peux pas utiliser les applications externes pour trier, en raison du système de contrôle de révision spécifique. Je peux faire tout cela pour moi-même, mais je dois mettre à jour des fichiers dans le système de révision (et je ne peux pas insérer aucun fichier py / sh).


@psihodelia: OK, j'ai simplement suggéré que vous construiriez la matrice dans le fichier au début et que le fichier doit être trié avant qu'il ait été ouvert. Mais peut-être que ce serait trop lent aussi.



2
votes

Je peux penser à aucune possibilité d'utiliser le préprocesseur, mais vous pouvez utiliser une combinaison de trier et #include pour atteindre l'effet souhaité:

Mettre juste Les valeurs dans un fichier séparé valse.h avec la touche de tri en avant (vous devrez réorganiser votre struct certains pour cela): xxx

dans votre maquillage, utilisez la commande UNIX Trier pour trier ce fichier dans valide_sorted.h : xxx

dans votre code actuel, incluez le fichier de tri: xxx


0 commentaires

1
votes

Les suivants ont fonctionné pour deux et trois éléments:

// 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 }


0 commentaires