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