РЕШЕНО Массив как параметр функции. синтаксис.

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 3 май 2024.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вопрос к гуру. Надо написать функцию вывода на экран картинок. Задаем в роли аргумента функции имя массива данных картинки, вызываем функцию - и любуемся. Код вывода нормально работает, но он не функция. Вот пример картинки и работающий код вывода именно этой картинки. Как-то мне не даются пойнтеры...)))
    Код (C++):

    const uint8_t smile_B[] PROGMEM = {0x00, 0x66, 0x66, 0x00, 0x00, 0x81, 0x42, 0x3c};
    const uint8_t clock_B[] PROGMEM = {0x3c, 0x52, 0x91, 0x91, 0x8f, 0x81, 0x42, 0x3c}; // Циферблат стрелочных часов
    //----------------------------------------------
    void max7219_showBitmap( ???? ) {     // Тут надо как-то принять имя картинки

        for (uint8_t x = 0; x <= 7; x++)  {
        uint8_t datas = pgm_read_byte(&clock_B[x]);   //  !!!!!!??????
        max7219_word(x+1, datas, num);
        }
    }
    //----------------------------------------------
    void setup ()  {

          max7219_showBitmap( имя картинки);      // Команда вывода произвольной картинки
     
    С уважением.
     
    Последнее редактирование: 4 май 2024
  2. Asper Daffy

    Asper Daffy Иксперд

    Я не понимаю, что такое
    Если надо передавать массив, то это делается двумя способами: либо как указатель на элемент (тогда длину надо передавать отдельно); либо, если длина известна во время компиляции, то можно просто типом параметра указать массив определённой длины. В последнем случае физически передастся всё равно указатель, но есть синтаксические вкусняшки, вроде работающего sizeof и более жёсткого контроля типов.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Код (C++):
    const uint8_t clock_B[] PROGMEM = {0x3c, 0x52, 0x91, 0x91, 0x8f, 0x81, 0x42, 0x3c};
    //----------------------------------------------------------------------------------
    void max7219_showBitmap(int *frame, uint8_t num) {

        for (uint8_t x = 0; x <= 7; x++)  {
        uint8_t datas = pgm_read_byte(&frame + x);
        max7219_word(x+1, datas, num);
      }
    }
    Вот методом проб и ошибок нашел код функции, и код вызова функции, которые компилируются.
    Код (C++):
      max7219_showBitmap(*clock_B, num);
    Но выходит не картинка, а случайные наборы точек. Видимо -
    uint8_t datas = pgm_read_byte(&frame + x);
    адресует что-то не то. Прога работает дальше без ошибок.
     
    Последнее редактирование: 3 май 2024
  4. parovoZZ

    parovoZZ Гуру

    это адрес указателя? А зачем?
     
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    А затем ))) Если работает - значит надо.

    Все оказалось -проще чем казалось. Вот картинки -
    Код (C++):
    const uint8_t clock_B[] PROGMEM = {0x3c, 0x52, 0x91, 0x91, 0x8f, 0x81, 0x42, 0x3c};
    const uint8_t smile_B[] PROGMEM = {0x00, 0x66, 0x66, 0x00, 0x00, 0x81, 0x42, 0x3c};
     
    Вот функция вывода картинки
    Код (C++):
    //----------------------------------------------------------
    void max7219_showBitmap(uint8_t *frame, uint8_t num) {     // Вот и всё что требовалось.

        for (uint8_t x = 0; x <= 7; x++)  {
        uint8_t datas = pgm_read_byte(&frame[x]);
        max7219_word(x+1, datas, num);
      }
    }
    //----------------------------------------------------------
    Вот вызовы функции с передачей имен картинок
    Код (C++):
        max7219_showBitmap(clock_B, num);    //  Вот и все что требовалось !!!
        delay(4000);
        max7219_showBitmap(smile_B, num);
        delay(4000);    
    Тема исчерпана.
     
    Последнее редактирование: 4 май 2024
  6. parovoZZ

    parovoZZ Гуру

    тебе же писали
     
    Andrey12 и Sergku нравится это.
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Лучше написали бы две строчки кода, в которых "тонкость" синтаксиса. Оно и короче в буквах чем бла-бла. Я бы съэкономил день времени.
     
    Последнее редактирование: 4 май 2024
  8. parovoZZ

    parovoZZ Гуру

    То, что имя массива является указателем на первый элемент этого же массива - это не тонкость синтаксиса, а особенность языка. И такие вещи надо изучить, а то завтра операнд присвоения будем считать тонкостью синтаксиса.
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Когда-то я пытался Вам помочь, в ответ получил хамство. Сейчас (сам не знаю с какого бодуна) попытался ещё раз. Получил тоже самое. Обещаю впредь не беспокоить Вас своими бла-бла.
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Это адресовано не вам, а Паровозу. В остальном - как вам будет угодно.
     
  11. ИгорьК

    ИгорьК Гуру

    Оффтоп. Для тех у кого мозги есть, а не набор инструкций в голове.

    Когда-то я спросил одного начальника, который считал всех дураками:
    "Имярек, коль все кругом дураки, не хотел бы ты себе в подчинение десяток таких умных, как ты?"
    "Нет, не надо!" - немедленно ответил, чуть ли не закричал, он.

    @Ariadna-on-Line - последний работающий DIY-щик на этом форуме. Пора его погубить, не так ли?
     
  12. parovoZZ

    parovoZZ Гуру

    выше же сам писал:
    т.е. вместо адреса первого элемента массива, ты взял адрес указателя на этот массив. Разумеется, что лежать он может в случайном месте и потому вывод по нему такой же случайный.
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Понятно. Но при чем здесь именно &frame ? Ошибка была в вызове функции, а не в самой функции (хотя там тоже ошибка).
    ПС. Всех с Праздником Пасхи ! Христос Воскрес !
     
    Последнее редактирование: 5 май 2024
    ИгорьК нравится это.
  14. b707

    b707 Гуру

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

    Надеюсь что это была просто описка, потому как после стольких лет на форуме делать такие ошибки всерьез стыдно :)
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не стыдно. Моя - электронщик, не программист. Указатели вот только щас понадобились. Местные гуру, вместо того чтобы нарисовать строчку кода длиной 10 букв - разводят антимонии на пол-страницы... Нашел решение в конце-концов сам без чьей-то помощи. Выложил рабочий код, авось кому поможет.
    Jedem das Seine
     
    Последнее редактирование: 7 май 2024
  16. parovoZZ

    parovoZZ Гуру

    На сях указатели - это первое, что надо изучить. Без них на сях вообще никак.
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну в общем готово. Даже оказалось легче трехпроводки.
    Попов Воскресе !!! С днем Радио ! 73 ! 88 !
     

    Вложения:

    Последнее редактирование: 7 май 2024
  18. Asper Daffy

    Asper Daffy Иксперд

    Вот это что-ли?

    Это не решение. Это подбор костыля методом тыка. Реальное решение значительно проще, хотя приведённый костыль "тоже работает".