Размер массива из отдельного файла

Доброго времени суток!

У меня такой интересный вопросикс появился, как корректно прочесть размер массива из отдельного файла? Я написал функцию для вывода строк из массива на дисплей и обнаружил проблему, что int size = sizeof(array)/sizeof(array[0]); или int size = sizeof(array); всегда выводят 2. Если посавить int size = 8, то при выводе массива без дополнительных пропусков в виде "", "Текст", "", , массивы будут налезать на друг друга, и будут выводить что-то подобное. Я не могу предположить, с чем это может быть связано.

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

Вот код скетча:

#define MAX_PAGE 4

#include "TestPages.h"

#include <EncButton.h>
#include <GyverOLED.h>

EncButton eb(6, 5, 7);
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;

int page = 0;

void setup() {
  Serial.begin(9600);

  oled.init();
  Wire.setClock(400000L);

  printPage(page_0);
  Serial.println();  
}

void loop() {
  if (eb.tick()) {
    if (eb.right()) page++;
    else if (eb.left()) page--;

    if (page > MAX_PAGE) page=MAX_PAGE;
    else if (page < 0) page=0;

    switch (page) {
      case 0:
        printPage(page_0);
        break;
      case 1:
        printPage(page_1);
        break;
      case 2:
        printPage(page_2);
        break;
      case 3:
        printPage(page_3);
        break;
      case 4:
        printPage(page_4);
        break;
    }  
  }
}

void printPage(const char* array[]) {
  oled.clear();
  oled.home();

  int size = sizeof(array);  // выводит 2
  for (int i = 0; i < size; i++) {
    oled.println(array[i]);
  }
  oled.home();
  oled.println(size);
}

Файл TestPages:

const char* page_0[] = {
  "*----",
  "Тест Тест Тест",
  "Тест.",
};

const char* const page_1[] = {
  "-*---",
  "English ABC",
  "",
  "Aa Bb Cc Dd Ee Ff Gg",
  "Hh Ii Jj Kk Ll Mm Nn",
  "Oo Pp Qq Rr Ss Tt Uu",
  "Vv Ww Xx Yy Zz"
};

const char* page_2[] = {
  "--*--",
  "Русский алфавит",
  "",
  "Аа Бб Вв Гг Дд Ее Ёё",
  "Жж Зз Ии Йй Кк Лл Мм",
  "Нн Оо Пп Рр Сс Тт Уу",
  "Фф Хх Цц Чч Шш Щщ Ъъ",
  "Ыы Ьь Ээ Юю Яя",
};

const char* page_3[] {
  "---*-",
  "Спец символы",
  "",
  "0 1 2 3 4 5 6 7 8 9",
  "! ? . , / | @ # $ `",
  "% ^ & * ( ) [ ] { }",
  ": ; ' < > + - = _ ~",
};

const char* page_4[] {
  "----*",
  "Максимальное кол-во",
  "символов на строкеееее",
  "0123456789012345678901",
  "______________________",
  "----------------------",
  "абеме, абоба, абеме, а",
};

Буду очень благодарен вашей помощи!

Неправда! Зачем обманывать? Вы думаете, этим поможете решить проблему?

Если массив описан как

То

sizeof(page_0[0])=2
sizeof(page_0)=6

А вовсе не всё 2.

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

В первую очередь с тем, что Вы крайне невнимательны и неаккуратны - даже не можете посмотреть что на печать выводится. Программирование такого подхода не прощает. Будьте внимательнее и педантичнее.

1 лайк

Обращаясь к определённому массиву, его вес выведется корректно, это да, но почему тогда sizeof(array) в функции мне выводит 2 находясь на page_0, если заменив array на этот же page_0 у меня выводится 6?

Если посмотреть на изображение, приложенное в текске за словом “подобное”, можно будет увидеть дисплкей, в углу которого написана цифра, так вот, это размер массива. На фото я установил размер int size = 8, если поставить поставить sizeof(page_0), то будет 6, но если поставлю sizeof(array), то выведется 2, хоть сейчас и выводится page_0, размер которого 6. В этом у меня и заключается вопрос, почему в функции размер массива, не важно какой, выводит всегда 2.

переведи…

@werax , вы разницу между массивом символов и массивом указателей понимаете?

Потому, что Ваш array в функции описан как const char* array[] - это просто указатель. Его размер всегда 2 и никакого отношения к размеру массива page_0 не имеет от слова совсем.

Передавайте функции размер массива отдельным (ещё одним) параметром.

1 лайк

Если речь про вывод sizeof(array) в этой функции - то тут вы печатаете не размер массива, а размер указателя на него. Размер любого указателя всегда равен 2 (на 8битных МК)
При передаче массива внутрь функции информация о его размере теряется. Попробуйте передавать в функцию не только массив, но и его размер отдельным параметром.

Хорошо, теперь понял

оххх … тщательнее надо, аккуратнее …

1 лайк

А вообще эти массивы вызывают у меня тошноту…
Формально они, наверно, ничего не нарушают… но по сути массив - это набор элементов РАВНОГО РАЗМЕРА.
Этот код выглядит, как минимум, неряшливо… Думаю это не последняя проблема, с которой вы столкнетесь.

ага, поправил…
Мой всегдашний косяк

Если код выглядит неряшливо, то как его сделать аккуратнее? Какие правила нужно вообще соблюдать при написании кода?

Дорожные.

1 лайк

Форум не может, да и не должен заменять учебник.

моя жизнь - мои правила )))

1 лайк