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

Pavel Hudeček edizon na seznam.cz
Sobota Únor 17 14:09:41 CET 2024


No mě nakonec napadlo, že stačí je prohodit souřadnice čtení toho pole a 
tím se celej problém vyřeší:-)

Ale díky za ukázku toho, že ta transpozice jde, třeba se bude hodit 
někdy jindy na něco jiného.

Obecně jsem teda hlavně u GCC pro AVR narazil na problém, že tam mnoho 
C++ knihoven prostě není. Takže třeba std::atomic, což by se zrovna 
často hodilo, tak smůla. String, vector, taky smůla, ...

PH

Dne 17.02.2024 v 13:45 Miroslav Mraz napsal(a):
> 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.


Další informace o konferenci Hw-list