При передачи массива в функцию, размер массива теряется...

Тема в разделе "Arduino & Shields", создана пользователем WhiteFox, 24 фев 2021.

Метки:
  1. WhiteFox

    WhiteFox Нерд

    При передачи массива в функцию, размер массива теряется,
    тоесть getArrayLength(arrayList) == 2, а должен == 50.
    Как это исправить?

    Код (C++):
    byte arrayList[50];

    void setup() {
      Serial.begin(9600);
    }
    //sizeof(arrayList)/sizeof(byte)

    void loop() {
      Serial.println(getArrayLength(arrayList));
      Serial.println();
      delay(1000);
    }

    unsigned int getArrayLength(byte arrayList[]) {
      return sizeof(arrayList) / sizeof(byte);
    }
     
     
  2. akl

    akl Гуру

    sizeof так не работает. нельзя просто так взять и передать в sizeof() нечто через указатель. потому что оно и вернет размер указателя, а не того на что он указывает.

    короче sizeof это что-то вроде макроса, то есть оно работает во время компиляции, а не как нормальные функции
     
    Последнее редактирование: 24 фев 2021
    arkadyf, Andrey12 и WhiteFox нравится это.
  3. WhiteFox

    WhiteFox Нерд

    А как это можно исправить?
     
  4. akl

    akl Гуру

    или вместо getArrayLength везде использовать (sizeof(arrayList)/sizeof(byte)) где arrayList это непосредственно тот массив.
    или еще проще - объявить массив вот так
    Код (C++):
    #define ARRLEN 50
    byte arrayList[ARRLEN];
    и везде где нужен размер этого массива использовать ARRLEN
     
    arkadyf нравится это.
  5. Andrey12

    Andrey12 Гик

    Передавай в функцию вторым параметром размер массива, так как я правильно понимаю до передачи в функцию ты его определить можешь.

    Вызываю так
    Код (C++):
    fMenuListDrawP(gMenuItem_0, charArraySize(gMenuItem_0));
    Макрос charArraySize
    Код (C++):
    #define charArraySize(charArray) (sizeof(charArray)/sizeof(charArray[0]))
    Функция такая
    Код (C++):
    //# рисуем меню список из progmem
    void fMenuListDrawP(const char* const* aMenuList, const uint8_t aMenuSize) {
        for (uint8_t i = 0; i < aMenuSize; i++)
        {
            <код>
        }
    } // fMenuListDrawP(const char* const* aMenuList, const uint8_t aMenuSize)
     
    akl и arkadyf нравится это.
  6. parovoZZ

    parovoZZ Гуру