Вопрос к гуру. Надо написать функцию вывода на экран картинок. Задаем в роли аргумента функции имя массива данных картинки, вызываем функцию - и любуемся. Код вывода нормально работает, но он не функция. Вот пример картинки и работающий код вывода именно этой картинки. Как-то мне не даются пойнтеры...))) Код (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( имя картинки); // Команда вывода произвольной картинки С уважением.
Я не понимаю, что такое Если надо передавать массив, то это делается двумя способами: либо как указатель на элемент (тогда длину надо передавать отдельно); либо, если длина известна во время компиляции, то можно просто типом параметра указать массив определённой длины. В последнем случае физически передастся всё равно указатель, но есть синтаксические вкусняшки, вроде работающего sizeof и более жёсткого контроля типов.
Код (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); адресует что-то не то. Прога работает дальше без ошибок.
А затем ))) Если работает - значит надо. Все оказалось -проще чем казалось. Вот картинки - Код (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); Тема исчерпана.
Лучше написали бы две строчки кода, в которых "тонкость" синтаксиса. Оно и короче в буквах чем бла-бла. Я бы съэкономил день времени.
То, что имя массива является указателем на первый элемент этого же массива - это не тонкость синтаксиса, а особенность языка. И такие вещи надо изучить, а то завтра операнд присвоения будем считать тонкостью синтаксиса.
Когда-то я пытался Вам помочь, в ответ получил хамство. Сейчас (сам не знаю с какого бодуна) попытался ещё раз. Получил тоже самое. Обещаю впредь не беспокоить Вас своими бла-бла.
Оффтоп. Для тех у кого мозги есть, а не набор инструкций в голове. Когда-то я спросил одного начальника, который считал всех дураками: "Имярек, коль все кругом дураки, не хотел бы ты себе в подчинение десяток таких умных, как ты?" "Нет, не надо!" - немедленно ответил, чуть ли не закричал, он. @Ariadna-on-Line - последний работающий DIY-щик на этом форуме. Пора его погубить, не так ли?
выше же сам писал: т.е. вместо адреса первого элемента массива, ты взял адрес указателя на этот массив. Разумеется, что лежать он может в случайном месте и потому вывод по нему такой же случайный.
Понятно. Но при чем здесь именно &frame ? Ошибка была в вызове функции, а не в самой функции (хотя там тоже ошибка). ПС. Всех с Праздником Пасхи ! Христос Воскрес !
ошибка была в том, что массив был описан в типе байт, а в функцию передавали указатель на инт Надеюсь что это была просто описка, потому как после стольких лет на форуме делать такие ошибки всерьез стыдно
Не стыдно. Моя - электронщик, не программист. Указатели вот только щас понадобились. Местные гуру, вместо того чтобы нарисовать строчку кода длиной 10 букв - разводят антимонии на пол-страницы... Нашел решение в конце-концов сам без чьей-то помощи. Выложил рабочий код, авось кому поможет. Jedem das Seine
Вот это что-ли? Это не решение. Это подбор костыля методом тыка. Реальное решение значительно проще, хотя приведённый костыль "тоже работает".