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},
}
5 Réponses :
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. P>
[modifier] Ce que vous pourrait em> 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) P>
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. P>
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. P>
fais cela. p>
Mettez votre réseau géant dans un fichier. P> li>
Trier le fichier avec le tri code> p> p> li>
É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. P> li>
compilez le programme restant constitué du fichier trié transformé en code C plus le reste de votre programme. P> LI> ol>
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.
Je peux penser à aucune possibilité d'utiliser le préprocesseur, mais vous pouvez utiliser une combinaison de Mettre juste Les valeurs dans un fichier séparé dans votre maquillage, utilisez la commande UNIX dans votre code actuel, incluez le fichier de tri: p> trier code> et
#include code> pour atteindre l'effet souhaité:
valse.h code> avec la touche de tri en avant em> (vous devrez réorganiser votre
struct certains code> pour cela): p>
Trier code> pour trier ce fichier dans
valide_sorted.h code>: P >
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 }
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.