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