Создание массива

Тема в разделе "Arduino & Shields", создана пользователем sqafaroff, 6 янв 2021.

  1. b707

    b707 Гуру

    вот именно, что массив и структура - производные типы. То есть точно такие же, как любые другие, какие юзер может сконструировать сам.
    Соответственно и создание методов работы с этими типами - дело пользователя. а не компилятора.
     
  2. AlexU

    AlexU Гуру

    Уж как-нибудь определитесь -- есть такой тип или нет его.
     
  3. AlexU

    AlexU Гуру

    При разработке программ (не зависимо от языка программирования) самой сложной задачей является придумывание имён (идентификаторов) декларациям. С одной стороны имя должно быть коротким, а с другой -- беглого взгляда на код должно быть достаточно, чтобы понять для чего та или иная декларация нужна.
    Для чего нужны поля:
    Код (C++):
    uint8_t  data_size;
    и
    Код (C++):
    uint8_t  dataSize;
    ?
     
  4. SergeiL

    SergeiL Оракул Модератор

    Вообще не понял... А как у меня нельзя? :)
    А почему не
    Код (C++):
    uint8_t  dtSz;
     
  5. parovoZZ

    parovoZZ Гуру

    это и есть
     
  6. AlexU

    AlexU Гуру

    Почему же нельзя -- можно.
    Это была мысль "в сторону".
     
  7. parovoZZ

    parovoZZ Гуру

    можно. Но только зачем здесь sizeof(), если утилита конвертации это сделает сама по шаблону. Т.е. мне вынести размерность массива из скобок [] в отдельную константу - просто подправить шаблон.
     
  8. parovoZZ

    parovoZZ Гуру

    намедни @SergeiL делился ссылкой на статью о "грамотном" оформелении кода. Здесь же, я так понимаю, несущее смысл название переменной уже занято, поэтому придумалось то, что придумалось.
     
  9. parovoZZ

    parovoZZ Гуру

    а жаль, что такое на сях нельзя сотворить:

    Код (C++):
    typedef struct
    {
        const uint8_t  data[];
        uint8_t         width;
        uint8_t         count;
    } ImageChar_t;
     
  10. b707

    b707 Гуру

    поясни мне смысл вот этой строчки:
    Код (C++):
    const uint8_t  data[];
     
    Andrey12, Feofan и SergeiL нравится это.
  11. SergeiL

    SergeiL Оракул Модератор

    Да уж, понимание еще не пришло, но уже прет от крутости.:)
    Эффект Даннинга — Крюгера, он на пике :)
     
  12. akl

    akl Гуру

    дак по идее можно так. только надо циферку в [] написать чтобы оно понимало сколько там будет байтов.
     
    Andrey12 нравится это.
  13. Asper Daffy

    Asper Daffy Иксперд

    Почему нельзя???

    Это лохам нельзя, а нормальным пацанам и не такое можно! Барабан Страдивари ещё никто не отменял! Если, конечно, правильно написать.

    И, кстати, этот вопрос (про массив неопределённой длины в структуре) встречаю второй раз за несколько дней, а раньше не встречал никогда - это чё, поветрие такое?

    На, изучай - http://arduino.ru/forum/pesochnitsa...namicheskii-massiv-v-strukturu#comment-580825, хотя - это жуткий говнокод.
     
  14. akl

    akl Гуру

    ||=== Build: Debug in pst (compiler: GNU GCC Compiler) ===|
    C:\Program Files\CodeBlocks\pst\main.cpp|20|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|
    C:\Program Files\CodeBlocks\pst\main.cpp|28|error: too many initializers for 'const char* [0]'|
    ||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

    а если в скобках циферку поставить, то компилится и работает, но все равно пишет что
    extended initializer lists only available with -std=c++11 or -std=gnu++11
     
  15. b707

    b707 Гуру

    const уберите
     
  16. akl

    akl Гуру

    еще хуже стало
    ||=== Build: Debug in pst (compiler: GNU GCC Compiler) ===|
    C:\Program Files\CodeBlocks\pst\main.cpp|20|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|
    C:\Program Files\CodeBlocks\pst\main.cpp|28|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
    C:\Program Files\CodeBlocks\pst\main.cpp|28|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
    C:\Program Files\CodeBlocks\pst\main.cpp|28|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
    C:\Program Files\CodeBlocks\pst\main.cpp|28|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
    ||=== Build finished: 0 error(s), 5 warning(s) (0 minute(s), 0 second(s)) ===|
     
  17. b707

    b707 Гуру

    код целиком покажите
     
  18. akl

    akl Гуру

    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    struct TMenu {
      char ItemCount;
      char SelectItem;
      char LastActiveItem, LastTopItem;
      char *ItemName[12];
    };

    TMenu Menu1 {
      4, 0, 0, 0,
      {
        "Item1",
        "Item2",
        "Item3",
        "Item4",
      }
    };

    int main() {
        printf("%s\n",Menu1.ItemName[0]);
    }
     
    это наверно потому что у меня компилятор какой-то старый паленый
     
    Последнее редактирование: 12 янв 2021
  19. b707

    b707 Гуру

    а так:
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef struct {
      char ItemCount;
      char SelectItem;
      char LastActiveItem, LastTopItem;
      char *ItemName[12];
    } TMenu;

    TMenu Menu1 = {
      4, 0, 0, 0,
      {
        "Item1",
        "Item2",
        "Item3",
        "Item4",
      }
    };

    int main() {
        printf("%s\n",Menu1.ItemName[0]);
    }
    у меня собирается без ошибок и работает

    компилятор довольно старый:
    gcc version 4.7.2 20120921 Red Hat linux x64
     
  20. akl

    akl Гуру

    а всё понял кажется. значек = нужен при инициализации структуры
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    struct TMenu {
      char ItemCount;
      char SelectItem;
      char LastActiveItem, LastTopItem;
      const char *ItemName[12];
    };

    TMenu Menu1 = {
      4, 0, 0, 0,
        {
            "Item1",
            "Item2",
            "Item3",
            "Item4",
        }
    };

    int main() {
        printf("%d\n",Menu1.ItemCount);
        for(int i=0;i<Menu1.ItemCount;i++){
            printf("%s\n",Menu1.ItemName[i]);
        }
    }
    но это тонкости, а суть в том, что если в const char *ItemName[ ]; циферку не поставить, то выдает ошибку хоть в начале структуры хоть в конце оно стоит

    да только что допер