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

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

  1. b707

    b707 Гуру

    конечно.

    Сами подумайте. запись типа
    char aa[]
    имеет смысл только с одновременнойй инициализацией, вот так:
    char aa[] = "Hello";

    а без инициализации как компилятор поймет. какого размера строку создать?
     
  2. Asper Daffy

    Asper Daffy Иксперд

    В Arduino IDE С++11 стоит из коробки (а себе, так я сразу ставлю С++17, там много вкусняшек). Вы же компилируете под старые стандарты С++ в которых такого не было. Не знаю зачем Вы пользуетесь старым стандартом и почему боитесь современных, но да, до 11-го это как следует не работает.

    Хотя, один хрен, такие фокусы - говнокод.
     
    parovoZZ нравится это.
  3. Asper Daffy

    Asper Daffy Иксперд

    Судя по сообщению, он всё понимает, просто поставьте ему опцию -std=c++11 (а лучше -std=c++17 или -std=c++1z). Там же много чего реально полезного.
     
    Последнее редактирование: 12 янв 2021
  4. parovoZZ

    parovoZZ Гуру

    а зачем мне массив указателей? Речь про SizeOf() и невозможности его применений к объекту через указатель на него.
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Не понял.

    Ты чего написал?
    Т.е. ты считаешь, что нельзя сделать структуры с массивом переменной длины или что? Ну, я показал тебе как это делается. Что-то не так?

    Там был массив переменной длинны. Ну, да указателей. Ты хочешь, чтобы я для тебя char* на uint8_t заменил в примере? А сам? Никак?

    Массив переменной длинны он и есть массив переменной длинны, хоть указателей, хоть чисел. И то и другое можно делать.

    Или я что-то не так понял?
     
  6. parovoZZ

    parovoZZ Гуру

    я хочу вот так:
    Код (C++):
    sizeof (&ImageChar.data)
    sizeof() - статический оператор?
     
  7. akl

    akl Гуру

    у меня не сработало. говорит ошибку
     
  8. SergeiL

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

    А если подумать?
    Попытаться разложить на то, что передается в sizeof?
     
  9. akl

    akl Гуру

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

    struct TMenu {
      char arrsize;
      char arr[12];
    };

    TMenu Menu1 = {
      sizeof(Menu1.arr),"DZIGURDA"
    };

    int main() {
        printf("%s\n",Menu1.arr);
        printf("%d\n",Menu1.arrsize);
    }
     
  10. akl

    akl Гуру

    кстати заметил прикольную хрень - если в структуре эта первая переменная будет не чар, а инт - то sizeof(Menu1) становится кратным 4. а если чар - то какой угодно может быть
     
  11. AlexU

    AlexU Гуру

     
    vvr нравится это.
  12. Asper Daffy

    Asper Daffy Иксперд

    Ну, у Вас древний компилятор (вернее опции на древний стандарт языка), мы же уже разобрались с этим.
     
  13. Asper Daffy

    Asper Daffy Иксперд

    А в том посте по "нельзя сделать" ты про sizeof ничего не писал.

    Давай ты приведёшь более развёрнутый пример чего хочешь, а то я не понимаю, что тут за переменные и опять тебе чёнить не то покажу. Опиши целиком, а я посмотрю.
     
  14. parovoZZ

    parovoZZ Гуру

    есть такие данные:
    Код (C++):
    static const uint8_t image_data_Cyrillic_Pixel_0xff[] = {
        0xe0, 0xe0, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x1c, 0x1f, 0x02, 0x1f, 0x1f, 0x1f, 0x00
    };
    static const ImageChar_t Cyrillic_Pixel_0xff = { image_data_Cyrillic_Pixel_0xff,
        7, 14};
    Доступ к ним через поля структуры:
    Код (C++):
    typedef struct
    {
        const uint8_t*  data;
        uint8_t         width;
        uint8_t         count;
    } ImageChar_t;
    Здесь пелись дифирамбы о sizeof(). Так вот вопрос: как через sizeof() получить количество элементов в массиве, чтобы ими не занимать память. В принципе, можно обойтись и вообще одним массивом данных:
    Код (C++):
    static const uint8_t image_data_Cyrillic_Pixel_0xff[] = { 0x07,     // <- данные о ширине
        0xe0, 0xe0, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x1c, 0x1f, 0x02, 0x1f, 0x1f, 0x1f, 0x00
    };
     
    Но что тогда делать, если эти данные упаковать в ещё один массив с целью доступа к ним по индексу?
    Код (C++):

    typedef struct
    {
    uint8_t code;
    const ImageChar_t* image;
    } Char_t;

    static const Char_t Cyrillic_Pixel_array[] = {

    #if (0x0 == 0x0)
      // character: 'я'
      {0xff, &image_data_Cyrillic_Pixel_0xff},
    #else
      // character: 'я' == ''
      {0xff, &image_data_Cyrillic_Pixel_0x},
    #endif

    /* {...} */
     
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Ну, дорогой, ты хочешь странного - понаставил указателей (ImageChar_t* image;), берёшь от них sizeof и хочешь, чтобы он тебе размер массива выдал? sizeof выдаёт размер того, что ты ему подсунул. Подсунул указатель, значит размер указателя. А уж на что он у тебя указывает - это sizeof'a не касается.
     
  16. akl

    akl Гуру

    а я вот не согласен! не должно быть такого, что стоящий в конце структуры массив может быть неопределенного размера. Поэтому мой компилятор прав когда на это ругается, а если какой-то не ругается - то мне кажется что это какой-то баг, который может привести к проблемам.
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Так Вы правы. Я же говорил = говнокод. Основан он на небольшой дыре в стандарте, которая появилась не так давно и скоро её закроют :) Так-то, на самом деле, Вы правы, в стандарте прямо сказано: "Non-static data members shall not have incomplete types". А маиссив без размера - это incomplete type и есть.
     
  18. parovoZZ

    parovoZZ Гуру

    Хотел тут для attiny841 (лежит парочка - выкинуть просто жалко) написать код, который тупо читает данные из флеш по адресу ячейки. Вылез огромный хе... Почему? Почему оно работатет только через
    pgm_read_word()
    ПОЧЕМУ?
    На attiny 0-ой и 1-ой серии с доступом по адресу всё без проблем. На MSP430 тоже.