Re: Převrácení polí charů preprocesorem?

Miroslav Mraz mrazik na volny.cz
Sobota Únor 17 13:45:37 CET 2024


Nemusí to být "nějaká poslední revize", jde to i v C++17, poměrně jednoduše.

#include <cstdio>
static constexpr const char * const original[] = {
     "012",
     "abc",
     "ABC"
};
template<class T, size_t N>constexpr size_t array_size (T (&) [N]) { 
return N; }
template<const int N> class Reorder {
   char data [N][N+1];
   public:
     explicit constexpr Reorder (const char * const in [N]) noexcept {
       for (unsigned i=0; i<N; i++) {
         for (unsigned j=0; j<N; j++) {
           data [i][j] = in[j][i];
         }
         data [i][N] = '\0';
       }
     }
     const char * operator[] (const int n) const {
       return data [n];
     }
};
static const Reorder<array_size(original)> reordered (original);

int main(/*int argc, char *argv[]*/) {
   const size_t m = array_size(original);
   printf("original:\n");
   for (unsigned n=0; n<m; n++) {
     printf("\t%s\n", original[n]);
   }
   printf("reordered:\n");
   for (unsigned n=0; n<m; n++) {
     printf("\t%s\n", reordered[n]);
   }
   return 0;
}

Má to ovšem dost velké mouchy. Clang umí umístit tu instanci reordered 
správně do sekce .rodata, vytváří ji opravdu při překladu. GCC to asi 
udělá až v runtime a umístí jí do .bss, což v malém čipu dost vadí.
Takhle je to jen "čtvercové", šlo by to přepsat na "obdélník", v každém 
případě vstupní stringy musí být stejně dlouhé. Výstup odpovídá:

original:
	012
	abc
	ABC
reordered:
	0aA
	1bB
	2cC


Mrazík

On 17. 02. 24 12:42, Jindroush wrote:
> C preprocesorem urcite ne, neni tam prece zadna moznost, jak krajet 
> retezce na znaky.
> 
> Mozna by to mohlo jit v nejake posledni revizi C++, ale ty konstrukce 
> jsou tak slozite, ze to neumim rict z hlavy.
> 
> Ja tohle resil vzdy pomoci definicniho souboru, generacniho skriptu, co 
> vyblinkal C/H podle potreby a makefile, ktere mi to spravne po sobe 
> pospousti. Je to reseni, ktere funguje vzdy a vsude. Generator dnes 
> urcite python, drive perl.
> 
> J.
> 


Další informace o konferenci Hw-list